Serwisy partnerskie:
Close icon
Serwisy partnerskie

Automatyka domowa z Alexą

W tym projekcie nauczymy się jak kontrolować kilka inteligentnych urządzeń, używając urządzenia Alexa jako centrum automatyki domowej.
Article Image

Kilka lat temu, zbadałem tutaj, jak używać Alexy, inteligentnego osobistego asystenta, który stał się popularny dzięki Amazon Echo i Echo-Dot, w projektach automatyki domowej: Kiedy IoT spotyka się z AI: Automatyka domowa z Alexą i NodeMCU oraz Alexa – NodeMCU: Prosta emulacja WeMo.

Alexa jest zdolna do interakcji głosowej, odtwarzania muzyki, tworzenia list rzeczy do zrobienia, ustawiania alarmów, przesyłania strumieniowego podcastów, odtwarzania audiobooków oraz dostarczania informacji o pogodzie, ruchu drogowym i innych informacji w czasie rzeczywistym. Alexa może również kontrolować kilka inteligentnych urządzeń, używając siebie jako centrum automatyki domowej. Będziemy używać w tym projekcie, "Echo Dot", które pozwala użytkownikom aktywować urządzenie za pomocą słowa budzenia, takiego jak "Alexa" lub "Komputer", jak w "Star Treku"!

W przestrzeni automatyki domowej, Alexa może współdziałać z kilkoma różnymi urządzeniami, takimi jak Philips Hue, Belkin Wemo, Sonoff, itp. W poprzednich projektach, emulowaliśmy urządzenia WeMo, używając biblioteki fauxmoESP, która obecnie wydaje się być przestarzała i nie jest odpowiednio utrzymywana. Tutaj będziemy używać Espalexa, łatwej w użyciu biblioteki Arduino kompatybilnej zarówno z ESP8266 jak i ESP32.

Poniższy schemat blokowy pokazuje, co będzie rozwijane w naszym projekcie:

Poniższy filmik, pokazuje jak projekt będzie wyglądał na końcu:

Instalacja płytek ESP

W Arduino IDE Preferences -> Additional boards Manager URLs należy wpisać: 

https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json

Następnie w Arduino IDE Tools/Boards Manager, Install boards:

W tym projekcie użyjemy NodeMCU, ale kod może być łatwo przystosowany do pracy z ESP32. Zatem również jego zainstalujmy:

Rozkład pinów ESP8266 NodeMCU:

Biblioteka Espalexa

Espalexa umożliwia ustawienie wartości zakresu (np. jasności, temperatury) i opcjonalnie koloru, oprócz standardowego sterowania włącz/wyłącz. Możemy na przykład powiedzieć – "Alexa, włącz światło do 75% ".

Espalexa emuluje część protokołu SSDP oraz API Philips hue, tylko na tyle, aby mógł być wykryty i kontrolowany przez Alexę.

Domyślnie możliwe jest dodanie do 10 urządzeń, ponieważ każdy "slot" urządzenia zajmuje pamięć, nawet jeśli żadne urządzenie nie jest zainicjowane. Można zmienić maksymalną liczbę urządzeń, dodając np. 

#define ESPALEXA_MAXDEVICES 20

przed wywołaniem biblioteki:

#include <Espalexa.h>

Zalecane jest ustawienie MAXDEVICES na dokładną liczbę urządzeń, które chcemy dodać, aby zoptymalizować wykorzystanie pamięci. Aby zainstalować bibliotekę, przejdźmy do Arduino IDE Tools/Manage Libraries i wpiszmy espalexa:

Prototyp automatyki domowej

Nasz projekt automatyki domowej zostanie stworzony w oparciu o cztery inteligentne urządzenia, które mogą być indywidualnie zdalnie sterowane. Załóżmy jednak, że chcemy pogrupować nasze urządzenia, które mają być używane w naszym domu. Co należy zrobić?

