IoT Geliştirmeye Başlayın: Bir ESP8266 Arduino Eğitimi

Yayınlanan: 2022-03-11

Bu ESP8266 Arduino öğreticisinin amacı, IoT alanında erişilebilirliği ve kullanım kolaylığı nedeniyle yapımcı topluluğu (ve genel olarak geliştiriciler) arasında süper popüler hale gelen bir çip üzerinde Arduino ile gömülü programlamaya aşina olmaktır. Öğretici aynı zamanda Alexa'nın teklifimizi evde yapmasını sağlamak için resmi olmayan bir "hack" kullanarak Alexa ile ellerimizi kirletiyor (bu teknik üretimde kullanım için değil, sadece evde gösterim için). Bunu evde deneyin, ama işte değil.

ESP8266 Arduino öğreticisinin soyut grafik gösterimi

Bu tekniğin güzelliği, Alexa'nın neredeyse kelimenin tam anlamıyla elektrikle çalışan her şeyi otomatikleştirmesini sağlamak için onu kendi evlerimizde kullanabilmemizdir. Ek bir bonus olarak, bugünlerde ana akım programcılar arasında pek yaygın olmayan bir beceri olan Arduino ile gömülü programlama hakkında bir fikir ediniyoruz. Son olarak, kendi işini yapanların favorisi olan popüler ESP8266 çipiyle çalışmaya başlıyoruz; Bu proje için ihtiyaç duyacağımız yerleşik bir Wifi çipi ile her türlü şeyi çalıştırabilen inanılmaz küçük bir çip. Alexa cihazının ve çipin birbirleriyle doğrudan iletişim kurmasını sağlayacak olan şey budur.

Alexa programlama hakkında biraz bilgi: Alexa "becerileri" programlama modeli şu şekilde çalışır:

