اتوماسیون خانگی به کمک Alexa
چندین سال پیش در دو مقاله جدگانه توضیح دادیم که چگونه میتوان از Alexa در انجام پروژههای اتوماسیون خانگی بهره برد؛ همانطور که میدانید Alexa یک دستیار شخصی هوشمند است که محبوبیت خود را مدیون Amazon Echo و Echo-Dot است.
الکسا Alexa تعامل با کاربران
Alexa میتواند از طریق صوت با کاربران تعامل برقرار کند، موسیقی پخش کند، فهرستی از کارهای روزانه ایجاد کند، هشدار (در گوشی و غیره) تنظیم کند، پادکست پخش کند، کتابهای صوتی را پخش کند و اطلاعات لحظهای راجع به وضعیت آبوهوا، ترافیک و غیره را در اختیار کاربران قرار دهد. علاوه بر این، Alexa میتواند به عنوان قطب اتوماسیون خانگی عمل کند؛ به بیان ساده میتواند چندین دستگاه هوشمند خانگی را کنترل کند. برای انجام پروژه حاضر از Echo-Dot استفاده خواهیم کرد؛ کاربران به کمک این بلندگوی هوشمند و با گفتن کلمات فعالسازی همچون “Alexa” و یا «کامپیوتر»، میتوانند دستگاهها را فعال کنند.
در خانههای هوشمند، Alexa میتواند با چندین دستگاه از جمله Philips Hue ،Belkin Wemo ،Sonoff و غیره ارتباط برقرار کند. در پروژه قبلی دستگاههای WeMo را با استفاده از کتابخانه fauxmoESP شبیهسازی کردیم؛ البته به نظر میرسد این کتابخانه از رده خارج شده و دیگر مورد استفاده قرار نمیگیرد. برای انجام پروژه حاضر از یکی از کتابخانههای Arduino به نام Espalexa استفاده میکنیم که ازESP8266 و ESP32 پشتیبانی میکند.
با نگاهی به نمودار بلوکی زیر متوجه میشوید که در این پروژه قصد داریم چه نوع سیستمی توسعه دهیم:
برای اطلاع از نتیجه نهایی این ویدئو را تماشا کنید.
1- نصب بوردهای ESP
در نرمافزار Arduino IDE به بخش Preferences بروید و در قسمت Additional boards Manager URLs ، آدرس زیر را وارد کنید:
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
سپس از قسمت Tools ← Boards Manager، بوردها را نصب کنید:
ما برای انجام این پروژه از NodeMCU استفاده میکنیم اما با اعمال برخی تغییرات در کُد، از ESP32 هم میتوانید استفاده کنید، برای نصب آن:
طرح پایه تراشه ESP8266:
[irp posts=”12080″]2- کتابخانه Espalexa
در کتابخانه Espalexa میتوانید به دلخواه یک رنگ انتخاب کرده و کنترل روشن/ خاموش و برخی از مقادیر را هم تنظیم کنید (برای مثال میزان روشنایی ، دما). برای مثال میتوانید بگویید:
«اَلِکسا، چراغ را روشن کن و نور آن را بر روی 75% تنظیم کن»
Aspalexa قسمتهایی از پروتکل SSDP و API لامپ هوشمند Philips hue را شبیهسازی کرده و میزان شبیهسازی آنها به اندازهای است که Alexa میتواند آنها را تشخیص داده و کنترل کند.
به طور پیشفرض، حداکثر 10 دستگاه را میتوان به Alexa اضافه کرد زیر «سوکت» هر یک از دستگاهها، حتی اگر آنها را روشن هم نکنیم، بخشی از حافظه را اشغال میکنند. برای تغییر حداکثر تعداد دستگاهها میتوانید از فرمان زیر کمک بگیرید:
#define ESPALEXA_MAXDEVICES 20
پیش از نصب کتابخانه:
#include <Espalexa.h>
بهتر است تعداد MAXDEVICES را دقیقاً برابر با همان تعداد دستگاههایی انتخاب کنید که میخواهید اضافه کنید، در این صورت فضای کمتری از حافظه اشغال میشود.
برای نصب کتابخانه به قسمت Tools و سپس به قسمت Manage Libraries بروید و espalaexa را وارد کنید:
3- نمونه اولیه اتوماسیون خانگی
برای انجام این پروژه از چهار دستگاه هوشمند استفاده میکنیم که از راه دور هم میتوانیم آنها را کنترل کنیم. اما اگر بخواهیم این وسایل را برای مصرف خانگی گروهبندی کنیم، چه باید بکنیم؟
برای مثال فرض کنید، خانهای با دو اتاق داریم:
- اتاق خواب
- اتاق نشیمن
حالا فرض کنید میخواهید در هر اتاق یک لامپ و یک پریز داشته باشید. به همین منظور چهار دستگاه مورد نظر را مطابق با نمودار بلوکی (در بخش مقدمه همین مقاله اتوماسیون خانگی)، گروهبندی میکنیم:
اتاق خواب
- لامپ 2
- پریز 1 (پنکه)
اتاق نشیمن
- لامپ 1
- پریز 2 (زنگ)
پروژه اتوماسیون خانگی ما بدین شکل خواهد بود:
4- مونتاژ سختافزار برای تست
برای تست کردن پروژه، از چهار LED رنگی به عنوان «دستگاههای IoT» استفاده میکنیم. این LEDها باید مطابق با نمودار و فهرست زیر نصب شوند:
LED قرمز (لامپ 1) ← NodeMCU D1 (GPIO5) – اتاق نشمین
LED سبز (پریز 1) ← NodeMCU D2 (GPIO4) – اتاق نشمین
LED آبی (لامپ 2) ← NodeMCU D5 (GPIO14) – اتاق خواب
LED زرد (پریز 2) ← NodeMCU D6 (GPIO12) – اتاق خواب
LEDهای زرد و قرمز دستگاههایی هستند که در «اتاق نشیمن» نصب شدهاند و LEDهای آبی و زرد دستگاههایی هستند که در «اتاق خواب» نصب شدهاند.
[irp posts=”21951″]5- ایجاد دستگاههای IoT در Arduino IDE
در گام اول باید کتابخانهها را بارگذاری کنیم:
#include <ESP8266WiFi.h> #include <Espalexa.h>
سپس پینهای NodeMCU که باید به دستگاهها وصل شوند را مشخص میکنیم (در مرحله تست دستگاهها همان LED خواهند بود و در پروژه نهایی ورودیهای رله Relay):
#define RelayPin1 5 //D1 #define RelayPin2 4 //D2 #define RelayPin3 14 //D5 #define RelayPin4 12 //D6
با توجه به اینکه چهار دستگاه داریم، حداقل باید چهار تابع callback تعریف کنیم:
void device1Changed(uint8_t brightness); void device2Changed(uint8_t brightness); void device3Changed(uint8_t brightness); void device4Changed(uint8_t brightness);
پارامتر روشنایی شامل وضعیت دستگاه جدید میشود ( 0: خاموش، 255: روشن، 1 تا 254: کم نور) که Alexa همزمان با فراخوانی تابع callback آن را ارسال میکند.
هر تابعی که با فرمان Alexa فعال شود میتواند یکی از توابع callback باشد، به همین دلیل 3 تابع دیگر معرفی میکنیم تا فراخوان شوند و چندین دستگاه IoT را کنترل کنند:
void devFunc1Changed(uint8_t brightness); void devFunc2Changed(uint8_t brightness); void devFunc3Changed(uint8_t brightness);
توابع callback دستگاههای زیر را کنترل میکنند:
- تمامی دستگاههای خانه (لامپ 1، لامپ 2، پریز 1 و پریز 2)
- اتاق نشیمن ( لامپ 1 و لامپ 2)
- اتاق خواب ( لامپ 2 و پریز 2)
در این صورت Alexa هفت دستگاه IoT را کنترل خواهد کرد. برای هر یک از این دستگاهها باید یک نام تعریف کنیم تا Alexa آنها را به این نام بخواند:
// device names String Device_1_Name = "Red light"; String Device_2_Name = "Green light"; String Device_3_Name = "Blue light"; String Device_4_Name = "Yellow light"; // device_function names String Dev_Func_1_Name = "Living Room"; String Dev_Func_2_Name = "Bed Room"; String Dev_Func_3_Name = "All Home Devices";
در طول فرایند تست، LEDها را به این نام صدا میزنیم: « لامپ (رنگ لامپ)». در پروژه نهایی میتوانیم این متغیرها را به نام نهاییشان ( لامپ 1، پریز 1 و غیره) تغییر دهیم.
و در آخر باید متغیرها را اعلام کنیم تا espalexa بتواند از آنها استفاده کند:
Espalexa espalexa;
و برای برقراری ارتباط:
boolean connectWifi(); boolean wifiConnected = false; const char* ssid = "YOUR SSID HERE"; const char* password = "YOUR PASSWORD HERE";
در مرحله راهاندازی (Setup)، علاوه بر تعریف نرخ baud، پین و فرایندهای آغاز ارتباطات، نام هر یک از دستگاهها را مشخص کرده و espalexa را آغاز کنید:
// Define your devices here. espalexa.addDevice(Device_1_Name, device1Changed); espalexa.addDevice(Device_2_Name, device2Changed); espalexa.addDevice(Device_3_Name, device3Changed); espalexa.addDevice(Device_4_Name, device4Changed); // Define your devices functions here. espalexa.addDevice(Dev_Func_1_Name, devFunc1Changed); espalexa.addDevice(Dev_Func_2_Name, devFunc2Changed); espalexa.addDevice(Dev_Func_3_Name, devFunc3Changed) espalexa.begin();
تابع حلقه (loop) باید خیلی ساده باشد:
void loop() { espalexa.loop(); delay(1); }
در آخرین مرحله باید توابع callback را ایجاد کنید، به بیان دقیقتر باید مشخص کنید زمانیکه Alexa فرمان میدهد چه کاری باید انجام داد.
تابع callback زیر را میتوان بر روی هر 4 دستگاه IoT اجرا کرد:
void deviceNChanged(uint8_t brightness) { //Control the device if (brightness == 255) { digitalWrite(RelayPinN, HIGH); Serial.println("DeviceN ON"); } else { digitalWrite(RelayPinN, LOW); Serial.println("DeviceN OFF"); } }
در صورتیکه در کد فوق “N” را به 1، 2، 3 و 4 تغییر دهیم، چهار تابع callback مستقیم خواهیم داشت. به خاطر داشته باشید پارامتر روشنایی که Alexa ارسال میکند، شامل وضعیت دستگاه جدید است:
0 ← خاموش
255 ← روشن
1 تا 254 ← نور کم
این تابع روشن – خاموش کردن ساده را میتوانیم به یک تابع خاص بسط دهیم و شدت نور را کنترل کنیم. این عمل را بر روی دستگاه 1 پیاده میکنیم ( LED قرمز):
void device1Changed(uint8_t brightness) { //Control the device if (brightness == 255) { digitalWrite(RelayPin1, HIGH); Serial.println("Device1 ON"); } else if (brightness == 0) { digitalWrite(RelayPin1, LOW); Serial.println("Device1 OFF"); } else { int brigh_perc = (brightness/255.)*100; analogWrite(RelayPin1, brightness); Serial.print("Device1 Brightness: "); Serial.print(brigh_perc); Serial.println("%"); } }
به خاطر داشته باشید خروجیهای NodeMCU، PWM هستند و میتوان آنها را در تابع analogWrite() (متعلق به Arduino) به کار برد. اگر از ESP32 استفاده کردید و analogWrite() در دسترس نبود، باید تابع PWM را ایجاد کنید.
کد کامل این پروژه را میتوانید از GitHub دانلود کنید:
پس از کامپایل کردن کد در Arduino IDE و بارگذاری آن در NodeMCU میتوانید پیامهایی که تبادل میشوند را در مانیتور Serial مشاهده کنید. زمانی که NodeMCU به wifi شما وصل شد، چنین پیامی دریافت میکنید:
فرض ما بر این است که شما Alexa را به درستی بر روی شبکهای که NodeMCU به آن وصل شده، نصب کردهاید.
حالا از Alexa میخواهیم دستگاهها را پیدا کند. برای انجام این کار از دو متد میتوان بهره گرفت:
- از اپلیکیشن Alexa در تلفنهای هوشمند استفاده کنید
- از طریق فرمانهای صوتی از Alexa بخواهید کاری انجام دهد، برای مثال بگویید: «اَلِکسا، دستگاهها را پیدا کن!»
پس از 45 ثانیه Alexa اعلام میکند که 7 دستگاه پیدا کرده است. این دستگاهها را میتوانید در tab «لامپ» ببنید:
پس از اینکه Alexa دستگاهها را پیدا کرد، میتوانید از طریق فرمانهای صوتی از او بخواهید کاری انجام دهد. برای تماشای این ویدئو کلیک کنید.
تصویر مقابل هم نشاندهنده پاسخهای مانیتور Serial است:
[irp posts=”11788″]6- مونتاژ کامل سختافزار
به جای LEDها و مقاومتها (resistor)، خروجیهای GPIO باید به مدل 4 کانالی رله متصل شوند:
ماژول رله را (برای برقرسانی) مستقیماً به پین خروجی NodeMCU 5V وصل نکنید. برای این کار از یک منبع تغذیه خارجی استفاده کنید. یک منبع تغذیه 1A کافی خواهد بود. اگر از نسخه متفاوتی از ماژول Relay استفاده میکند، با تولیدکننده آن هماهنگ کنید. تمامی GNDها را به هم وصل کنید.
از کدی که برای تست نوشتیم هم میتوانید استفاده کنید اما باید مطابق با منطق ماژول رله باشد. برای مثال در ماژول فوق، ورودیها را باید در حالت “Open” یا HIGH نگه دارید. برای فعال کردن خروجی رله، باید آنها را به Low تغییر دهید. کد هم بر همین اساس باید تغییر کند.
- در طول مرحله setup()، خروجیهای GPIO را به عنوان HIGH تعریف کنید
- در توابع callback باید HIGH را به Low و بالعکس تغییر دهید.
به دو روش میتوانید از صحت عملکرد رلهها مطمئن شوید؛ صدای بسته شدن خروجی relay و LED قرمزِ ماژول.
در پایان میتوانیم به صورت کامل «دستگاههای هوشمند» را که شامل 2 لامپ و 2 پریز میشود، نصب کنیم. در این مرحله نام آنها را تغییر میدهیم:
- لامپ یک
- لامپ دو
- پریز یک
- پریز دو
// device names String Device_1_Name = "Light One"; String Device_2_Name = "Light Two"; String Device_3_Name = "Outlet One"; String Device_4_Name = "Outlet Two";
برای تکمیل پروژه، تعدادی از دستگاهها را نصب کنید تا رلهها آنها را کنترل کنند. برای انجام این پروژه من از دو LED به عنوان لامپ استفاده کردم و به پریز اول یک پنکه و به پریز دوم یک زنگ وصل کردم ( تا برای مثال دستگاهی مثل رادیو را شبیهسازی کنم). در نمودار زیر دستگاههای نصب شده، نشان داده شدهاند.
شما میتوانید لامپهای واقعی AC و وسایل دیگر را نصب کنید (رلهها باید بتوانند آنها را کنترل کنند) تا Alexa آنها را کنترل کند.
7- نکاتی راجع به «توابع دستگاهها»
این مقاله اتوماسیون خانگی را با موضوعاتی همچون شبیهسازی دستگاههای IoT، از قبیل Philips Hue و WeMo آغاز کردیم و سپس برای انجام کارهای دشوارتر «عملکرد دستگاهها» از Alexa استفاده کردیم. در این توابع، از چندین خروجی به عنوان گروهی از دستگاه استفاده کردیم و آنها را با در نظر گرفتن تعداد اتاقها تقسیم کردیم.
پیش از این با استفاده از این توابع برخی از سلاحهای مورد استفاده در سریال Star Trek Enterprise ، از جمله Photon Torpedos و Phasers را شبیهسازی کردهایم.
در رابطه با اتوماسیون خانگی باید به این نکته توجه کنید که در دنیای IoT، دستیارهای صوتی ابزار قدرتمندی به شمار میآیند؛ در این حوزه میتوانید از طریق فرمانهای صوتی ساده و با استفاده از ریزکنترلکنندهها، فرایندهای پیچیدهای انجام دهید. برای تماشای این ویدئو کلیک کنید.
انواع کاربردهای هوش مصنوعی در صنایع مختلف را در هوشیو بخوانید