Na przykład załóżmy, że nasz dom ma dwa pokoje:

  • Sypialnię
  • Salon

Teraz załóżmy, że chcemy mieć jedną lampę i jedno gniazdko w każdym pokoju. Pogrupujmy więc nasze cztery urządzenia tak, jak pokazano na schemacie blokowym na wstępie:

Sypialnia

  • Światło 2
  • Gniazdko 1 (wentylator)

Salon

  • Światło 1
  • Gniazdko 2 (Brzęczyk)

Nasz projekt automatyki domowej będzie wyglądał mniej więcej tak:

Montaż sprzętu do testowania

Do celów testowych, jako "urządzenia IoT" zostaną użyte cztery kolorowe LEDy. Należy je zamontować w sposób pokazany na schemacie i spisany poniżej:

==> Czerwony LED (Light1) ==> NodeMCU D1 (GPIO5) – Salon

==> Zielony LED (Outlet1) ==> NodeMCU D2 (GPIO4) – Salon

==> Niebieski LED (Light2) ==> NodeMCU D5 (GPIO14) – Sypialnia

==> Żółty LED (Outlet2) ==> NodeMCU D6 (GPIO12) – Sypialnia

Czerwony i zielony LED będą symulować urządzenia, które mają być zainstalowane w "Salonie", a niebieski i żółty LED będą symulować urządzenia zainstalowane w „Sypialni"

Tworzenie naszych urządzeń IoT w Arduino IDE

Po pierwsze, musimy wywołać biblioteki:

#include <ESP8266WiFi.h>
#include <Espalexa.h>

Poniżej definicje pinów NodeMCU, które mają być podłączone do urządzeń (w fazie testowej będą to LEDy, a w końcowym projekcie wejścia przekaźnikowe):

#define RelayPin1 5  //D1
#define RelayPin2 4  //D2
#define RelayPin3 14 //D5
#define RelayPin4 12 //D6

Gdy mamy już cztery urządzenia, należy zdefiniować przynajmniej cztery bezpośrednie funkcje callback:

void device1Changed(uint8_t brightness);
void device2Changed(uint8_t brightness);
void device3Changed(uint8_t brightness);
void device4Changed(uint8_t brightness);

Parametr jasność zawiera nowy stan urządzenia (0:wyłączony, 255:włączony, 1-254:przyciemniony), który zostanie wysłany przez Alexę po wywołaniu tej funkcji callback (wywołania zwrotnego). Ale funkcja callback może być w rzeczywistości dowolną funkcją do wykonania pod komendą Alexy. Zdefiniujemy więc tutaj trzy dodatkowe funkcje specjalne do wywołania, które będą obsługiwać wiele urządzeń IoT:

void devFunc1Changed(uint8_t brightness);
void devFunc2Changed(uint8_t brightness);
void devFunc3Changed(uint8_t brightness);

Powyższe funkcje callback będą powiązane z:

  • Wszystkimi urządzeniami domowymi (Światło1, Światło2, Gniazdko1 i Gniazdko2 czyli Light1, Light2, Outlet1 i Outlet2)
  • Salon (Światło1 i Gniazdko1)
  • Sypialnia (Światło2 i Gniazdko2)

Tak więc Alexa będzie w rzeczywistości obsługiwać siedem "urządzeń IoT". Dla każdego z nich musimy zdefiniować unikalną nazwę, która będzie wywoływana przez Alexę:

// nazwy urządzeń
String Device_1_Name = "Red light";
String Device_2_Name = "Green light";
String Device_3_Name = "Blue light";
String Device_4_Name = "Yellow light";
 
// nazwy funkcji urządzeń (device_function)
String Dev_Func_1_Name = "Living Room";
String Dev_Func_2_Name = "Bed Room";
String Dev_Func_3_Name = "All Home Devices";