Alexa'nın soyut grafik gösterimi

  • Alexa'nla konuşuyorsun.
  • Alexa, konuşmanızı Amazon'un bulutuna kadar yönlendirir.
  • Konuşma komutu bir Alexa "yeteneğine" (Amazon'un bulutunda çalışan bir program) yönlendirilir.

Alexa "yeteneği", komutun yönetimini üstlenir; normalde Alexa cihazına geri gönderilen bir yanıtla sonuçlanır ve yanıt olarak kullanıcıya bir şey söylemesine neden olur. Alexa IoT durumunda, komut Amazon'un bulutundaki bir "cihaz gölgesine" yönlendirilir ve sonunda evinizdeki başka bir cihaza bir yanıt gönderilir. Tüm bunları hack'imizle atlıyoruz. Alexa cihazının evimizin içindeki ESP8266 çipimizle, buluta hiçbir şey göndermeden ve geri göndermeden doğrudan konuşmasını sağlamak istiyoruz. Alexa'nın yalnızca ev wifi ağımızın üzerinden ve içinden ESP8266'mıza doğrudan bir istek göndermesini istiyoruz.

Hack'imiz aslında bir sır değil. ESP8266'mızı, yukarıda açıklanan tüm Amazon bulut iletişimini atlayarak, Amazon ile doğrudan Alexa cihazıyla iletişim kurmasına izin veren özel bir lisansa sahip bir cihaz olan bir Wemo Belkin'i "taklit" ettireceğiz.

Bir Wemo gibi davranan ESP8266'mız, komutları doğrudan Alexa'dan alabilme ayrıcalığına sahiptir.

ESP8266 Arduino Eğitimimiz için Temel Plan

  • Uyumlu cihazlar için yerel wifi ağında problar gönderen Alexa cihazı için ESP8266'yı dinleyin ve bu problara "Ben bir Wemo'yum" diyerek yanıt verin.
  • Alexa cihazı tarafından güvenildiğinde, söz konusu cihazdan gelen diğer komutları dinleyin. IR vericisi aracılığıyla IR kodları göndererek, TV'mizi açıp kapatarak bunları halledin.

Donanım Gereksinimleri

Alexa kulesi ve Arduino kartı dahil olmak üzere donanım parçalarının soyut grafik gösterimi

Bu öğreticiyi tamamlamak için, hepsini elde etmesi kolay olan bazı öğeleri kendi başınıza almanız gerekecek.

  • Herhangi bir Alexa cihazı. Bu öğreticiyi bir Alexa Dot ile geliştirdim. Öğretici bir Yankı simülatörü ile çalışacak mı? Olabilir! (Ama test etmedim). Maceracı (veya tutumlu) hissediyorsanız bir deneyin. Alexa cihazı cep harçlığına mal olur, ancak Echosim'in kullanımı ücretsizdir.
  • Bir ESP8266 yongası. Bu yazının yazıldığı sırada sadece birkaç USD'ye mal oldular. Bunları Ebay'den veya çevrimiçi olarak iyi stoklanmış herhangi bir donanım mağazasından alabilirsiniz.
  • Bir IR (kızılötesi) diyot. Bunu ESP8266 çipinize bağlamanız gerekecek ve bunu kendiniz yapmanız gerekecek. Bu proje için sadece gönderme yeteneklerine ihtiyacımız var; IR almayı umursamıyoruz. Bu öğreticinin çalışması için diyotu GND'ye bağladığınızdan ve 0 çıktısını aldığınızdan emin olun. (Başka bir şekilde yaparsanız, sorun değil, ancak eğitim kodunu buna göre değiştirmekten de sorumlu olmanız gerekir. Bu bağlantı size yardımcı olabilir. ESP8266'da kullanılan numaralandırma şeması nedeniyle pin 0'ın farkında olun. “D3” olarak etiketlenebilir.
  • Bir tarafı USB olan (geliştirici bilgisayarınıza takmak için) ve diğer tarafı ESP8266 yongasına uyan bir seri adaptör.
  • Kullanıcı adını ve şifreyi bildiğiniz yerel bir wifi ağı.

Adaptöre takılı ESP8266'nın fotoğrafı, Echo Dot'un yanında
Adaptöre bağlı ESP8266, Echo Dot'un yanında

IR diyot takılı ESP8266'nın fotoğrafı
IR diyot takılı ESP8266

Arduino Yazılım Araçları

  • Arduino IDE'si. Windows dahil tüm büyük işletim sistemleri için sürümler vardır. Bu öğretici Ubuntu sürümünde geliştirildi, ancak Arduino'yu Windows'a da kurdum ve kullandım, sorun yok.
  • Arduino için ESP8266 geliştirme kitaplığı.
  • Sürücüler. Neyse ki, bağdaştırıcınızın sürücüleri büyük olasılıkla tak ve çalıştır olmalıdır, bu nedenle ek sürücü gerekmez.

Herşeyi Ayarlamak

  • Arduino IDE'yi yükleyin.
  • Boards Manager'ı kullanarak ESP8266 kitaplığını kurun.

Boards Manager kullanarak ESP8266 kitaplığını kurmak için:

  • Arduino IDE'de File -> Preferences'ı açın.
  • Bu URL'yi "Ek Kart Yönetici URL'si"ne girin: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Tamam'ı tıklayın

Boards Manager URL'leri alanını vurgulayan ESP8266 Arduino öğretici ekran görüntüsü

  • Pano Yöneticisi'ne gidin ( Araçlar -> Pano: [geçerli pano] -> Pano Yöneticisi ).

    Pano Yöneticisi menü öğesini vurgulayan ekran görüntüsü

  • "Filtre" metin kutusuna "ESP8266" yazın.
  • Ek pano yöneticisi eklediğinize göre artık “esp8266” için bir giriş almalısınız. Seçin ve "yükle" ye tıklayın.

Kurulum sürecini vurgulayan Boards Manager'ın ESP8266 Arduino öğretici ekran görüntüsü

  • Bir süre bekleyin; her şeyi indirmek biraz zaman alır.
  • Arduino IDE'nizi yeniden başlatın.
  • Araçlar -> Pano: öğesini açın ve bu sefer “Genel ESP8266 Modülü”ne gidin ve onu seçin.

Genel ESP8266 Modülü için menü seçeneğini vurgulayan ESP8266 Arduino öğretici ekran görüntüsü

Üçüncü Taraf Kitaplıkları Ekleme

Arduino, projenize harici kütüphaneler eklemek için birçok farklı yol veya onların dediği gibi “Sketch” sunar. Her şeyi olabildiğince basit tutmak için, bu eğitimde, sadece klasörleri kopyalamak olan en hızlı açıklamayı yapacağız. Eğitimin çalışması için tam olarak iki harici kitaplık eklememiz gerekecek: IRemoteESP8266 ve https://github.com/me-no-dev/ESPAsyncTCP.

  • GitHub'daki eğitim kodunda “kütüphaneler” dizinini bulun.
  • Arduino için kök kurulum dizininde (örneğin, C:\Program Files\Arduino), “libraries” alt dizinini bulun.
  • IRemoteESP8266 dizinini öğreticinin “kütüphaneler” dizininden Arduino'nun “kütüphaneler” dizinine kopyalayın.
  • ESPAsyncTCP dizinini öğreticinin “kütüphaneler” dizininden Arduino'nun “kütüphaneler” dizinine kopyalayın.
  • Arduino IDE'yi yeniden başlatın.

Artık IR iletimi ve zaman uyumsuz TCP kitaplıkları projeye dahil edilmiştir.

Ayarlar

Aşağıdaki resim, benim ve donanımım için çalışan ancak her kullanıcı için değişebilen tipik ayarları göstermektedir. Aşağıdaki ayarları deneyebilirsiniz, ancak bunları kendi çipinize ve adaptörünüze göre ayarlamanız gerekebilir. Örneğin benimki nodemcu, bu yüzden “ck” (varsayılan) olan sıfırlama yöntemini “nodemcu” olarak değiştirmek zorunda kaldım. Ayrıca, seri hata ayıklayıcıyı kullanabilmeniz için "hata ayıklama bağlantı noktası"nı "seri" olarak ayarlayın. Benimki çok tipik bir kurulum, bu yüzden benim ayarlarımı temel olarak kullanabilirsiniz; Derleme ve flash sürecini çalıştırmak için onlarla uğraşmak zorunda kalırsanız şaşırmayın diyorum.

Seri hata ayıklama bağlantı noktası menü seçeneğinin ekran görüntüsü

Kurulumunuzu ESP8266 Hello World ile Kanıtlayın

Arduino projeleri bir .ino dosyasıyla başlar. .ino dosyası iki giriş noktası tanımlar: kurulum ve döngü. “Merhaba dünyamız” için, kodumuzun çalıştığını doğrulamak için ESP8266'da biraz ışık yakacağız.

 //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); }

Kodu Derleyin ve Flashlayın

Şimdiye kadarki kurulumunuz doğruysa, derlemek ve flaş yapmak kolay adımlardır. Flashlama yapmadan derlemek için Arduino menüsünden Sketch -> Verify/Compile seçeneğine gidin.

Sketch menüsündeki Upload menü seçeneğinin ekran görüntüsü

Kodu çipe flashlamak ve derlemek için Arduino menüsünden Sketch -> Upload'ı seçin.

Devam eden yüklemenin ekran görüntüsü

Flaş başarılı olursa, %0'dan %100'e giden bir ilerleme göstergesi göreceksiniz, bu süre zarfında çipinizdeki LED büyük olasılıkla yanıp sönecek veya yanıp sönecektir.

Seri hata ayıklamanın çalıştığını test etmek için:

  • Öncelikle hata ayıklama bağlantı noktasının Seri ( Tools -> Debug port ) olarak ayarlandığından emin olun.
  • Kodunuz çipe yanıp sönmeyi bitirdikten sonra Tools -> Serial Monitor öğesini seçin.

Seri hata ayıklama bağlantı noktası menü seçeneğinin ekran görüntüsü

Başarılı bir başlangıçtan sonra seri hata ayıklayıcının çıktısı:

Başarılı bir başlangıçtan sonra seri hata ayıklayıcı çıktısının ekran görüntüsü

Harika, işe yarıyor; sonra, IR çıkışımızı doğrulamak istiyoruz. Kızılötesi vericimiz aracılığıyla bir sinyal gönderelim ve sinyalin geldiğini doğrulayalım.

Bize yardımcı olması için mevcut bir Arduino IR kütüphanesini kullanacağız. Arduino ile ilgili harika şeylerden biri, kitaplıkları ve modülleri içeri ve dışarı yerleştirmenin ne kadar kolay olduğudur. Bir C++ çerçevesi için çok canlandırıcı!

Arduino'ya yüklemek için Git deposunun README dosyasındaki talimatları izleyin.

Bu kod sadece IR vericisini art arda yanıp söner. IR insan gözüyle görülmez, ancak bunu test etmek için bir profesyonel ipucu var; bu kodu çalıştırın, (hata ayıklayıcı aracılığıyla) çipinizde çalıştığını doğrulayın ve ardından mobil cihazınızın kamerasını açın. Kameranız aracılığıyla doğrudan IR diyot ampulüne bakın. Çalışıyorsa, ampulün gözle görülür şekilde açılıp kapandığını görmelisiniz. Bunu, çalışan herhangi bir uzaktan kumandayla da deneyebilirsiniz (örneğin, standart bir TV uzaktan kumandası). Aşağıdaki kod, IR ampulünün her 0,5 saniyede bir yanıp sönmeye başlamasına neden olmalıdır. Aslında LG açma/kapama komutunu gönderir, bu nedenle yakınlardaysa LG TV'nizi gerçekten kapatıp açabilir.

 #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); }

ESP8266 Eğitimine Başlayın

Şimdiye kadar her şey işe yaradıysa, temel ekipmanımızın ve kurulumumuzun çalıştığından memnun olabileceğimizi düşünüyorum ve öğreticinin etine başlamaya hazırız.

Wifi'ye bağlan

İlk olarak, yerel wifi'ye bağlanmamız gerekecek. Aşağıdaki kod Wifi'ye bağlanmayı dener ve bağlantının başarılı olduğunu bildirir (seri hata ayıklayıcı aracılığıyla). Kod örneğinde myWifiSsid'in değerini wifi ağınızın kullanıcı adıyla değiştirmeyi ve myWifiPassword'ün değerini doğru parolayla değiştirmeyi unutmayın.

 #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() { }

Wemo Sunucusunu Çalıştırın

Bağlı mı? İyi. Şimdi projenin özüne geliyoruz: Wemo sunucusu.

Kendi Wemo Emülatörüm, bu eğitimin kaynak dosyalarına dahil edilmiştir. Artık Google'da arama yapabilir ve daha basit bir Wemo öykünücüsü bulabilirsiniz. Daha az kod kullanılarak yazılmış ve anlaşılması kolay bir tane bulabilirsiniz. Her halükarda, incelemekten, denemekten, kendinizinkini yazmaktan vb. çekinmeyin. Bu, bu öğreticiyi size özel kılmanın bir parçasıdır.

Benimkinin arkasındaki mantık, ESPAsyncTCP kullanmasıdır. Bu neden iyi? ESP8266'da güvenilmez hale gelmeye başlamadan önce bu yöntemi kullanarak çalıştırabileceğiniz yalnızca çok sayıda sunucu (veya cihaz) var, Alexa'nın cihazları kaybetmeye başlaması (onları bulamaması), komutların düşmesi ve performans yavaş olur. Bu sayının ESPAsyncTCP kitaplığı kullanılarak maksimize edildiğini görüyorum.

Onsuz, yaklaşık 10-12 cihazda sızma konusunda güvenilmez buldum; bununla birlikte, bu sayının 16 civarında olduğunu görüyorum. Bu öğreticiyi genişletmek ve çipin yapabileceklerinin sınırlarını keşfetmek isterseniz, benim sürümümü kullanmanızı tavsiye ederim. Sadece kendi anlayışınız için daha basit bir versiyon görmek istiyorsanız, Google'da “wemo emülatörü Arduino” aratmaktan çekinmeyin; bir sürü örnek bulmalısın.

Şimdi ESPAsyncTCP kütüphanesini kurmamız gerekiyor. IR kitaplığını yaptığımız gibi kurun; Git sayfasına gidin ve talimatları izleyin.

Bu kütüphane benim esp8266 arduino örnek koduma da dahil edilmiştir. İşte sadece wifi bağlantısını açmak, Alexa keşif talebini dinlemek ve bir "Ben Wemo'yum" yanıtı vererek işlemek için kod.

 #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(); } }

Ön Test

Şu ana kadar sahip olduklarımızı (wifi ve emülatör) Alexa ile çalıştırarak test edin. Bu eğitim, Alexa cihazınızın evinize kurulduğunu ve kurulduğunu varsayar.

Test keşfi:

Alexa'ya "Alexa, cihazları keşfet" deyin.

Bu, Alexa'nın yerel wifi ağınızda bir UDP isteği yayınlamasına, Wemos ve diğer uyumlu cihazları taramasına neden olur. Bu istek, wemulator->listen(); çağrısında alınmalıdır. döngü() işlevinde. Bu da onu Wemulator'ın handleUDPPacket(*) yöntemine yönlendirir. nextUDPResponse() yönteminde bir yanıt gönderilir. Bu yanıtın içeriğine dikkat edin:

 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";

Bu, Alexa'ya “Ben bir Wemo'yum (Belkin), size nasıl yardımcı olabilirim?” diyen koddur. Alexa bu yanıtı aldığında, gelecekteki akıllı ev komutlarının bu cihaza yönlendirilebileceğini bilir ve hatırlar.

Bu noktada seri hata ayıklayıcının çıktısı aşağıdaki resimdeki gibi görünmelidir. Keşfetmeyi bitirdiğinde, Alexa sözlü olarak ağınızda "[N] cihaz keşfettiğini" söyleyecektir.

Alexa çıktısının ekran görüntüsü

setup() işlevinde aşağıdaki pasajı not edin:

 new WemoCallbackHandler(&commandReceived)

Bu, Alexa'dan komutları alacağımız geri aramadır. Gövdesi WemoCallbackHandler.h (WemoCallbackHandler::handleCallback) içinde tanımlanmıştır. Alexa'dan bir komut aldığımızda, onunla istediğimizi yapabiliriz. Bundan önceki satırlarda, şu kod satırlarıyla kullanılabilecek olası komutları ayarladık:

 wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");

Yani bunlar çip üzerinde çalıştırdığımız 4 ayrı “sunucu” veya dinleyicidir. Bu, Alexa'ya aşağıdaki komutlardan herhangi birini söyleme yeteneğini ayarlar:

Alexa, televizyonu aç Alexa, televizyonu kapat Alexa, televizyonu aç Alexa, televizyonu kapat Alexa, televizyonumu aç Alexa, televizyonumu kapat Alexa, televizyonumu aç Alexa, televizyonumu kapat

Ve bu şekilde test edeceğiz. Bu komutlardan herhangi birinin kodumuzu uyandırmasını ve onunla istediğimizi yapabileceğimiz o geri aramayı girmesini bekliyoruz.

Bir komut söylediğinizde ne olduğuna dair ekran görüntüsü

IR Komutunu ekleyin

Komutu aldığımıza göre, şimdi TV'mizi açıp/kapatarak bunu halletmenin zamanı geldi. Yani bu her şey olacak—wifi, wemo emülatörü ve IR—hepsi bir araya getirildi. Televizyonum bir LG, bu yüzden açmak/kapatmak için uygun sıraya baktım ve bunu IR kitaplığımızın sendNEC işlevi aracılığıyla gönderdim (LG, NEC protokolünü kullanır). IR kodlama/kod çözme, kendi içinde ayrı bir konudur, burada bir mesaj, bir sinyalin modülasyonunda kodlanır; çok kesin zamanlamaların, işaretlerin ve boşlukların bir özelliğidir. Her üretici, komutlar için ve farklı zamanlamalarla kendi özel protokolünü kullanma eğilimindedir; oldukça ilginç ve bu IR kitaplığının kaynak koduna, googling'e vb. bakarak daha derine inebilirsiniz. Ancak kolaylık olması açısından, IR kitaplığımız tarafından bizim için halledilen her şeyin ayrıntıları.

TV'niz bir LG değil mi? Sadece doğru kodu google. İşte Sony TV'ler için komut (uyarı: test edilmedi):

 irSend.sendSony(0xa90, 12);

Gerçekten kendiniz yapmak istiyorsanız, bir IR alıcısı kurabilir, uzaktan kumandanızı (veya herhangi bir IR vericisini) ona doğrultabilir ve gönderdiği kodların kodunu çözebilirsiniz; bu farklı bir öğretici olsa da.

Uçtan Uca Test

  • Alexa'nızı sizi duyabileceği bir yere yerleştirin.
  • ESP8266'nızı, bağlı IR diyot ile TV'nin uzaktan kumanda aralığı içine yerleştirin.
  • "Alexa, cihazları keşfet" deyin. Başarı bildirmesini bekleyin (en az bir cihaz keşfetmiş olmalıdır).
  • "Alexa, televizyonumu aç" veya "Alexa, televizyonumu kapat" deyin.

Alexa, komutunuzu anlamalı (belirli bir beceriye yönelik olmayan bir akıllı ev komutu olarak), onu işlemek için yerel bir cihaz aramalı ve komutu cihaza göndermelidir (ESP8266'nız). Cihazınız bunu almalı ve uzaktan kumanda komutunu TV'ye göndermelidir. Yayıldığından emin olmak için diyotunuzu bir cep telefonu kamerasıyla görüntüleyebilirsiniz.

TV'yi kapatmak için IR kodu, onu açmak için kullanılan kodla aynı olduğundan, “açma” veya “kapatma” komutunu vermenizin bir önemi yoktur. Aynı kod ve durumu değiştirir. TV kapalıysa açılması, açıksa kapanması gerekir.

Sorun giderme

Wifi'ye bağlı mısınız?

Doğru değişken değerlerine doğru kullanıcı adını/şifreyi girdiniz mi?

 //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";

Wifi'ye bağlanırken seri hata ayıklama bağlantı noktasından bir hata mesajı veya herhangi bir hata mı alıyorsunuz?

Wifi'niz açık mı ve ona başka herhangi bir sıradan yolla bağlanabiliyor musunuz?

Cihazınız Alexa tarafından mı keşfediliyor?

Alexa, "Alexa, cihazları keşfet" dediğinizde cihazları keşfetme istekleri gönderir.

Alexa'nız doğru şekilde yapılandırılmalı ve kurulmalı ve ESP8266'nızla aynı Wifi ağına bağlı olmalıdır.

Fauxmo.h'ye bakın. Fauxmo::handle() işlevine bakın. Bu, ESP8266 çağrıyı duyduğunda çalışacak ilk koddur. Daha sonra herhangi bir kod olup olmadığını görmek için hata ayıklama mesajlarını girin

 if (len > 0) {

çalışıyor. Değilse, komut alınmıyor. Öyleyse, komutun alındığı ancak doğru şekilde işlenmediği anlaşılıyor. Sorunun ne olduğunu bulmak için oradan kodu izleyin.

Ağınızda keşfedilebilir başka birçok cihazınız var mı? Çok fazla olması, keşfin daha yavaş çalışmasına ve hatta bazen başarısız olmasına neden olabilir.

Cihazınız komutu alıyor mu?

“Alexa, televizyonumu aç” komutunu verdiğinizde, yürütme WemoCallbackHandler::handleCallback handler (WemoCallbackHandler.h dosyasında) giriyor olmalıdır. Bunu yapmadıysanız, komutunuzu verdiğinizde tetiklendiğinden emin olmak için orada bir hata ayıklama mesajı çıktısı almayı deneyin. Ayrıca, komutunuzu vermeden önce "Alexa, keşfet cihazları" diyerek Alexa'nın cihazınız hakkında bilgi sahibi olmasını sağlayın. Bu adım, cihaz keşfinin başarılı olduğunu varsayar.

IR diyot yayıyor mu?

Daha önce anlatıldığı gibi, cihazınızın yayması gerektiğini düşündüğünüzde, cep telefonunuzun kamerasını cihaza doğrultun ve kameradan diyota bakın. Gerçek hayatta hiçbir şey göremeseniz de, kamera aracılığıyla yanan ve yanıp sönen normal bir ışık gibi görünmelidir. Bunu görürseniz, o zaman bir şey yayıyor demektir.

IR sinyali ters mi?

IR diyotunuz, sinyal esasen tersine çevrilecek şekilde kablolanmış olabilir. Elektronik veya kablo tesisatçısı olmadığım için lütfen açıklamama katlanın, ancak diyotun yanlış bağlanmasının sonucu, IR ışığının varsayılan olarak AÇIK olacağı, ancak IRSend kitaplığı niyetlendiğinde KAPALI olacağı olacaktır. üstünde. Bu durumda, setup() kodu çalıştıktan sonra, ancak başka bir şey olmadan önce IR ışığınız varsayılan olarak açık olmalıdır (kamera aracılığıyla görünür). loop() içindeki tüm kodu yorumlayacaksanız, sürekli açık kaldığını görmelisiniz.

Bunu nasıl düzelteceğinizi daha net görmek için eğitim kodunun library/IRemoteESP8266/src klasörüne gidin. Yapıcıya bakın:

 IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }

"Ters çevrilmiş" argüman ve onu ele alan mantık, bahsettiğimiz şeydir. Kablolamanız ters ise, en kolay çözüm, buna izin vermek için kodda küçük bir değişiklik yapmaktır (yeniden kablolamak yerine… ama tabii isterseniz bunu yapabilirsiniz). Sadece bu satırı AlexaTvRemote.ino'da değiştirin:

 //initialize the IR irSend = new IRsend(IR_PIN, false);

ile

 //initialize the IR irSend = new IRsend(IR_PIN, true);

Doğru uzaktan kumanda koduna ve komutuna sahip misiniz?

Her şey yolunda görünüyorsa, ancak TV buna uymuyorsa, büyük olasılıkla IR kodunda bir sorun vardır. Bu IR kitaplığı arabiriminde farklı işlev çağrıları deneyin (örneğin, sendLG , sendPanasonic , sendSharp vb.) veya kullandığınızın donanımınızla eşleştiğinden emin olun. Televizyonunuzun donanımının o kitaplık tarafından desteklenmemesi pek olası değil ama sanırım teknik olarak mümkün.

Gönderdiğiniz kodun donanımınız için doğru olduğundan emin olun. Doğru olanı bulmak için google'da biraz araştırma yapmanız gerekebilir. Her şey başarısız olursa, Güç düğmesine bastığınızda çalışan uzaktan kumandanızdan yayılan kodu algılama seçeneği her zaman vardır - ancak bu farklı bir öğreticidir ve farklı donanım gerektirir.

Toplama

Umarım her şey sizin için işe yaramıştır. Eğer öyleyse (ve belki de olmasa bile), bu aynı anda birkaç konuda dişlerinizi kesmenin iyi bir yolu olmuştur:

  • Alexa
  • Gömülü programlama
  • ESP8266 yongası
  • Arduino IDE'si

Ayrıca televizyonunuzu sesli komutla açıp kapatabilmeniz gibi belki biraz da rahatınız var tabii.

Neden Hack?

Bu neden Alexa'nın temel API'sinin bir parçası değil de bir hack'tir? İlk Alexa becerimi nasıl geliştireceğimi öğrendikten sonra, gerçekten bilmek istediğim tek şey "Alexa'dan ağdaki başka bir cihaza doğrudan nasıl komut gönderebilirim?" oldu. Amazon'un, "beceri" veya "akıllı ev" paradigmasından (burada her şeyin AWS'ye gönderilmesi gerektiği) geçmeden, Alexa cihazı ile yerel ağdaki diğer nesneler arasındaki iletişim için tam teşekküllü bir API'yi kullanıma sunmaması çok yazık. bir şey yapmadan önce), ama yapmadılar.

Daha İleriye Gitmeyi Deneyin

Kanal değiştirme ve ses seviyesini kontrol etme gibi televizyonunuzu daha tam olarak kontrol etmek için bir dizi uzaktan kumanda komutunu deneyin. Bir ESP8266'da kaç farklı komut dinleyebileceğinizi görerek çipin sınırlarını test edin (ipucu: çok akıllıca bir programlama olmadan sayı çift haneleri zar zor böler). Donanım konusunda iyiyseniz, diğer cihazları doğrudan ESP8266 yongalarına bağlayarak IR aracılığıyla kontrol etmeye çalışın; aydınlatma ve benzeri gibi. Wemo'yu yeniden icat edin!

İlişkili:
  • Tam İşlevli Bir Arduino Hava İstasyonunu Nasıl Yaptım?
  • ESP32 Ses Örnekleme ile Çalışmak