Rozpocznij tworzenie IoT: samouczek ESP8266 Arduino
Opublikowany: 2022-03-11Celem tego samouczka ESP8266 Arduino jest zapoznanie się z wbudowanym programowaniem za pomocą Arduino na chipie, który stał się bardzo popularny wśród społeczności twórców (i ogólnie programistów) ze względu na jego dostępność i łatwość użytkowania w przestrzeni IoT. Samouczek brudzi nam również ręce, gdy Alexa używa nieoficjalnego „hacka”, aby Alexa wykonała naszą licytację w domu (ta technika nie jest przeznaczona do użytku w produkcji, tylko do demonstracji w domu). Wypróbuj to w domu, ale nie w pracy.
Piękno tej techniki polega na tym, że możemy jej użyć we własnych domach, aby Alexa zautomatyzowała niemal dosłownie wszystko, co działa na energię elektryczną. Jako dodatkowy bonus otrzymujemy wgląd w programowanie wbudowane za pomocą Arduino, umiejętność, która może nie jest obecnie tak powszechna wśród programistów głównego nurtu. Wreszcie możemy pracować z popularnym układem ESP8266, ulubionym wśród majsterkowiczów; to niesamowity mały chip z możliwością uruchamiania różnych rzeczy, z wbudowanym chipem Wi-Fi, którego będziemy potrzebować do tego projektu. To właśnie umożliwi urządzeniu Alexa i chipowi bezpośrednią komunikację ze sobą.
Tylko trochę informacji o programowaniu Alexa: Model programowania „umiejętności” Alexy działa tak:
- Mówisz do swojej Alexy.
- Alexa kieruje Twoją mowę z powrotem do chmury Amazona.
- Polecenie głosowe jest kierowane do „umiejętności” Alexy (programu działającego w chmurze Amazona).
„Umiejętność” Alexy przejmuje kontrolę nad dowództwem; zwykle powoduje to wysłanie odpowiedzi z powrotem do urządzenia Alexa, powodując, że w odpowiedzi powie coś użytkownikowi. W przypadku Alexa IoT polecenie jest kierowane do „cienia urządzenia” w chmurze Amazona, co ostatecznie skutkuje wysłaniem odpowiedzi do innego urządzenia w domu. Omijamy to wszystko naszym hackiem. Chcemy, aby urządzenie Alexa komunikowało się bezpośrednio z naszym chipem ESP8266 w naszym domu, bez wysyłania czegokolwiek do chmury iz powrotem. Chcemy, aby Alexa bezpośrednio wysłała żądanie do naszego ESP8266, tylko przez i wewnątrz naszej domowej sieci Wi-Fi.
Nasz hack nie jest tak naprawdę tajemnicą. Zamierzamy sprawić, aby nasz ESP8266 „emulował” Wemo Belkin, urządzenie, które ma specjalną licencję z Amazon, pozwalającą mu na bezpośrednią komunikację z urządzeniem Alexa, omijając całą opisaną powyżej komunikację w chmurze Amazon.
Udając Wemo, nasz ESP8266 cieszy się przywilejem możliwości odbierania poleceń bezpośrednio od Alexy.
Podstawowy plan naszego samouczka ESP8266 Arduino
- Posłuchaj na ESP8266 dla urządzenia Alexa wysyłającego sondy w lokalnej sieci Wi-Fi dla kompatybilnych urządzeń i odpowiedz na te sondy, mówiąc „Jestem Wemo”.
- Po zaufaniu przez urządzenie Alexa, słuchaj dalszych poleceń z tego urządzenia. Obsługuj je wysyłając kody IR przez nadajnik IR, włączając/wyłączając nasz telewizor.
Wymagania sprzętowe
Aby ukończyć ten samouczek, będziesz musiał samodzielnie zdobyć kilka przedmiotów, z których wszystkie są łatwe do zdobycia.
- Dowolne urządzenie Alexa. Opracowałem ten samouczek za pomocą kropki Alexa. Czy samouczek będzie działał z symulatorem Echo? Może! (Ale nie testowałem tego). Spróbuj, jeśli czujesz się na siłach (lub oszczędnie). Urządzenie Alexa kosztuje kieszonkowe, ale korzystanie z Echosim jest bezpłatne.
- Układ ESP8266. W chwili pisania tego tekstu kosztowały zaledwie kilka dolarów. Możesz je kupić w serwisie eBay lub w każdym dobrze zaopatrzonym sklepie internetowym ze sprzętem.
- Dioda IR (podczerwień). Musisz podłączyć to do swojego układu ESP8266, a to musisz zrobić sam. Do tego projektu potrzebujemy tylko możliwości wysyłania; nie dbamy o odbiór IR. Pamiętaj, aby podłączyć diodę do GND i wyprowadzić 0, aby ten samouczek działał. (Jeśli zrobisz to w jakikolwiek inny sposób, to w porządku, ale będziesz musiał również odpowiadać za odpowiednią modyfikację kodu samouczka. Ten link może ci pomóc. Pamiętaj, że ze względu na schemat numeracji zastosowany w ESP8266, pin 0 może być oznaczony jako „D3”.
- Adapter szeregowy, który z jednej strony jest USB (do podłączenia do komputera deweloperskiego), az drugiej strony pasuje do układu ESP8266.
- Lokalna sieć Wi-Fi, do której znasz nazwę użytkownika i hasło.
Narzędzia programowe Arduino
- IDE Arduino. Istnieją wersje dla wszystkich głównych systemów operacyjnych, w tym Windows. Ten samouczek został opracowany na wersji Ubuntu, ale zainstalowałem i używałem Arduino również w systemie Windows, bez żadnych problemów.
- Biblioteka programistyczna ESP8266 dla Arduino.
- Kierowcy. Na szczęście sterowniki do karty najprawdopodobniej powinny być typu plug & play, więc nie są wymagane żadne dodatkowe sterowniki.
Konfiguracja wszystkiego
- Zainstaluj Arduino IDE.
- Zainstaluj bibliotekę ESP8266 za pomocą Menedżera tablic.
Aby zainstalować bibliotekę ESP8266 za pomocą Boards Manager:
- W Arduino IDE otwórz Plik -> Preferencje .
- Wprowadź ten adres URL w „Additional Boards Manager URL”: http://arduino.esp8266.com/stable/package_esp8266com_index.json
- Kliknij OK
Przejdź do Menedżera tablic ( Narzędzia -> Tablica: [bieżąca tablica] -> Menedżer tablic ).
- W polu tekstowym „filtr” wpisz „ESP8266”.
- Powinieneś otrzymać wpis dla „esp8266” teraz, gdy masz dodany menedżer dodatkowych tablic. Wybierz go i kliknij „zainstaluj”.
- Poczekaj chwilę — pobranie wszystkiego zajmuje trochę czasu.
- Zrestartuj swoje Arduino IDE.
- Otwórz Narzędzia -> Tablica: i tym razem przewiń w dół do „Generic ESP8266 Module” i wybierz go.
Dodawanie bibliotek innych firm
Arduino oferuje wiele różnych sposobów dodawania zewnętrznych bibliotek do projektu lub „Szkicu”, jak to nazywają. Aby wszystko było tak proste, jak to możliwe, w tym samouczku zajmiemy się najszybszym wyjaśnieniem, czyli po prostu skopiowaniem folderów. Aby samouczek działał, będziemy musieli dodać dokładnie dwie zewnętrzne biblioteki: IRemoteESP8266 i https://github.com/me-no-dev/ESPAsyncTCP.
- W kodzie samouczka w serwisie GitHub znajdź katalog „biblioteki”.
- W głównym katalogu instalacyjnym Arduino (np. C:\Program Files\Arduino) znajdź podkatalog „libraries”.
- Skopiuj katalog IRemoteESP8266 z katalogu „biblioteki” samouczka do katalogu „biblioteki” Arduino.
- Skopiuj katalog ESPAsyncTCP z katalogu „libraries” w samouczku do katalogu „libraries” Arduino.
- Zrestartuj środowisko Arduino IDE.
Teraz do projektu dołączono biblioteki do transmisji w podczerwieni i asynchronicznego TCP.
Ustawienia
Poniższy obrazek pokazuje typowe ustawienia, które działają dla mnie i mojego sprzętu, ale mogą się różnić dla każdego użytkownika. Możesz wypróbować poniższe ustawienia, ale może być konieczne dostosowanie ich do konkretnego układu i adaptera. Mój to na przykład nodemcu, więc musiałem zmienić metodę resetowania z „ck” (domyślna) na „nodemcu”. Ustaw także „debug port” na „serial”, aby móc korzystać z debuggera portu szeregowego. Mój jest bardzo typową konfiguracją, więc możesz użyć moich ustawień jako podstawy; Mówię tylko, że nie zdziw się, jeśli będziesz musiał z nimi zadzierać, aby kompilacja i proces flashowania działały.
Udowodnij swoją konfigurację za pomocą ESP8266 Hello World
Projekty Arduino zaczynają się od pliku .ino. Plik .ino definiuje dwa punkty wejścia: instalację i pętlę. Dla naszego „hello world” zapalimy trochę światła na ESP8266, aby sprawdzić, czy nasz kod działa.
//SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 #define LED_PIN 2 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); pinMode(LED_PIN, OUTPUT); } /*---------------------------------------*/ //Runs constantly void loop() { digitalWrite(LED_PIN, LOW); delay(1000); digitalWrite(LED_PIN, HIGH); delay(1000); }Skompiluj i sflashuj kod
Kompilacja i flashowanie to proste kroki, jeśli dotychczasowa konfiguracja jest poprawna. Aby skompilować bez flashowania, wystarczy przejść do Sketch -> Verify/Compile z menu Arduino.
Aby sflashować kod do chipa, a także skompilować, wybierz Sketch -> Upload z menu Arduino.
Jeśli flashowanie się powiedzie, zobaczysz, że wskaźnik postępu zmienia się od 0% do 100%, w tym czasie dioda LED na chipie najprawdopodobniej będzie migać lub migać.
Aby przetestować, czy debugowanie szeregowe działa:
- Najpierw upewnij się, że port debugowania jest ustawiony na Serial ( Narzędzia -> Port debugowania ).
- Po zakończeniu flashowania kodu na chipie wybierz Tools -> Serial Monitor .
Wyjście debuggera szeregowego po pomyślnym uruchomieniu:
Świetnie, więc to działa; następnie chcemy zweryfikować nasze wyjście IR. Prześlijmy sygnał przez nasz nadajnik IR i sprawdźmy, czy sygnał nadchodzi.
Wykorzystamy istniejącą bibliotekę Arduino IR, aby nam pomóc. Jedną z największych zalet Arduino jest łatwość wpinania i wypinania bibliotek i modułów. Bardzo odświeżające dla frameworka C++!
Wystarczy postępować zgodnie z instrukcjami w pliku README tego repozytorium Git, aby zainstalować w Arduino.
Ten kod po prostu miga wielokrotnie nadajnikiem IR. Podczerwień jest niewidoczna dla ludzkiego oka, ale jest wskazówka do jej testowania; uruchom ten kod, sprawdź (za pomocą debugera), czy jest on uruchomiony na Twoim chipie, a następnie otwórz kamerę urządzenia mobilnego. Spójrz bezpośrednio na żarówkę diodową IR przez aparat . Jeśli działa, powinieneś zobaczyć, jak żarówka wyraźnie się włącza i wyłącza. Możesz wypróbować to również z dowolnym działającym pilotem (np. standardowym pilotem do telewizora). Poniższy kod powinien spowodować, że żarówka podczerwieni zacznie migać co 0,5 sekundy. W rzeczywistości wysyła polecenie włączania / wyłączania LG, więc może faktycznie wyłączyć i włączyć telewizor LG, jeśli jest w pobliżu.
#include <IRremoteESP8266.h> // IR Library IRsend* irSend; // infrared sender //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize the IR irSend = new IRsend(IR_PIN, true); irSend->begin(); } /*---------------------------------------*/ //Runs constantly void loop() { irSend->sendNEC(0x20DF10EF, 32, 3); delay(1000); }Rozpocznij samouczek ESP8266
Jeśli do tej pory wszystko działało, myślę, że możemy być usatysfakcjonowani, że nasz podstawowy sprzęt i konfiguracja działają, i jesteśmy gotowi do rozpoczęcia samouczka.
Połącz się z Wi-Fi
Najpierw będziemy musieli połączyć się z lokalnym Wi-Fi. Poniższy kod spróbuje połączyć się z Wi-Fi i zgłosi sukces połączenia (poprzez debugger szeregowy). W przykładzie kodu nie zapomnij zastąpić wartości myWifiSsid nazwą użytkownika swojej sieci Wi-Fi i zastąpić wartość myWifiPassword poprawnym hasłem.
#include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection // this file is part of my tutorial code #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //connect to wifi if (wifi->connect()) { debugPrint("Wifi Connected"); } } /*---------------------------------------*/ //Runs constantly void loop() { }Uruchom serwer Wemo
Połączony? Dobry. Teraz przechodzimy do sedna projektu: serwera Wemo.

Mój własny emulator Wemo jest zawarty w plikach źródłowych tego samouczka. Teraz możesz przeszukać Google i znaleźć prostszy emulator Wemo. Możesz znaleźć taki, który jest napisany przy użyciu mniejszej ilości kodu i który jest łatwy do zrozumienia. Wszelkimi sposobami nie krępuj się badać, eksperymentować, pisać własne itd. To wszystko jest częścią tego, aby ten samouczek stał się twoim własnym.
Powodem mojego jest to, że używa ESPAsyncTCP. Dlaczego to jest dobre? Cóż, jest tylko tyle serwerów (lub urządzeń), które można uruchomić na ESP8266 za pomocą tej metody, zanim zacznie ona stawać się zawodna, w tym sensie, że Alexa zacznie brakować urządzeń (nie będzie ich znajdować), polecenia zostaną usunięte, a wydajność staje się powolny. Uważam, że ta liczba jest maksymalizowana przez użycie biblioteki ESPAsyncTCP.
Bez tego znalazłem niepewność wkradania się w około 10-12 urządzeń; wraz z nim uważam, że liczba ta wzrasta do około 16. Jeśli chcesz rozszerzyć ten samouczek i zbadać ograniczenia tego, co może zrobić chip, polecam użyć mojej wersji. Jeśli chcesz zobaczyć prostszą wersję tylko dla własnego zrozumienia, możesz wyszukać „wemo emulator Arduino” w Google; powinieneś znaleźć mnóstwo przykładów.
Teraz musimy zainstalować bibliotekę ESPAsyncTCP. Zainstaluj go tak, jak zrobiliśmy bibliotekę IR; przejdź do strony Git i postępuj zgodnie z instrukcjami.
Ta biblioteka jest również zawarta w moim przykładowym kodzie arduino esp8266. Oto tylko kod do otwarcia połączenia Wi-Fi, nasłuchiwania żądania odkrycia Alexy i obsługi go, zwracając odpowiedź „I am Wemo”.
#include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection #include "Wemulator.h" // Our Wemo emulator #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection Wemulator* wemulator; // wemo emulator IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //initialize the IR irSend = new IRsend(IR_PIN, false); irSend->begin(); //initialize wemo emulator wemulator = new Wemulator(); //connect to wifi if (wifi->connect()) { wemulator->begin(); //start the wemo emulator (it runs as a series of webservers) wemulator->addDevice("tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("television", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my television", new WemoCallbackHandler(&commandReceived)); } } /*---------------------------------------*/ //Runs constantly void loop() { //let the wemulator listen for voice commands if (wifi->isConnected) { wemulator->listen(); } }Wstępne testy
Przetestuj to, co mamy do tej pory (wifi i emulator), uruchamiając to z Alexą. W tym samouczku założono, że Twoje urządzenie Alexa jest skonfigurowane i zainstalowane w Twoim domu.
Odkrycie testowe:
Powiedz Alexa „Alexa, odkryj urządzenia”.
Spowoduje to, że Alexa wyśle żądanie UDP do lokalnej sieci Wi-Fi, skanując w poszukiwaniu Wemos i innych kompatybilnych urządzeń. Żądanie to powinno zostać odebrane w wywołaniu wemulator->listen(); w funkcji loop(). To z kolei kieruje go do metody handleUDPPacket(*) . Odpowiedź jest wysyłana w nextUDPResponse() . Zwróć uwagę na treść tej odpowiedzi:
const char UDP_TEMPLATE[] PROGMEM = "HTTP/1.1 200 OK\r\n" "CACHE-CONTROL: max-age=86400\r\n" "DATE: Sun, 20 Nov 2016 00:00:00 GMT\r\n" "EXT:\r\n" "LOCATION: http://%s:%d/setup.xml\r\n" "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n" "01-NLS: %s\r\n" "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" "ST: urn:Belkin:device:**\r\n" "USN: uuid:Socket-1_0-%s::urn:Belkin:device:**\r\n\r\n";To jest kod, który mówi Alexie „Jestem Wemo (Belkin), jak mogę ci pomóc?” Gdy Alexa otrzyma tę odpowiedź, wie i pamięta, że przyszłe polecenia inteligentnego domu mogą być kierowane do tego urządzenia.
Dane wyjściowe debuggera szeregowego w tym momencie powinny wyglądać jak na poniższym obrazku. Po zakończeniu wykrywania Alexa werbalnie poinformuje Cię, że „wykryła [N] urządzeń” w Twojej sieci.
W funkcji setup() zwróć uwagę na następujący fragment:
new WemoCallbackHandler(&commandReceived)To jest wywołanie zwrotne, w którym przechwycimy polecenia od Alexy. Jego treść jest zdefiniowana w WemoCallbackHandler.h (WemoCallbackHandler::handleCallback). Po przechwyceniu polecenia od Alexy możemy z nim zrobić, co nam się podoba. W poprzednich wierszach ustawiliśmy możliwe polecenia, których można użyć, za pomocą następujących wierszy kodu:
wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");Są to więc 4 oddzielne „serwery” lub słuchacze, których używamy na chipie. Ustawia to możliwość wypowiedzenia dowolnego z następujących poleceń Alexa:
Alexa, włącz tv Alexa, wyłącz tv Alexa, włącz telewizor Alexa, wyłącz telewizor Alexa, włącz mój telewizor Alexa, wyłącz mój telewizor Alexa, włącz mój telewizor Alexa, wyłącz mój telewizor
I tak to przetestujemy. Spodziewamy się, że wypowiedzenie któregokolwiek z tych poleceń powinno obudzić nasz kod i wprowadzić wywołanie zwrotne, w którym możemy zrobić z nim to, co nam się podoba.
Dodaj polecenie IR
Teraz, gdy otrzymujemy polecenie, pora zająć się nim… włączając/wyłączając nasz telewizor. Więc to będzie wszystko — wifi, emulator wemo i IR — wszystko razem. Mój telewizor to LG, więc wyszukałem odpowiednią sekwencję do włączania/wyłączania i wysłałem ją za pomocą funkcji sendNEC naszej biblioteki IR (LG używa protokołu NEC). Kodowanie/dekodowanie IR jest samo w sobie odrębnym tematem, w którym wiadomość jest kodowana w modulacji sygnału; jest to specyfikacja bardzo precyzyjnych czasów, znaków i spacji. Każdy producent ma tendencję do używania własnego, zastrzeżonego protokołu dla poleceń i z różnymi czasami; jest to dość interesujące i można sięgnąć głębiej, zaglądając do kodu źródłowego tej biblioteki IR, googlowania itp. Ale ku naszej wygodzie, szczegóły wszystkich, którymi zajmuje się nasza biblioteka IR.
Twój telewizor to nie LG? Po prostu wygoogluj poprawny kod. Oto polecenie dla telewizorów Sony (zastrzeżenie: nie testowane):
irSend.sendSony(0xa90, 12);Jeśli chcesz naprawdę zrobić to sam, możesz skonfigurować odbiornik podczerwieni, skierować na niego pilota (lub dowolny nadajnik podczerwieni) i odkodować kody, które wysyła; to jednak inny samouczek.
Test od końca do końca
- Umieść Alexę w dowolnym miejscu, w którym może Cię usłyszeć.
- Umieść ESP8266 z dołączoną diodą IR, w zasięgu pilota telewizora.
- Powiedz „Alexa, odkryj urządzenia”. Poczekaj, aż zgłosi sukces (powinien wykryć co najmniej jedno urządzenie).
- Powiedz "Alexa, włącz mój telewizor" lub "Alexa, wyłącz mój telewizor".
Alexa powinna zrozumieć twoje polecenie (jako polecenie smarthome, a nie skierowane do konkretnej umiejętności), wyszukać lokalne urządzenie, które je obsłuży, i wysłać polecenie do urządzenia (twojego ESP8266). Twoje urządzenie powinno go odebrać i wysłać polecenie pilota do telewizora. Możesz zobaczyć swoją diodę przez kamerę w telefonie komórkowym, aby upewnić się, że emituje.
Ponieważ kod IR do wyłączenia telewizora jest taki sam, jak kod do jego włączenia, nie ma znaczenia, czy wydasz polecenie włączenia, czy wyłączenia. To ten sam kod i przełącza stan. Jeśli telewizor jest wyłączony, powinien się włączyć, a jeśli jest włączony, powinien się wyłączyć.
Rozwiązywanie problemów
Czy masz połączenie z Wi-Fi?
Czy wpisałeś poprawną nazwę użytkownika/hasło w poprawnych wartościach zmiennych?
//SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";Czy otrzymujesz komunikat o błędzie lub jakiś błąd przez port szeregowy debugowania podczas łączenia się z Wi-Fi?
Czy Twoje Wifi jest włączone i czy możesz połączyć się z nim w inny zwykły sposób?
Czy Twoje urządzenie jest wykrywane przez Alexę?
Alexa wyśle prośby o wykrycie urządzeń, gdy powiesz „Alexa, odkryj urządzenia”.
Twoja Alexa musi być poprawnie skonfigurowana i skonfigurowana oraz podłączona do tej samej sieci Wi-Fi, co ESP8266.
Zajrzyj do Fauxmo.h. Zobacz funkcję Fauxmo::handle(). Jest to pierwszy kod, który zostanie uruchomiony, gdy ESP8266 usłyszy wezwanie. Umieść komunikaty debugowania, aby sprawdzić, czy jakiś kod po
if (len > 0) {biegnie. Jeśli nie, to polecenie nie jest odbierane. Jeśli tak, wygląda na to, że polecenie jest odbierane, ale nie jest prawidłowo obsługiwane. Postępuj zgodnie z kodem stamtąd, aby dowiedzieć się, na czym polega problem.
Czy masz w swojej sieci wiele innych wykrywalnych urządzeń? Zbyt wiele może spowodować, że wykrywanie będzie przebiegać wolniej, a czasem nawet zakończyć się niepowodzeniem.
Czy Twoje urządzenie odbiera polecenie?
Po wydaniu polecenia „Alexa, włącz telewizor” wykonanie powinno polegać na wprowadzeniu Twojego WemoCallbackHandler::handleCallback handler (w pliku WemoCallbackHandler.h). Jeśli jeszcze tego nie zrobiłeś, spróbuj wyświetlić tam jakiś komunikat debugowania, aby upewnić się, że jest uruchamiany po wydaniu polecenia. Spróbuj również upewnić się, że Alexa wie o Twoim urządzeniu, mówiąc „Alexa, odkryj urządzenia” przed wydaniem polecenia. W tym kroku założono, że wykrywanie urządzenia powiodło się.
Czy dioda IR emituje?
Jak opisano wcześniej, jeśli uważasz, że Twoje urządzenie powinno emitować, skieruj na nie aparat telefonu komórkowego i spójrz na diodę przez kamerę. Choć w rzeczywistości nic nie widać, w aparacie powinno to wyglądać jak normalne światło zapalające się i migające. Jeśli to widzisz, to emituje… coś.
Czy sygnał podczerwieni jest odwrócony?
Twoja dioda IR może być podłączona w taki sposób, że sygnał jest zasadniczo odwrócony. Proszę o wyrozumiałość w moich wyjaśnieniach, ponieważ nie jestem elektronikiem ani okablowaniem, ale w wyniku złego podłączenia diody światło IR będzie domyślnie włączone, ale wyłączone, gdy biblioteka IRSend zamierza się włączyć to na. W takim przypadku światło podczerwone powinno być domyślnie włączone (widoczne przez kamerę) po uruchomieniu kodu setup() , ale zanim cokolwiek innego się wydarzy. Jeśli miałbyś zakomentować cały kod wewnątrz loop() , powinieneś widzieć, że pozostaje on stale włączony.
Aby wyraźniej zobaczyć, jak to naprawić, przejdź do folderu library/IRemoteESP8266/src w kodzie samouczka. Zobacz konstruktora:
IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }Mówimy o „odwróconym” argumencie i logice, która go obsługuje. Jeśli twoje okablowanie jest odwrócone, najłatwiejszym rozwiązaniem jest wprowadzenie niewielkiej zmiany w kodzie, aby to umożliwić (zamiast ponownego okablowania… ale oczywiście możesz to zrobić, jeśli wolisz). Po prostu zmień tę linię w AlexaTvRemote.ino:
//initialize the IR irSend = new IRsend(IR_PIN, false);do
//initialize the IR irSend = new IRsend(IR_PIN, true);Czy masz odpowiedni kod i polecenie pilota?
Jeśli wszystko inne wydaje się być w porządku, ale telewizor po prostu nie jest posłuszny, prawdopodobnie coś jest nie tak z kodem IR. Wypróbuj różne wywołania funkcji na tym interfejsie biblioteki IR (np. sendLG , sendPanasonic , sendSharp , itp.) lub upewnij się, że ten, którego używasz, pasuje do Twojego sprzętu. Jest bardzo mało prawdopodobne, że sprzęt twojego telewizora nie jest obsługiwany przez tę bibliotekę, ale myślę, że jest to technicznie możliwe.
Upewnij się, że wysyłany kod jest odpowiedni dla Twojego sprzętu. Być może będziesz musiał kopać w google, aby znaleźć właściwy. Jeśli wszystko inne zawiedzie, zawsze istnieje możliwość wykrycia kodu emitowanego z działającego pilota po naciśnięciu przycisku zasilania — ale to inny samouczek i wymaga innego sprzętu.
Zawijanie
Mam nadzieję, że wszystko się ułożyło. Jeśli tak (a może nawet jeśli nie), to był to dobry sposób na wycięcie zębów na kilka tematów jednocześnie:
- Alexa
- Programowanie wbudowane
- Układ ESP8266
- IDE Arduino
Oczywiście masz też niewielką wygodę, jaką jest możliwość włączania / wyłączania telewizora za pomocą polecenia głosowego.
Dlaczego hack?
Dlaczego jest to hack, a nie część podstawowego interfejsu API dla Alexy? Po nauczeniu się, jak rozwinąć moją pierwszą umiejętność Alexy, wszystko, co naprawdę chciałem wiedzieć, to „jak mogę po prostu wysłać polecenie bezpośrednio z Alexy do innego urządzenia w sieci?” Szkoda, że Amazon nie ujawnił pełnoprawnego API do komunikacji między urządzeniem Alexa a innymi obiektami w sieci lokalnej, bez przechodzenia przez paradygmat „umiejętności” lub „inteligentnego domu” (w którym wszystko musi być wysłane do AWS przed zrobieniem czegokolwiek), ale po prostu tego nie zrobili.
Spróbuj pójść dalej
Wypróbuj zestaw poleceń zdalnego sterowania, aby w pełni kontrolować telewizor, na przykład zmiana kanału i regulacja głośności. Przetestuj ograniczenia chipa, sprawdzając, ile różnych poleceń możesz słuchać na jednym ESP8266 (wskazówka: liczba ledwo łamie dwucyfrowe, bez bardzo sprytnego programowania). Jeśli jesteś dobry ze sprzętem, spróbuj sterować innymi urządzeniami nie przez IR, podłączając je bezpośrednio do układów ESP8266; jak oświetlenie i takie tam. Odkryj na nowo wemo!
- Jak stworzyłem w pełni funkcjonalną stację pogodową Arduino?
- Praca z próbkowaniem dźwięku ESP32