W fazie testowania będziemy nazywać LEDy "{jego kolor} Light". Na naszym finalnym projekcie możemy zmienić te zmienne na ich ostateczne nazwy ("Light 1", "Outlet 2", itd.). Ostatnią, ale nie mniej ważną rzeczą jest zadeklarowanie zmiennych, które będą używane przez espalexę:

Espalexa espalexa;

i do komunikacji:

boolean connectWifi();
boolean wifiConnected = false;
const char* ssid = „NASZE SSID";
const char* password = „NASZE HASŁO";

W fazie Setup, oprócz standardowych definicji pinów i szeregowych prędkości transferu oraz procedur startu komunikacji, należy mieć każde z urządzeń IoT z prawidłowo skojarzoną własną nazwą i uruchomioną espalexa:

// Zdefiniuj tutaj swoje urządzenia.
espalexa.addDevice(Device_1_Name, device1Changed);
espalexa.addDevice(Device_2_Name, device2Changed);
espalexa.addDevice(Device_3_Name, device3Changed);
espalexa.addDevice(Device_4_Name, device4Changed);
 
// Zdefiniuj tutaj funkcje swoich urządzeń.
espalexa.addDevice(Dev_Func_1_Name, devFunc1Changed);
espalexa.addDevice(Dev_Func_2_Name, devFunc2Changed);
espalexa.addDevice(Dev_Func_3_Name, devFunc3Changed);
 
espalexa.begin();

Funkcja pętli powinna być bardzo prosta:

void loop()
{
espalexa.loop();
delay(1);
}

Ostatnim zabiegiem będzie stworzenie funkcji callback, albo najlepiej, co musi być zrobione, gdy Alexa wyśle komendę. Poniższa funkcja callback może być dostosowana do wszystkich czterech urządzeń IoT:

void deviceNChanged(uint8_t brightness)
{
  //Kontrolowanie urządzenia 
  if (brightness == 255)
    {
      digitalWrite(RelayPinN, HIGH);
      Serial.println("DeviceN ON");
    }
  else
  {
    digitalWrite(RelayPinN, LOW);
    Serial.println("DeviceN OFF");
  }
}

Zmieniając "N" w powyższym kodzie na 1, 2 3 i 4, uzyskamy cztery bezpośrednie funkcje callback. Pamiętajmy, że parametr jasności wysyłany przez Alexę, zawiera nowy stan urządzenia, który będzie: 0 ==> OFF; 255 ==> ON, oraz 1-254 dla "przyciemnionego światła".

Tak więc, możemy rozszerzyć powyższą prostą funkcję ON-OFF do specjalnej funkcji, w której można kontrolować natężenie światła. Zrobimy to dla device1 (czerwony LED):

void device1Changed(uint8_t brightness){
//Kontrolowanie urządzenia
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("%");
}
}
Pamiętajmy, że NodeMCU ma wyjścia PWM, które można wykorzystać za pomocą funkcji Arduino analogWrite(). Jeśli używany jest ESP32, funkcja PWM powinna zostać utworzona w momencie, gdy funkcja analogWrite() nie jest dostępna.

Kompletny kod można pobrać z mojego GitHuba: Alexa_NodeMCU_Home_Automation

Nie zapomnijmy zmienić poświadczeń atrapy Wi-Fi na swoje własne.

Po skompilowaniu kodu w Arduino IDE i wgraniu go do NodeMCU, na monitorze szeregowym można zobaczyć wymieniane komunikaty. Gdy NodeMCU jest podłączony do sieci WiFi, powinien pojawić się podobny komunikat (dane sieciowe):

Bierzemy pod uwagę, że mamy już Alexę poprawnie zainstalowaną na komputerze tej samej sieci, do której podłączony jest nasz NodeMcu. Teraz poprośmy Alexę, aby znalazła nasze urządzenia. Istnieją dwie metody, aby to zrobić:
  • Korzystanie z aplikacji Alexa w smartfonie
  • Prosząc Alexę, aby zrobić to bezpośrednio za pomocą polecenia głosowego, jak np.: "Alexa, znajdź urządzenia".

