به یک خانه هوشمند فکر کنید؛ مطلع شدن از بالا رفتن دمای محیط یا وقوع آتشسوزی برای شما مهم است، اما احتمالا با خودتان فکر میکنید که حالا با این اطلاعات چکار کنم؟ من کیلومترها از خانه فاصله دارم و تا زمان بازگشت، اتفاقات جبرانناپذیری افتاده است. بنابراین، توقع دارید که سیستم خانه هوشمند پس از تشخیص احتمال آتشسوزی، سیستم اطفا حریق را روشن و از خطرات احتمالی پیشگیری کند.
همانطور که در این مثال اشاره شد، نمایش اطلاعات دستگاهها در اپلیکیشنهای اینترنتی و کنترل وسایل از راه دور ایدههای جذابی هستند که از طریق مفهوم اینترنت اشیا قابل دستیابی است. اما، یک ایده باید علاوه بر جذاب بودن، کاربردی نیز باشد و یکی از کاربردیترین پروژههای اینترنت اشیا اتوماسیون تجهیزات و ارتباط بین دستگاهها با یکدیگر است. اتوماسیون مبتنی بر اینترنت اشیا در موارد متعددی از جمله خانه هوشمند، گلخانه هوشمند، ساختمان هوشمند و ... استفاده میشود.
در این آموزش از آکادمی تینگزپاد قرار است با بکارگیری ماژول NodeMCU ESP32، سنسور دما، موتور و پلتفرم اینترنت اشیا تینگزپاد یک پروژه بسیار کاربردی در زمینه اینترنت اشیا انجام دهیم. شما میتوانید به جای سنسور دما و فن موتور از قطعات دیگری نیز استفاده کنید.
در این پروژه ابتدا با استفاده از سنسور دمای DHT11، دمای محیط را اندازهگیری میکنیم و آن را از طریق داشبوردهای آنلاین پلتفرم اینترنت اشیا تینگزپاد نمایش میدهیم تا مشاهده وضعیت دما از راه دور نیز امکان پذیر باشد. سپس، با کمک موتور فن، دمای محیط را به دو روش دستی و اتوماتیک کنترل خواهیم کرد. در روش دستی میتوانیم فن را از طریق داشبورد اینترنتی خاموش و روشن کنیم و در حالت اتوماتیک، فن به صورت خودکار در دمای مورد نظر ما روشن و خاموش خواهد شد. هر دو حالت از طریق پلتفرم اینترنت اشیا تینگزپاد قابل انجام است. مراحل انجام و نتیجه نهایی را میتوانید در ویدیوی آموزشی این پروژه نیز مشاهده کنید.
برای راه اندازی این پروژه به قطعات زیر احتیاج دارید:
قبل از شروع پروژه، بهتر است با این قطعات و دلیل انتخاب آنها برای این پروژه بهتر آشنا شوید.
برای ارسال اطلاعات در بستر اینترنت نیاز است از بوردی استفاده کنید که دارای هسته وای-فای باشد. به همین دلیل است که نمیتوان از بورد آردوینو اونو (Arduino Uno) در این پروژه استفاده کرد. اما، ESP32 تراشهای است که قابلیت اتصال به شبکه وای-فای را دارد و میتوان از آن برای راهاندازی پروژههای اینترنت اشیا استفاده کرد. ماژول NodeMCU ESP32 یک بورد توسعه مخصوص ماژول وای فای ESP32 است. این ماژول شامل تراشه ESP32، پینهای ورودی و خروجی دیجیتال، تغذیه، دکمه بوت (Boot) و ریست (Reset) است. ولتاژ کاری این ماژول ۳.۳ ولت میباشد.
تصویر این ماژول و پایههای آن را میتوانید در زیر مشاهده کنید.
سنسور DHT11 نام سنسور دما و رطوبت است. این سنسور دما را در بازه ۰ تا ۵۰ درجه و رطوبت را بین ۲۰ تا ۸۰ درصد اندازه گیری میکند. این سنسور دارای چهار پایه است. دو تا از پایهها مربوط به تغذیه (۳.۳ ولت و زمین)، یکی از پایهها مربوط به داده سنسور و پایه دیگر به چیزی متصل نمیشود.
قطعه الکترونیکی L298N در دنیای الکترونیک به عنوان درایور (Driver) شناخته میشود. درایور، ابزاری الکترونیکی برای کنترل جریان و ولتاژ جهت راه اندازی یک مصرف کننده پرمصرف است. این قطعه الکترونیکی با دریافت فرمان از پردازنده اقدام به روشن کردن مصرف کننده میکند. معمولا از این قطعه برای راه اندازی موتور DC استفاده میگردد. L298 دارای ویژگیهای زیر است:
برای یادگیری استفاده از درایور باید با پینهای مختلف آن آشنا شوید.
پین VCC: این پین تغذیه موتور را تامين ميکند و مقدار ولتاژ آن میتواند بین 5 تا 35 ولت باشد.
پین GND: این پین زمين مشترک است.
پین 5V: این پین برای تامین ولتاژ مورد نیاز مدارات منطقی سوئیچینگ داخلی آی سی L298 استفاده میشود. اگر جامپر5V در محل خود قرار داشته باشد، این پین به عنوان خروجی عمل کرده و میتوان از آن برای تغذیه آردوینو استفاده کرد. در غیر این صورت، باید این پین را به پین 5V آردوینو متصل کنیم.
پین ENA: از این پین برای کنترل سرعت موتور A استفاده میشود. موتور A در صورت اعمال منطق High به این پین شروع به کار میکند و هنگام برداشتن جامپر متوقف خواهد شد. برای کنترل سرعت موتور A، باید جامپر را برداشته و پین را به ورودی PWM متصل کنیم.
پینهای IN1 و IN2: از این پینها برای کنترل جهت موتور A استفاده میشود. هنگامی که به یکی از این پینها منطق High (5 ولت) و به دیگری منطق Low (صفر ولت) اعمال شود، شافت موتور در یک جهت شروع به چرخش خواهد کرد. اما اگر به هر دوی این پینها منطق High و یا به هر دوی آنها منطق Low اعمال کنیم، موتور متوقف خواهد شد.
پینهای IN3 و IN4: از این پینها برای کنترل جهت موتور B استفاده مي شود. هنگامی که به یکی از این پینها منطق High (5 ولت) و به دیگری منطق Low (صفر ولت) اعمال شود، شافت موتور B در یک جهت شروع به چرخش خواهد کرد. اما اگر به هر دوی این پینها منطق High و یا به هر دوی آنها منطق Low اعمال کنیم، موتور متوقف خواهد شد.
پین ENB: از این پین برای کنترل سرعت موتورB استفاده میشود. اعمال منطق High به این پین باعث میشود که موتور B شروع به کار کند و برای متوقف کردن آن باید جامپر برداشته شود. برای کنترل سرعت موتور B باید جامپر را برداشته یا این پین را به ورودی PWM متصل کنیم.
پینهای خروجی OUT1 و OUT2: این پینها به موتور A متصل میشوند.
پینهای خروجی OUT3 و OUT4: این پینها به موتور B متصل میشوند.
ماژول ESP32 دارای پین هدرهایی است که میتواند روی بردبورد قرار بگیرد. پس با استفاده از فضای خالی وسط برد بورد، ماژول را روی بردبورد قرار داده و سنسور دما و رطوبت DHT11 را نیز روی بردبورد قرار دهید. پایه GND سنسور به پین زمین ماژول ESP32، پایه VCC سنسور به پین V3.3 ماژول و پایه خروجی سنسور به پین شماره 5 ماژول ESP32 وصل میشود.
حال به سراغ اتصالات درایو L298 میرویم. از خروجی Out1 و Out2 برای اتصال به فن موتور استفاده میکنیم. سپس قسمت تغذیه درایو را به باتری و یا آداپتور متصل میکنیم. برای هم پتانسیل کردن زمینهای مدار، پین منفی تغذیه درایو را به پین زمین ماژولESP32 متصل میکنیم. پینهای IN1 و IN2، پینهای کنترل دور موتور هستند که به پین 2 و پین 4 ماژول ESP32 متصل میشوند. نحوه اتصالات در تصویر زیر قابل مشاهده است:
ابتدا وارد نرمافزار Arduino IDE شوید. میتوانید این نرم افزار را از وبسایت آردوینو دانلود و نصب کنید.
برای برنامه نویسی بوردهای ESP32 باید خانواده این بوردها را به نرم افزار آردوینو اضافه کنید. برای این کار از منوی File روی گزینه Preferences کلیک کنید. در پنجره باز شده، در قسمت Additional boards manager URLs، لینک زیر را کپی کنید و پنجره را ببندید.
https://dl.espressif.com/dl/package_esp32_index.json
سپس از منوی tools به قسمت Board رفته و روی Boards manager کلیک کنید. در این قسمت ESP32 را سرچ کرده و آن را نصب کنید. پس از نصب، هستههای مربوط به خانواده ESP32 برای شما نشان داده خواهند شد و حالا میتوانید بورد خود را از قسمت Board انتخاب کنید. در این پروژه از ESP32 Dev Module استفاده شده است.
هماکنون، کتابخانههای مورد نیاز این پروژه را نصب کنید:
برای اطلاعات بیشتر در رابطه با ArduinoJson میتوانید به مستندات آن در سایت arduinojson مراجعه کنید.
(میتوانید تمامی کدهای پروژه را از گیتهاب تینگزپاد دانلود کنید.)
در ابتدا کتابخانهها را فراخوانی میکنیم.
توجه: کتابخانه AruinoJson و PubSubClient در کتابخانه تینگزپاد فراخوانی شدهاند، به همین دلیل شما آنها را در این قسمت مشاهده نمیکنید. در صورت نصب نبودن این دو کتابخانه، کد با ارور مواجه خواهد شد.
نام و رمز شبکه وای فای مورد نظر را مینویسیم.
در پلتفرم اینترنت اشیا تینگزپاد، هر دستگاه توکن (Access Token) مربوط به خودش را دارد که از آن به عنوان یک شناسه برای ارتباط بین پلتفرم و دستگاه استفاده میشود. این توکن را در این قسمت از کد وارد میکنیم (راهنمای ایجاد دستگاه و کپی کردن توکن). سپس، سرور تینگزپاد و پورت MQTT آن را نیز تعریف میکنیم.
یک object از کتابخانه WiFiClient به نام wifiClient برای استفاده از تابعهای آن ایجاد میکنیم. همچنین، برای ایجاد شی MQTT از کتابخانه PubSubClient استفاده کرده و Object وای-فای را برای ارتباط با اینترنت به آن پاس میدهیم. سپس، یک object از تینگزپاد با نام thingspod ایجاد کرده و object وای فای و MQTT را به آن پاس میدهیم.
در ادامه، پین شماره پنج ESP32 را به متغیر DHTPIN اختصاص داده و نوع DHT را DHT11 قرار میدهیم.
یک object از کتابخانه DHT ایجاد کرده و پین و نوع DHT را به این تابع اختصاص میدهیم.
متغیرهای پروژه را تعریف میکنیم و پین شماره 2 و 4 ماژول ESP32 را به fanPin1 و fanPin2 اختصاص میدهیم. همچنین، یک متغیر Boolean مربوط به وضعیت فن و یک متغیر Boolean مربوط به حالت اتوماتیک یا دستی تعریف میکنیم.
در تابع ()setup، تابع راه انداز وای فای را مینویسیم. این تابع را بعد از تابع ()setup به گونهای تعریف میکنیم که تا زمان اتصال موفق به وای فای، عبارت «.» در سریال مانیتور پرینت شود. سپس با استفاده از دستور mqttClient.setServer سرور را راهاندازی میکنیم. چون قرار است در این پروژه فن را از راه دور و از طریق پلتفرم تینگزپاد روشن و خاموش (کنترل) کنیم، باید از روش RPC استفاده کنیم. (روش RPC همان فراخوانی رویه از راه دور است). وقتی درخواست RPC از سمت سرور به دستگاه ارسال میشود، تابع mqttCallback که در دستور mqttClient.setCallback(mqttCallback) استفاده شده است، فراخوانی میشود. در ادامه راجع به تابع فراخوانی MQTT توضیح خواهیم داد. حال سنسور dht را فعال کرده و پینهای موتور را نیز به صورت خروجی تعریف میکنیم.
تابع راه انداز وای فای به این صورت است:
در این تابع، درخواستهای MQTT دریافت شده توسط دستگاه را به کتابخانه تینگزپاد ارجاع میدهیم. ورودیهای این تابع عبارتند از:
در ادامه، تابعهای فراخوانی RPC را داریم. بدنه درخواست RPC نیاز به دو مقدار دارد:
در اینجا 4 تابع فراخوانی RPC داریم. 2 تابع مربوط به کلید اتوماتیک و دستی. یکی از آنها برای ارسال مقادیر دریافتی به روی سخت افزار و دیگری برای خواندن مقادیر دریافتی از سرور میباشد. 2 تابع دیگر هم برای روش و خاموش کردن دستی موتور فن است. یکی از آنها برای ارسال مقادیر به سخت افزار و دیگری برای خواندن مقادیر از سرور میباشد.
به سراغ اولین تابع از کلید دستی یا اتوماتیک میرویم. ورودی شی setAutoStateکه برابر با رشته"setAutoState" است به عنوان Method درخواست RPC برای تغییر حالت اتومات به دستی و بر عکس در نظر گرفته میشود که باید با رشته قرار داده شده در داشبورد تینگزپاد برابر باشد. وقتی درخواست RPC با این Method صورت گیرد، تابع setAutoStateCallback با مقادیر Params که به عنوان شی RPCData تعریف شده است، فراخوانی میشود .در اینجا چون مقادیر Params به صورت Boolean مقداردهی میشوند، شی RPCData مقدار true یا false را به خود میگیرد. همچنین این مقدار را با نام Automatic Status در Attributes ذخیره میکنیم. چون این تابع برای تغییر حالت اتوماتیک و دستی میباشد، باید درون این تابع دستوری تعریف کرد که اگر کلید دستی فعال شد، فن خاموش شود و مقدار fanState در مشخصه پلتفرم آپدیت شود.
برای فراخوانی قسمت get مانند قسمت set عمل میکنیم، با این تفاوت که بدنه تابع خالی است و method فراخوانیRPC، getAutoState میباشد.
حالا به سراغ فراخوانی حالت دستی کنترل فن میپردازیم. ورودی شی setFanStateکه برابر با رشته"setFanState" است به عنوان Method درخواست RPC برای خاموش و روشن کردن فن در نظر گرفته میشود که باید با رشته قرار داده شده در داشبورد تینگزپاد برابر باشد. وقتی درخواست RPC با این Method صورت گیرد، تابع setFanStateCallback با مقادیر Params که به عنوان شی RPCData تعریف شده است، فراخوانی میشود .در اینجا چون مقادیر Params به صورت Boolean مقداردهی میشود، شی RPCData مقدار true یا false را به خود میگیرد. همچنین این مقدار را با نام fanState در Attributes ذخیره میکنیم. در صورتی که حالت کنترل اتوماتیک false بود و روی حالت دستی بودیم، این تغییرات انجام میشوند: اگر fanState، true بود فن روشن و اگر false بود، فن خاموش میشود و تمامی این وضعیتها در Attribute پلتفرم آپدیت میشوند.
برای فراخوانی قسمت get هم مانند قسمت set عمل میکنیم، با این تفاوت که در بدنه، حالت پین 2 ماژول ESP32 را میخوانیم. method فراخوانی RPC نیز getFanState میباشد.
در تابع حلقه به این صورت عمل میکنیم که اگر برنامه به وای فای وصل نشد، تابع reconnectWifi را اجرا کند (در آخر کد برنامه، این تابع تعریف شده است.). در این تابع، اگر برنامه به اینترنت وصل نشد، برای اتصال مجدد آن به وای-فای تلاش میکنیم.
در ادامه تابع حلقه زمانی که برنامه به اینترنت وصل شد، باید ببینیم که به پلتفرم تینگزپاد هم وصل میشود یا خیر. اگر به تینگزپاد وصل نشد، برنامه عبارت Failed to connect را در سریال مانیتور پرینت میکند و در صورت اتصال موفقیت آمیز، تابع mqttClientLoop از کتابخانه تینگزپاد فراخوانی میشود. این تابع، دریافت داده از طریق پروتکل MQTT را بررسی میکند.
همچنین برای دریافت درخواست RPC تعریف شده در ابتدا، تابع RPCSubscribe از کتابخانه تینگزپاد را با مقدار شیهای setAutoState، getAutoState، setFanState و getFanState فراخوانی میکنیم.
در ادامه، میخواهیم دادههای دما و رطوبت را هر دو ثانیه یکبار اندازهگیری کنیم و در سریال مانیتور نمایش دهیم. در صورت بروز خطا در خواندن دما و رطوبت، عبارت Failed to read from DHTsensor در سریال مانیتور پرینت میشود.
سپس میخواهیم برای نظارت از راه دور اینترنتی، داده دما را به پلتفرم تینگزپاد نیز ارسال کنیم. بنابراین، یک بافر جیسون (JSON) با سایز 1 ایجاد میکنیم (زیرا قرار است فقط مقدار دما را ارسال کنیم). سپس این مقادیر را به فرمت جیسون تبدیل میکنیم.
دادهها را به صورت تلهمتری بر روی پلتفرم تینگزپاد ارسال میکنیم.
در نهایت، این شرط را برای قسمت اتوماتیک قرار میدهیم که اگر autoState برابر با True بود، وارد حلقه اتوماتیک شود. در تابع حلقه کد اتوماتیک نیز دستوری را مینویسیم که اگر دما از 26 بیشتر شد، فن را روشن کرده و تا زمانی که دما به زیر 26 برسد، روشن بماند و سپس خاموش شود.
برای جزییات بیشتر این تابعها میتوانید کتابخانه تینگزپاد را مطالعه کنید.
تابع reconnectWifi() به این صورت است.
کد با موفقیت کامپایل شد. حالا برنامه را روی بورد ESP32 آپلود میکنیم.
کد کامل برنامه را میتوانید در اینجا مشاهده کنید.
اکنون به سراغ پلتفرم تینگزپاد میرویم تا از طریق پلتفرم، حالت اتوماتیک و یا دستی روشن شدن فن و همچنین، روشن و خاموش کردن فن در حالت دستی را انتخاب کنیم.
برای این کار ابتدا وارد وبسایت تینگزپاد شوید و اگر حساب کاربری ندارید، میتوانید یک حساب کاربری رایگان بسازید که از 5 دستگاه پشتیبانی میکند. سپس، وارد حساب کاربری خود شوید.
ایجاد دستگاه: اول باید یک دستگاه ایجاد کنیم. منظور از دستگاه همان سنسور دما و موتور فن است. برای این کار، وارد صفحه Device Groups شوید، یک گروه برای دستگاههای این پروژه ایجاد کرده و سپس، در این گروه یک دستگاه به نام temperatureControlبسازید. در تینگزپاد، هر دستگاه توکن (Access Token) مربوط به خودش را دارد که به عنوان یک شناسه برای ارتباط بین پلتفرم و دستگاه استفاده میشود. روی اسم دستگاه یا temperatureControl کلیک کرده و از منوی باز شده روی گزینه Copy access token کلیک کنید. همانطور که در بالا گفته شد، از این توکن در نرم افزار آردوینو استفاده میکنیم.
ایجاد داشبورد: برای ایجاد داشبورد در پلتفرم تینگزپاد، وارد صفحه گروه داشبوردها (Device Groups) میشویم، یک گروه داشبورد برای این پروژه ایجاد کرده و داخل آن یک داشبورد میسازیم. سپس، وارد صفحه این داشبورد میشویم و ویجت Switch Control را برای انتخاب حالت اتوماتیک یا دستی انتخاب میکنیم. یک مستعار (Alliance) برای دستگاه انتخاب کرده و این نام مستعار را به ویجت اضافه میکنیم. سپس در تب Advanced ویجت عنوان کلید را به auto Switch تغییر داده، سپس گزینه don’t retrieve را انتخاب کرده و در قسمت setValueو getValue هم همان متدی که در نرم افزار آردوینو وارد کرده بودیم را قرار میدهیم.
حال برای کنترل فن به روش دستی به یک کلید دیگر نیاز است. ویجت Round Switch را برای روشن و خاموش کردن فن در حالت دستی انتخاب میکنیم. یک مستعار (Alliance) برای دستگاه انتخاب کرده و این نام مستعار را به ویجت اضافه میکنیم. سپس در تب Advanced ویجت عنوان کلید را به Fan Switch تغییر داده، سپس گزینه don’t retrieve را انتخاب کرده و در قسمت setValue و getValue هم همان متدی که در نرم افزار آردوینو وارد کرده بودیم را قرار میدهیم.
اما شما میتوانید ویجتی را در پلتفرم تینگزپاد اضافه کنید که روشن و خاموش بودن فن و اتوماتیک یا دستی بودن پروژه روی آن ویجت هم قابل نمایش باشد. به این منظور از قسمت ویجتهای کنترلی LEDindicator را انتخاب کرده و نام مستعار را در ویجت قرار بدید. سپس در تب Advanced تیک گزینه perform rpc device status check را بردارید و در قسمت Value هم نام مشخصهای که در آردوینو وارد کرده بودید را وارد کنید. در اینجا fanState و autoState هستند.
در آخر نیز میخواهیم مقدار دما را روی نمودار هم مشاهده کنیم. برای اینکار از ویجتهای نموداری، نمودار سری زمانی را انتخاب میکنیم و تغییرات دما را روی آن نشان میدهیم. میتوانید در قسمت setting ویجت نام نمودار را تغییر بدهید. اگه نمیخواهید منحنی به شکل شکسته نمایش داده شود، کافی است در قسمت Advanced ویجت، گزینه display smooth رو فعال کنید.
اکنون مشاهده میکنید که با یک کردن کلید در حالت دستی داشبورد تینگزپاد، فن روشن میشود و با صفر کردن کلید، فن خاموش میشود. اما اگر پروژه روی حالت اتوماتیک باشد، مشاهده خواهید کرد که موتورفن تا زمانی که دما کمتر از 26 باشد، خاموش است و بلافاصله بعد از آن که دما بیشتر از 26 شود، روشن میشود.
ایجاد اتوماسیون همواره از مهمترین گامهای توسعه صنایع مختلف بوده است. از سیستمهای PLC تا اسکادا که عمدتا در پردازش و کنترل محلی کاربردی هستند. اما، حالا با کمک فناوری اینترنت اشیا میتوان یک قدم فراتر رفت و این اتوماسیون را در بستر اینترنت ایجاد کرد. ایجاد اتوماسیون در بستر اینترنت با کمک پلتفرم اینترنت اشیا تینگزپاد امکان ساخت داشبوردهای تعاملی و سفارشی را فراهم میکند و کاربران سیستم میتوانند از هر مکان و در هر زمان به اطلاعات دسترسی داشته باشند و در صورت لزوم، کنترل را به حالت دستی تغییر دهند.
البته، سنسور دما و موتور فن به عنوان یک مثال ساده در این پروژه استفاده شدهاند و شما میتوانید همین پروژه را با قطعات مختلف انجام دهید و آنها را از طریق اینترنت در پلتفرم اینترنت اشیا تینگزپاد کنترل کنید. به طور مثال، به جای سنسور دما از سنسور گاز استفاده کنید و هنگام تشخیص گاز در محیط، یک لامپ یا مهپاش را به صورت خودکار روشن کنید. اگر به دنبال ایده هستید، نمونه داشبوردهای ساخته شده توسط تینگزپاد را در صفحه کاربردها مشاهده کنید.
در نتیجه، با یادگیری اصول کلی کار با سختافزارهای اینترنت اشیا، پلتفرم اینترنت اشیا تینگزپاد، درک صحیح نیاز مشتری و چاشنی خلاقیت خود میتوانید پروژهها و محصولات هوشمندی را برای بازارهای مختلف توسعه داده و درآمدزایی کنید!
تمرکز اصلی آکادمی تینگزپاد بر آموزش مفهوم اینترنت اشیا و انجام پروژههای هوشمندسازی مرتبط با این فناوری است. اما قدم اول در یادگیری این مفهوم، شناخت نسبتا خوب از دنیای الکترونیک و کار با سرورهای ابری است. بنابراین، پیشنهاد میکنیم خود را به چالش بکشید و سایر پروژههای آکادمی تینگزپاد را نیز انجام دهید. همچنین، خودتان را محدود نکنید و با جایگزینی قطعات و تغییر در برنامه، پروژههای خلاقانه جدید ایجاد کنید.
اگر به مباحث هوشمندسازی و اتوماسیون علاقهمند هستید، مقالات مرتبط با این حوزه را در وبلاگ مطالعه کنید و ویدیوهای آموزشی ما را در یوتیوب و آپارات مشاهده کنید.