این مطلب قسمت دهم و آخر از آموزش جامع اینترنت اشیا با آردوینو است. در آموزشهای قبل سختافزارهای مورد نیاز شامل انواع سنسورها، عملگرها، وسایل ارتباطی و ماژولهای مختلفی که برای انجام یک پروژه اینترنت اشیا نیاز است را معرفی کرده و با هم راهاندازی کردیم. تا اینجا بیشتر در مورد ارتباطات محلی بین تجهیزات مختلف صحبت کردیم. اما اگر بخواهیم اینترنت اشیا را به معنای واقعی آن پیادهسازی کنیم، باید بتوانیم ارتباطات بین اشیا را در فواصل بلند و از طریق شبکه جهانی برقرار کنیم. در اینترنت اشیا هدف این است که بدون دخالت انسان، سنسورها مقادیر را اندازه گرفته، بررسی کرده و پیام یا دستور مناسب به انسانها یا به دستگاه دیگری برای انجام کار خاصی ارسال شود. به این ترتیب کارها به صورت خودکار انجام شده و بسیاری از هزینهها و فعالیتهای غیر ضروری کاهش پیدا میکند. این ایده را میتوان برای هوشمندسازی خانه، در صنعت، کشاورزی، سیستمهای نظارتی و بسیاری از موارد دیگر به کار برد.
قطعات مورد نیاز
معرفی بستر اینترنت اشیای ThingSpeak
یکی از ایدههای اصلی در اینترنت اشیا ارسال دادههای سنسورها به اینترنت یا ارسال داده از طریق اینترنت به ماژولهاست. برای اینکه بتوانیم از اینترنت به عنوان بستر دریافت و ارسال داده استفاده کنیم نیاز به یک سرور برای ثبت دادهها خواهیم داشت. در حال حاضر سرویسهای زیادی خدمات اینترنت اشیا را در اختیار میگذارند. بعضی از این سرویسها رایگان و بعضی با پرداخت هزینه در اختیار کاربران قرار میگیرد.
یکی از سرویسهای بسیار محبوب خدمات اینترنت اشیا سایت ThingSpeak است که یک اشتراک رایگان به همراه خدمات متنوعی را به شما میدهد. این سایت متعلق به شرکت بزرگ MathWorks است و به همین دلیل بسیاری از قابلیتهای نرمافزار MATLAB در آن گنجانده شده و به صورت رایگان قابل استفاده است. در ادامه در مورد بخشهای مختلف این سرویس و نحوه استفاده از آن صحبت خواهیم کرد.
اولین قدم در استفاده از سایت ThingSpeak ورود به حساب کاربری آن است. برای ورود باید یک حساب کاربری متلب داشته باشید. اگر حساب متلب ندارید بر روی کلید Sign Up کلیک کرده و یک حساب جدید بسازید.
پس از وارد شدن به حساب کاربری، یک پنل در اختیار شما قرار میگیرد. مهمترین بخش ThingSpeak کانال (Channel) های آن است. برای ساختن کانال جدید بر روی New Channel کلیک کنید. در این قسمت میتوانید نام و مشخصات کانال را وارد کنید. همان طور که میبینید هر کانال حداکثر ٨ جریان داده را میتواند در خود نگه دارد. سایر مشخصات کانال که میتوانید وارد کنید شامل توضیحات، لینک به سایتهای دیگر، مختصات جغرافیایی و غیره میشود. پس از ذخیره تغییرات، کانال جدید را در لیست کانالها میبینید.
بر روی کانال جدید کلیک کنید. مجموعهای از امکانات مختلف در اختیار شما قرار میگیرد. در بالای این قسمت موردی به نام Channel ID را مشاهده میکنید. این عبارت، کد مشخصه کانال بوده و بعدا در کدهایتان از آن استفاده خواهید کرد. ThingSpeak کانال شما را با این کد میشناسد.
وارد بخش API Keys شوید. در این بخش دو کد شامل Write API Key و Read API Key وجود دارد. کد اول برای افزودن داده به کانال و کد دوم برای خواندن اطلاعات کانال مورد نیاز است.
در ThingSpeak میتوانید کانالتان را خصوصی یا عمومی کنید. کانال خصوصی فقط برای خودتان با داشتن کدهای فوق قابل دسترسی است اما کانال عمومی برای هر کسی قابل استفاده است. اگر میخواهید کانالتان حالت عمومی داشته باشد، وارد بخش Sharing شده و وضعیت آن را تغییر دهید.
ارسال داده به سرور ThingSpeak
برای ساختن یک پروژه اینترنت اشیا نیاز به سختافزاری داریم که بتواند با شبکه اینترنت ارتباط برقرار کند. در آموزشهای قبل روشهای مختلفی برای اتصال به شبکه معرفی شد. در این بین یکی از بهترین ابزارها NodeMCU است که مزیتهای فراوانی در این زمینه دارد. NodeMCU را میتوان دقیقا مثل آردوینو کدنویسی و آپلود کرد؛ سختافزار قوی و وجود کتابخانههای خوب از جمله مزایای این برد توسعهای است. قبلا شروع کار با NodeMCU را در آموزش ماژولهای وایرلس با آردوینو یاد گرفتید. برای استفاده از NodeMCU باید برد esp8266 را در قسمت board manager آردوینو نصب کرده و نیز کتابخانه ESP6288WiFi را اضافه کنید.
در نرمافزار آردوینو بر روی File→Preferences کلیک کرده و در قسمت Additional Borads Manager آدرس زیر را وارد کرده و OK را بزنید.
سپس از قسمت Tools→Board→Boards Manager عبارت esp8266 را جستجو کرده و کتابخانه مورد نظر را نصب کنید.
سپس کتابخانه ESP8266WiFi را به آردوینو اضافه کنید. این کتابخانه را میتوانید از لینک زیر نیز دانلود کنید.
در آخر از قسمت Tools→Board برد NodeMCU 1.0 را انتخاب کنید.
برای اطمینان از اینکه سیستم به خوبی عمل میکند در این قسمت میخواهیم یک داده تصادفی را به ThingSpeak بفرستیم. به این ترتیب هم اتصال ماژول به روتر و هم ارتباط آن با ThingSpeak چک میشود. برای استفاده از ThingSpeak در آردوینو به کتابخانه آن نیاز خواهید داشت.
برنامه زیر را بر روی برد آپلود کنید:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
// WiFi
const char *netName = "SanatBazzar";
const char *netPassword = "xxxxxxxxx";
bool wifiState = 0;
WiFiClient myClient;
// ThingSpeak
#define channelID 701131
const int field1 = 1;
const char *writeAPIkey = "xxxxxxxxxxxxxxxx";
void wifiStatusCheck()
{
while ((WiFi.status() == WL_CONNECTED) && wifiState == 0)
{
Serial.println("Connected!");
wifiState = 1;
}
while ((WiFi.status() == WL_DISCONNECTED) && wifiState == 1)
{
Serial.println("Disconnected!");
wifiState = 0;
}
}
void thingSpeakCheck(int sentData)
{
if (sentData == 200)
{
Serial.println("Channel updated successful.");
}
else
{
Serial.println("Problem updating channel.");
}
}
void setup()
{
Serial.begin(115200);
ThingSpeak.begin(myClient);
WiFi.mode(WIFI_STA);
WiFi.begin(netName, netPassword);
delay(4000);
Serial.println("");
Serial.println("Connecting to network... ");
Serial.println("");
}
void loop()
{
delay(2000);
wifiStatusCheck();
if (wifiState)
{
int value = random(20, 40);
int sentData = ThingSpeak.writeField(channelID, field1, value, writeAPIkey);
thingSpeakCheck(sentData);
delay(20000);
}
else
Serial.println("Could not connect to network");
}
در ابتدای برنامه کتابخانههای وایفای و ThingSpeak را اضافه میکنیم:
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
نام و رمز عبور روتر اینترنت را در این قسمت وارد کنید. همچنین یک Client اینترنت بسازید. این Client را برای ارتباط با ThingSpeak نیاز خواهید داشت:
const char *netName = "SanatBazzar";
const char *netPassword = "xxxxxxxxx";
bool wifiState = 0;
WiFiClient myClient;
کد ID مربوط به کانال ThingSpeak به همراه کد Write API Key آن را در این قسمت وارد کنید:
#define channelID 701131
const int field1 = 1;
const char *writeAPIkey = "xxxxxxxxxxxxxxxx";
تابع()wifiStatusCheckوضعیت اتصال به اینترنت را چک کرده و هر زمان که به شبکه وصل یا از آن قطع شوید به شما اطلاع میدهد:
void wifiStatusCheck()
{
while ((WiFi.status() == WL_CONNECTED) && wifiState == 0)
{
Serial.println("Connected!");
wifiState = 1;
}
while ((WiFi.status() == WL_DISCONNECTED) && wifiState == 1)
{
Serial.println("Disconnected!");
wifiState = 0;
}
}
در صورتی که دادهای که به ThingSpeak از طریق کتابخانه آن میفرستید با موفقیت ارسال شود، عدد ٢٠٠ برگردانده خواهد شد. بر همین اساس تابع()thingSpeakCheckصحت ارسال دادهها را بررسی کرده و به شما اطلاع میدهد:
void thingSpeakCheck(int sentData)
{
if (sentData == 200)
{
Serial.println("Channel updated successful.");
}
else
{
Serial.println("Problem updating channel.");
}
}
در حلقه setup سریال مانیتور را با همان سرعت پیشفرض ماژول NodeMCU یعنی ۱۱۵۲۰۰ راهاندازی کردهایم. در ادامه ThingSpeak و WiFi را راهاندازی میکنیم. ممکن است ماژول در حالت پیشفرض در وضعیت Access Point یا Access Point+Station قرار داشته باشد. در این صورت ممکن است ماژول وایفای برای سایر دستگاههای متصل به شبکه مشکل ایجاد کند. به همین دلیل در این قسمت ماژول را در وضعیت Station قرار میدهیم.
Serial.begin(115200);
ThingSpeak.begin(myClient);
WiFi.mode(WIFI_STA);
WiFi.begin(netName, netPassword);
delay(4000);
Serial.println("");
Serial.println("Connecting to network... ");
Serial.println("");
در حلقه loop اتصال ماژول به شبکه بررسی شده و در صورت تایید اتصال، داده مورد نظر که یک عدد تصادفی است به سرور ThingSpeak ارسال میشود. داده تصادفی توسط تابع(random(min,maxبین دو مقدار min و max تولید میشود. برای نوشتن یک مقدار در بخشهای یک کانال در thingSpeak از تابع()writeFieldاستفاده میشود.
delay(2000);
wifiStatusCheck();
if (wifiState)
{
int value = random(20, 40);
int sentData = ThingSpeak.writeField(channelID, field1, value, writeAPIkey);
thingSpeakCheck(sentData);
delay(20000);
}
else
Serial.println("Could not connect to network");
ارسال داده سنسورها از طریق اینترنت
به عنوان یک پروژه واقعی اینترنت اشیا در این قسمت میخواهیم یک سنسور DHT11 را به برد وصل کرده و دادههای لحظهای دما و رطوبت را به سرور ThingSpeak بفرستیم. به این صورت فقط با داشتن یک ارتباط با اینترنت میتوانید دما و رطوبت یا هر متغیر فیزیکی دیگری را از راه دور نظارت کنید. برای مثال این متغیرها میتوانند دما و رطوبت گلخانه هوشمند شما باشند.
یک ماژول DHT11 را به صورت زیر به برد NodeMCU وصل کنید. اگر میخواهید در مورد سنسورهای دما و رطوبت بیشتر بدانید میتوانید آموزش راهاندازی انواع سنسورهای دما و رطوبت با آردوینو را مطالعه کنید.
برنامه زیر را بر روی برد آپلود کنید:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <dht.h>
// Sensor
#define sensorPin D4
dht DHT;
// WiFi
const char *netName = "SanatBazzar";
const char *netPassword = "xxxxxxxx";
bool wifiState = 0;
WiFiClient myClient;
// ThingSpeak
#define channelID 701131
const int field1 = 1;
const int field2 = 2;
const char *writeAPIkey = "xxxxxxxxxxxxxxxx";
void wifiStatusCheck()
{
while ((WiFi.status() == WL_CONNECTED) && wifiState == 0)
{
Serial.println("Connected!");
wifiState = 1;
}
while ((WiFi.status() == WL_DISCONNECTED) && wifiState == 1)
{
Serial.println("Disconnected!");
wifiState = 0;
}
}
void thingSpeakCheck(int sentData)
{
if ((sentData == 200))
{
Serial.println("Channel update successful.");
}
else
{
Serial.println("Problem updating channel.");
}
}
void setup()
{
Serial.begin(115200);
ThingSpeak.begin(myClient);
WiFi.mode(WIFI_STA);
WiFi.begin(netName, netPassword);
delay(4000);
Serial.println("");
Serial.println("Connecting... ");
Serial.println("");
}
void loop()
{
delay(2000);
DHT.read11(sensorPin);
wifiStatusCheck();
float temp = DHT.temperature;
float hum = DHT.humidity;
Serial.print(temp);
Serial.print(" --- ");
Serial.println(hum);
if (wifiState)
{
ThingSpeak.setField(field1, temp);
ThingSpeak.setField(field2, hum);
int sentData = ThingSpeak.writeFields(channelID, writeAPIkey);
thingSpeakCheck(sentData);
delay(20000);
}
else
Serial.println("Could not connect to network");
}
در ابتدای برنامه کتابخانههای مورد نیاز را فراخوانی کرده و سنسور دما را تعریف کنید:
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <dht.h>
// Sensor
#define sensorPin D4
dht DHT;
از آنجا که در این برنامه میخواهیم دو متغیر دما و رطوبت را ثبت کنیم، دو بخش از کانال ThingSpeak را تعریف میکنیم:
#define channelID 701131
const int field1 = 1;
const int field2 = 2;
const char *writeAPIkey = "xxxxxxxxxxxxxxxx";
در حلقه loop مقادیر دما و رطوبت را از سنسور میخوانیم:
DHT.read11(sensorPin);
wifiStatusCheck();
float temp = DHT.temperature;
float hum = DHT.humidity;
مهمترین تفاوت این برنامه با برنامه قبل در این قسمت است. اگر بخواهید چند داده را به ThingSpeak بفرستید باید از تابع()writeFieldsاستفاده کنید. قبل از فراخوانی این تابع لازم است تا به کمک تابع()setFieldمقدار هر بخش را تعیین کنیم. پس از تعیین تمام مقادیر، دستور ()writeFields مقادیر جدید را به سرور میفرستد. تاخیر ٢٠ ثانیهای به این دلیل است که سرور ThingSpeak اجازه ارسال داده جدید را هر ١۵ ثانیه یک بار میدهد.
if (wifiState)
{
ThingSpeak.setField(field1, temp);
ThingSpeak.setField(field2, hum);
int sentData = ThingSpeak.writeFields(channelID, writeAPIkey);
thingSpeakCheck(sentData);
delay(20000);
}
else
Serial.println("Could not connect to network");
دریافت داده سنسورها از طریق اینترنت
تا اینجا توانستیم دادههایی که در نظر داریم را به اینترنت یا اگر بخواهیم دقیقتر بگوییم، بر روی فضای ابری (Cloud) بفرستیم. آیا کار اینترنت اشیا به همین جا ختم میشود؟ اصلا! این تازه شروع ماجراست. قدم بعدی در اینترنت اشیا این است که بتوانیم دادههای موجود بر روی فضای ابری را بخوانیم. این کار با استفاده از ابزارهایی که معرفی کردیم یعنی NodeMCU و ThingSpeak به راحتی انجام میشود. برای امتحان کردن این موضوع میتوانید یک پروژه جالب را انجام بدهید؛ به این صورت که یک برد NodeMCU را به سنسور دما وصل کرده و دمای محیط را به سرور بفرستید. سپس با استفاده از یک برد NodeMCU دیگر به اینترنت وصل شده و دادههای ثبت شده در ThingSpeak را بخوانید. همان طور که قبلا نیز اشاره شد برای خواندن دادهها از کانال، Read API Key را نیاز خواهید داشت که باید آن را از روی سایت ببینید. برنامهای که قبلا برای ارسال داده دما نوشتید بدون تغییر میماند. بر روی برد دوم برنامه زیر را آپلود کنید:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
// WiFi
const char *netName = "SanatBazzar";
const char *netPassword = "xxxxxxxx";
bool wifiState = 0;
WiFiClient myClient;
// ThingSpeak
#define channelID 701131
const int readField = 1;
const char *readAPIkey = "xxxxxxxxxxxxxxxx";
void wifiStatusCheck()
{
while ((WiFi.status() == WL_CONNECTED) && wifiState == 0)
{
Serial.println("Connected!");
wifiState = 1;
}
while ((WiFi.status() == WL_DISCONNECTED) && wifiState == 1)
{
Serial.println("Disconnected!");
wifiState = 0;
}
}
void thingSpeakCheck()
{
int readStatus = ThingSpeak.getLastReadStatus();
if ((readStatus == 200))
{
Serial.println("Channel read successful.");
}
else
{
Serial.println("Problem reading channel.");
}
}
void setup()
{
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(netName, netPassword);
delay(4000);
ThingSpeak.begin(myClient);
Serial.println("");
Serial.println("Connecting... ");
Serial.println("");
}
void loop()
{
delay(2000);
wifiStatusCheck();
if (wifiState)
{
int readData = ThingSpeak.readIntField(channelID, readField, readAPIkey);
thingSpeakCheck();
Serial.println(readData);
delay(5000);
}
else
Serial.println("Could not connect to network");
}
در این برنامه بیشتر موارد مانند برنامه ارسال داده است. فقط چند مورد را باید تغییر دهید. اول اینکه باید API Key را از حالت نوشتن به حالت خواندن تغییر دهید:
#define channelID 701131
const int readField = 1;
const char *readAPIkey = "xxxxxxxxxxxxxxxx";
مورد دیگر اینکه برای خواندن داده از سرور ThingSpeak بسته به نوع دادهتان از یکی از دستورهای زیر استفاده میشود:
ThingSpeak.readIntField()
ThingSpeak.readStringField()
ThingSpeak.readFloatField()
ThingSpeak.readLongField()
در اینجا داده دما به صورت Integer خوانده شده و در سریال مانیتور نمایش داده میشود:
int readData = ThingSpeak.readIntField(channelID, readField, readAPIkey);
در صورتی که کانال شما عمومی (Public) است نیازی به وارد کردن API Key در این قسمت نیست.
ارتباط تلفن همراه به اینترنت اشیا
شاید اینکه همیشه بخواهید با استفاده از ماژولها به اینترنت اشیا متصل شوید مد نظرتان نباشد. استفاده از یک رابط کاربری جذاب و به کاربردن ابزارهایی که معمولا در دسترس هستند مثل گوشی تلفن همراه، میتواند یک پروژه را کاربردیتر و جذابتر کند. قبلا هم از تلفن همراه برای انجام پروژهها مثلا در آموزش کار با ماژول بلوتوث به کمک آردوینو استفاده کردیم. در این قسمت میخواهیم با استفاده از گوشی موبایل اطلاعات ذخیره شده در فضای ابری ThingSpeak در قسمت قبل را بخوانیم.
دقت کنید که گوشی تلفن همراه شما باید به اینترنت متصل باشد
اگر میخواهید پروژههای حرفهای اینترنت اشیا را به صورت شخصیسازی شده برای خودتان انجام دهید باید به مفاهیمی مثل HTTP ، مدیریت شبکه، ساختمان داده، پایگاه داده و خیلی مباحث دیگر مسلط باشید. ممکن است نیاز داشته باشید زبانهای برنامهنویسی وب را بشناسید، بتوانید سرور شخصی خودتان را ایجاد کنید یا بتوانید برای تلفن همراه برنامه بنویسید. تمام این موارد کمک میکند تا بتوانید کارهای قویتری انجام دهید. شرح تمام این مطالب فراتر از محدوده این آموزش است اما اشاره مختصری به برخی مفاهیم مورد نیاز خواهیم کرد.
HTTP
HTTP یا Hypertext Transfer Protocol یک پروتکل ارتباطی است که ارتباط بین Server و Client طبق آن صورت میگیرد. Server کامپیوتری است که پایگاه داده بر روی آن قرار دارد و Client میتواند یک رایانه شخصی یا تلفن همراه باشد. تمام پیامها در این پروتکل، یا درخواست (request) هستند یا پاسخ (response).
در HTTP دو متد اصلی برای ارتباط بین Server و Client به نام GET و POST وجود دارد. در متد GET یک آدرس خاص از سرور درخواست میشود. در متد POST داده خاصی برای پردازش به سرور ارسال شده و سرور پاسخ مناسب را برمیگرداند.
JSON
JSON یا JavaScript Object Notation یک نحوه نگارش برای ذخیرهسازی و انتقال دادههای متنی است که در سالهای اخیر بسیار مورد توجه قرار گرفته است. هرچند که JSON بر اساس زبان برنامهنویسی جاوا اسکریپت طراحی شده اما مستقل از زبان عمل کرده و دستگاههای مختلف با هر زبانی میتوانند از آن استفاده کنند. از JSON میتوان برای ارسال درخواست HTTP به سرور و دریافت پاسخ متناسب از آن استفاده کرد.
برگردیم به پروژه خودمان! در اینجا برنامهای نوشتهایم که هر دو ثانیه یک بار اطلاعات دما و رطوبت موجود بر روی سرور ThingSpeak را خوانده و نشان میدهد. در این برنامه از متد GET برای خواندن این مقادیر استفاده شده است. برای استفاده از این متد به آدرس ذخیرهسازی دادهها بر روی سرور نیاز دارید. این آدرس (و نیز آدرسهای دیگر مثل آدرس POST) در صفحه کانالتان موجود است. زمانی که این درخواست را به ThingSpeak میفرستید، سرور یک پاسخ به صورت JSON برای شما میفرستد که باید آن را دریافت و مقادیر مورد نظرتان را از آن استخراج کنید.
برنامه را از لینک زیر دانلود کرده و بر روی تلفن همراهتان نصب کنید. حالا میتوانید دما و رطوبت را در صنعتبازار ببینید!
نتیجه گیری
در این آموزش با مفاهیم اولیه مورد نیاز برای ساخت شبکهای از وسیلههای هوشمند آشنا شدید. همچنین به کمک پلتفرم ThingSpeak و برد NodeMCU دادههای سنسورهایتان را به اینترنت فرستاده و دریافت کردید. اگر به سایت ThingSpeak سری بزنید خواهید دید که امکانات بسیار زیادی در آن وجود دارد. همان طور که قبلتر هم گفتیم ThingSpeak تنها ابزار اینترنت اشیا نیست و سرویسهای زیادی با قابلیتهای کم و بیش مشابهی برای این کار وجود دارد. کار با هر کدام که برایتان لذتبخش بود از همان سرویس استفاده کنید. البته هر زمان که در این زمینه حرفهای شدید حتما سرویس شخصی خودتان را راهاندازی کنید.
این آموزش آخرین قسمت از مجموعه آموزش جامع اینترنت اشیا با آردوینو بود. از اینجا به بعد فقط تجربه و سعی و خطا کردن حرف اول را میزند. یادتان باشد که این مجموعه فقط ذرهای از تمام مطالبی است که میتوانید در اینترنت اشیا یاد بگیرید؛ در این حوزه، یاد گرفتن دائمی اهمیت زیادی دارد.
نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.
اگر لطف کنید سورس App رو هم بگذارید خیلی خوب یا اینکه راهنمایی کنید چطور میشه برنامه خودمان را درست کنیم