Po 45 sekundach powinniśmy otrzymać potwierdzenie od Alexy, że zostało znalezione siedem urządzeń. Możemy to zobaczyć na zakładce "Light" jak pokazano poniżej:

Gdy Alexa wykryje nasze urządzenia, możemy wydawać jej polecenia głosowe, jak pokazano poniżej:

Poniższy zrzut ekranu pokazuje odpowiedź monitora szeregowego.

Montaż kompletnego zestawu sprzętu

Zamiast LEDów i rezystorów, należy podłączyć wyjścia GPIO do modelu czterokanałowego przekaźnika, jak pokazano poniżej:

Nie należy zasilać modułu przekaźnikowego bezpośrednio z pinu wyjściowego 5 V NodeMcu. Do tego celu należy użyć zewnętrznego zasilacza. Zasilacz 1 A powinien wystarczyć. W przypadku zastosowania innej wersji należy skontaktować się z producentem modułu przekaźnika. Nie zapomnijmy połączyć wszystkich mas razem.

W zasadzie można użyć tego samego kodu opracowanego na potrzeby testów, ALE należy potwierdzić logikę stosowaną przez moduł przekaźnika. W powyższym module, na przykład, należy utrzymywać wejścia "Open" lub HIGH, zmieniając je na LOW, aby aktywować wyjście przekaźnikowe. Tak więc, kod musi być zmieniony zgodnie z tym.

  • W fazie setup() należy zdefiniować wyjścia GPIO jako HIGH
  • W funkcjach CallBack należy zmienić HIGH na LOW i odwrotnie

Poprawność działania przekaźników można potwierdzić zarówno poprzez dźwięk zamykania przekaźnika wyjściowego, jak i świecenie czerwonej diody w module.

Gdy wszystko działa już poprawnie przychodzi czas na kompletną instalację naszych "inteligentnych urządzeń", czyli dwóch stałych „lamp" i dwóch "gniazdek". Zmieńmy im odpowiednio nazwy:

  • Light One (Światło pierwsze)
  • Light One (Światło drugie)
  • Outlet One (Gniazdko pierwsze)
  • Outlet Two (Gniazdko drugie)
// nazwy urządzeń
String Device_1_Name = "Light One"; 
String Device_2_Name = "Light Two";
String Device_3_Name = "Outlet One";
String Device_4_Name = "Outlet Two";

Aby zakończyć nasz projekt tak jak pokazano na filmie na początku tego poradnika, podłączamy kilka urządzeń, które mają być sterowane przez przekaźniki. W moim przypadku używam dwóch LEDów jako lampek i podłączam wentylator do gniazdka 1 oraz brzęczyk do gniazdka 2 (aby symulować urządzenie takie jak na przykład radio). Poniżej schemat przedstawiający zainstalowane urządzenia.
 
Zauważmy, że gdy przekaźniki są prawdziwe, możemy zainstalować prawdziwe lampy i urządzenia, które mają być kontrolowane za pomocą Alexy.

Podsumowanie

Jak zawsze mam nadzieję, że ten projekt pomoże innym odnaleźć się w ekscytującym świecie elektroniki i IoT!

Proszę odwiedzić mój GitHub, aby zobaczyć zaktualizowane pliki: Alexa_NodeMCU_Home_Automation.

Artykuł Home Automation with Alexa opracowano w wersji polskiej na podstawie współpracy z portalem mjrobot.org.

Tematyka materiału: AI, Alexa, Android, arduino, Arduino IDE, Wi-Fi, Bluetooth, DHT11, DHT22, DS18B20, edgeAI, ESP8266, ESP32, IoT, iphone, LCD, laser, NodeMCU, OLED, python, raspberry pi, scratch, scratch 2, robot, sensor, UV, asystent głosowy, sensor temperatury, L293D
AUTOR
Źródło
mjrobot.org
Udostępnij
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"