Memulai Pengembangan IoT: Tutorial Arduino ESP8266
Diterbitkan: 2022-03-11Tujuan dari tutorial Arduino ESP8266 ini adalah untuk membiasakan diri dengan pemrograman tertanam dengan Arduino pada sebuah chip yang menjadi sangat populer di kalangan komunitas pembuat (dan pengembang pada umumnya) untuk aksesibilitas dan kemudahan penggunaan di ruang IoT. Tutorial juga membuat tangan kita kotor dengan Alexa menggunakan "peretasan" tidak resmi untuk membuat Alexa melakukan penawaran kami di rumah (teknik ini tidak dimaksudkan untuk digunakan dalam produksi, hanya untuk demonstrasi di rumah). Cobalah ini di rumah, tetapi tidak di tempat kerja.
Keindahan teknik ini adalah kita dapat menggunakannya di rumah kita sendiri untuk membuat Alexa mengotomatisasi hampir semua hal yang menggunakan listrik. Sebagai bonus tambahan, kami mendapatkan wawasan tentang pemrograman tertanam dengan Arduino, keterampilan yang mungkin tidak begitu umum di kalangan pemrogram arus utama akhir-akhir ini. Akhirnya, kami mulai bekerja dengan chip ESP8266 yang populer, favorit di kalangan do-it-yourselfers; itu adalah chip kecil yang luar biasa dengan kemampuan untuk menjalankan segala macam hal, dengan chip Wifi built-in yang akan kita perlukan untuk proyek ini. Itu yang akan memungkinkan perangkat Alexa dan chip untuk berkomunikasi satu sama lain secara langsung.
Hanya beberapa latar belakang tentang pemrograman Alexa: Model pemrograman "keterampilan" Alexa berfungsi seperti ini:
- Anda berbicara dengan Alexa Anda.
- Alexa mengarahkan pidato Anda kembali ke cloud Amazon.
- Perintah ucapan diarahkan ke "keterampilan" Alexa (program yang berjalan di cloud Amazon).
"Keterampilan" Alexa mengambil alih penanganan perintah; biasanya itu menghasilkan respons yang dikirim kembali ke perangkat Alexa, menyebabkannya mengatakan sesuatu kepada pengguna sebagai respons. Dalam kasus Alexa IoT, perintah akan dialihkan ke "bayangan perangkat" di cloud Amazon, yang pada akhirnya menghasilkan respons yang dikirim ke beberapa perangkat lain di rumah Anda. Kami melewati semua itu dengan peretasan kami. Kami ingin membuat perangkat Alexa berbicara langsung ke chip ESP8266 kami, di dalam rumah kami, tanpa mengirimkan apa pun ke cloud dan kembali. Kami ingin Alexa langsung mengirim permintaan ke ESP8266 kami, melalui dan di dalam jaringan wifi rumah kami saja.
Peretasan kami sebenarnya bukan rahasia. Kami akan membuat ESP8266 kami "meniru" Wemo Belkin, perangkat yang memiliki lisensi khusus dengan Amazon yang memungkinkannya berkomunikasi langsung dengan perangkat Alexa, melewati semua komunikasi cloud Amazon yang dijelaskan di atas.
Berpura-pura menjadi Wemo, ESP8266 kami menikmati hak istimewa untuk dapat menerima perintah langsung dari Alexa.
Rencana Dasar untuk Tutorial Arduino ESP8266 kami
- Dengarkan ESP8266 untuk perangkat Alexa yang mengirimkan probe di jaringan wifi lokal untuk perangkat yang kompatibel, dan tanggapi probe ini dengan mengatakan "Saya seorang Wemo."
- Setelah dipercaya oleh perangkat Alexa, dengarkan perintah lebih lanjut dari perangkat tersebut. Tangani dengan mengirimkan kode IR melalui pemancar IR, menyalakan/mematikan TV kami.
Persyaratan Perangkat Keras
Untuk menyelesaikan tutorial ini, Anda harus mendapatkan beberapa item sendiri, yang semuanya mudah didapat.
- Perangkat Alexa apa pun. Saya telah mengembangkan tutorial ini dengan Alexa Dot. Apakah tutorial akan berfungsi dengan simulator Echo? Itu mungkin! (Tapi saya belum mengujinya). Cobalah jika Anda suka berpetualang (atau hemat). Perangkat Alexa membutuhkan uang saku, tetapi penggunaan Echosim gratis.
- Sebuah chip ESP8266. Harganya hanya sekitar beberapa USD pada saat penulisan ini. Anda bisa mendapatkannya di Ebay, atau hampir semua toko perangkat keras yang lengkap secara online.
- Dioda IR (inframerah). Anda harus menghubungkan ini ke chip ESP8266 Anda, dan ini harus Anda lakukan sendiri. Untuk proyek ini, kami hanya membutuhkan kemampuan pengiriman; kami tidak peduli tentang penerimaan IR. Pastikan untuk menghubungkan dioda ke GND dan output 0 agar tutorial ini berfungsi. (Jika Anda melakukannya dengan cara lain, tidak apa-apa, tetapi Anda juga harus bertanggung jawab untuk memodifikasi kode tutorial yang sesuai. Tautan ini dapat membantu Anda. Ketahuilah bahwa karena skema penomoran yang digunakan pada ESP8266, pin 0 dapat diberi label sebagai "D3."
- Adaptor serial yang di satu sisi adalah USB (untuk dicolokkan ke komputer dev Anda), dan di sisi lain cocok dengan chip ESP8266.
- Jaringan wifi lokal yang Anda ketahui nama pengguna dan kata sandinya.
Alat Perangkat Lunak Arduino
- ArduinoIDE. Ada versi untuk semua OS utama, termasuk Windows. Tutorial ini dikembangkan pada versi Ubuntu, tetapi saya telah menginstal dan menggunakan Arduino di Windows juga, tidak ada masalah.
- Pustaka pengembangan ESP8266 untuk Arduino.
- Driver. Untungnya, driver untuk adaptor Anda kemungkinan besar harus plug & play, jadi tidak diperlukan driver tambahan.
Mengatur Semuanya
- Instal Arduino IDE.
- Instal perpustakaan ESP8266 menggunakan Boards Manager.
Untuk menginstal perpustakaan ESP8266 menggunakan Boards Manager:
- Di Arduino IDE, buka File -> Preferences .
- Masukkan URL ini di “URL Manajer Papan Tambahan”: http://arduino.esp8266.com/stable/package_esp8266com_index.json
- Klik Oke
Buka Boards Manager ( Tools -> Board: [current board] -> Boards Manager ).
- Di kotak teks "filter", ketik "ESP8266."
- Anda harus mendapatkan entri untuk "esp8266" sekarang setelah Anda menambahkan pengelola papan tambahan. Pilih itu, dan klik "instal."
- Tunggu beberapa saat—membutuhkan beberapa waktu untuk mengunduh semuanya.
- Mulai ulang Arduino IDE Anda.
- Buka Alat -> Papan: dan, kali ini, gulir ke bawah ke "Modul ESP8266 Generik" dan pilih.
Menambahkan Perpustakaan Pihak Ketiga
Arduino menawarkan banyak cara berbeda untuk menambahkan perpustakaan eksternal ke proyek Anda, atau "Sketsa", begitu mereka menyebutnya. Untuk menjaga hal-hal sesederhana mungkin, untuk tutorial ini, kami hanya akan menjelaskan yang tercepat, yaitu dengan menyalin folder. Kita perlu menambahkan dua perpustakaan eksternal agar tutorial berfungsi: IRemoteESP8266 dan https://github.com/me-no-dev/ESPAsyncTCP.
- Dalam kode tutorial di GitHub, temukan direktori “libraries”.
- Di direktori root instalasi Arduino (misalnya, C:\Program Files\Arduino), temukan subdirektori "libraries".
- Salin direktori IRemoteESP8266 dari direktori "libraries" tutorial ke direktori "libraries" Arduino.
- Salin direktori ESPAsyncTCP dari direktori "libraries" tutorial ke direktori "libraries" Arduino.
- Mulai ulang Arduino IDE.
Sekarang perpustakaan untuk transmisi IR dan TCP asinkron disertakan dalam proyek.
Pengaturan
Gambar di bawah menunjukkan pengaturan tipikal, yang berfungsi untuk saya dan perangkat keras saya, tetapi mungkin berbeda untuk setiap pengguna. Anda dapat mencoba pengaturan di bawah ini, tetapi ada kemungkinan Anda harus menyesuaikannya berdasarkan chip dan adaptor khusus Anda. Milik saya adalah nodemcu, misalnya, jadi saya harus mengubah metode reset dari "ck" (default) menjadi "nodemcu." Juga, setel "port debug" ke "serial" sehingga Anda dapat menggunakan debugger serial. Milik saya adalah pengaturan yang sangat umum, sehingga Anda dapat menggunakan pengaturan saya sebagai dasar; Saya hanya mengatakan jangan kaget jika Anda harus mengacaukannya agar proses kompilasi dan flash berfungsi.
Buktikan Setup Anda dengan ESP8266 Hello World
Proyek Arduino dimulai dengan file .ino. File .ino mendefinisikan dua titik masuk: setup dan loop. Untuk "hello world" kita, kita akan menyalakan sedikit lampu, pada ESP8266, hanya untuk memverifikasi bahwa kode kita berfungsi.
//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); }
Kompilasi dan Flash Kodenya
Untuk mengkompilasi dan mem-flash adalah langkah mudah, jika pengaturan Anda sejauh ini sudah benar. Untuk mengkompilasi tanpa mem-flash, cukup buka Sketch -> Verify/Compile dari menu Arduino.
Untuk mem-flash kode ke chip serta mengkompilasi, pilih Sketch -> Upload dari menu Arduino.
Jika flash berhasil, Anda akan melihat tampilan kemajuan dari 0% menjadi 100%, selama waktu itu LED pada chip Anda kemungkinan besar akan benar-benar berkedip atau berkedip.
Untuk menguji apakah debugging serial berfungsi:
- Pertama pastikan port debug diatur ke Serial ( Tools -> Debug port ).
- Setelah kode Anda selesai di-flash ke chip, pilih Tools -> Serial Monitor .
Output dari serial debugger setelah sukses dimulai:
Bagus, jadi itu berhasil; selanjutnya, kami ingin memverifikasi keluaran IR kami. Mari kita mengirim sinyal melalui pemancar IR kita dan memverifikasi bahwa sinyal masuk.
Kami akan menggunakan perpustakaan Arduino IR yang ada untuk membantu kami. Salah satu hal hebat tentang Arduino adalah betapa mudahnya menjepret pustaka dan modul masuk dan keluar. Sangat menyegarkan untuk kerangka kerja C++!
Cukup ikuti instruksi dalam file README repo Git untuk menginstal di Arduino.
Kode ini hanya mem-flash pemancar IR berulang kali. IR tidak terlihat oleh mata manusia, tetapi ada pro-tip untuk mengujinya; jalankan kode ini, verifikasi (melalui debugger) bahwa kode itu berjalan di chip Anda, lalu buka kamera perangkat seluler Anda. Lihat langsung bola lampu dioda IR melalui kamera Anda . Jika berfungsi, Anda akan melihat bohlam menyala dan mati. Anda juga dapat mencoba ini dengan remote control yang berfungsi (misalnya, remote TV standar). Kode berikut akan menyebabkan bohlam IR mulai berkedip setiap 0,5 detik. Sebenarnya itu mengirimkan perintah on/off LG, jadi itu benar-benar dapat mematikan dan menghidupkan TV LG Anda jika ada di dekatnya.
#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); }
Mulai Tutorial ESP8266
Jika semuanya telah bekerja sejauh ini, saya pikir kita dapat merasa puas bahwa peralatan dan pengaturan dasar kita berfungsi, dan kita siap untuk memulai inti dari tutorial.
Sambungkan ke Wifi
Pertama, kita harus terhubung ke wifi lokal. Kode di bawah ini akan mencoba terhubung ke Wifi, dan melaporkan keberhasilan koneksi (melalui debugger serial). Pada contoh kode, jangan lupa untuk mengganti nilai myWifiSsid dengan nama pengguna jaringan wifi Anda, dan mengganti nilai myWifiPassword dengan kata sandi yang benar.
#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() { }
Jalankan Server Wemo
Terhubung? Bagus. Sekarang kita masuk ke inti proyek: server Wemo.
Emulator Wemo saya sendiri disertakan dalam file sumber untuk tutorial ini. Sekarang, Anda dapat mencari di Google dan menemukan emulator Wemo yang lebih sederhana. Anda dapat menemukan satu yang ditulis menggunakan lebih sedikit kode, dan yang mudah dimengerti. Dengan segala cara, jangan ragu untuk memeriksa, bereksperimen, menulis sendiri, dll. Itu semua adalah bagian dari membuat tutorial ini milik Anda.

Alasan di balik saya adalah karena ia menggunakan ESPAsyncTCP. Mengapa ini bagus? Yah, hanya ada begitu banyak server (atau perangkat) yang dapat Anda jalankan di ESP8266 menggunakan metode ini sebelum mulai menjadi tidak dapat diandalkan, dalam arti Alexa akan mulai kehilangan perangkat (tidak menemukannya), perintah akan dijatuhkan, dan kinerja menjadi lambat. Saya menemukan bahwa jumlah ini dimaksimalkan dengan menggunakan perpustakaan ESPAsyncTCP.
Tanpa itu, saya menemukan ketidakandalan untuk merayap di sekitar 10-12 perangkat; dengan itu, saya menemukan bahwa jumlah hingga sekitar 16. Jika Anda ingin memperluas tutorial ini dan menjelajahi batas-batas dari apa yang dapat dilakukan chip, saya akan merekomendasikan menggunakan versi saya. Jika Anda ingin melihat versi yang lebih sederhana hanya untuk pemahaman Anda sendiri, jangan ragu untuk mencari "wemo emulator Arduino" di Google; Anda harus menemukan sejumlah contoh.
Sekarang, kita harus menginstal perpustakaan ESPAsyncTCP. Instal seperti yang kita lakukan pada perpustakaan IR; buka halaman Git dan ikuti petunjuknya.
Pustaka ini juga termasuk dalam kode contoh arduino esp8266 saya. Ini hanya kode untuk membuka koneksi wifi, mendengarkan permintaan penemuan Alexa, dan menanganinya dengan mengembalikan respons "Saya 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(); } }
Pra-Pengujian
Uji apa yang kita miliki sejauh ini (wifi dan emulator), dengan menjalankannya dengan Alexa. Tutorial ini mengasumsikan bahwa perangkat Alexa Anda sudah diatur dan dipasang di rumah Anda.
Penemuan uji:
Katakan kepada Alexa, "Alexa, temukan perangkat."
Ini akan menyebabkan Alexa menyiarkan permintaan UDP di jaringan wifi lokal Anda, memindai Wemos dan perangkat lain yang kompatibel. Permintaan ini harus diterima dalam panggilan ke wemulator->listen();
dalam fungsi loop(). Ini pada gilirannya mengarahkannya ke metode handleUDPPacket(*)
. Respons dikirim dalam metode nextUDPResponse()
. Perhatikan isi tanggapan itu:
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";
Ini adalah kode yang memberitahu Alexa “Saya seorang Wemo (Belkin), ada yang bisa saya bantu?” Setelah Alexa menerima respons ini, ia mengetahui dan mengingat bahwa perintah rumah pintar di masa mendatang dapat dialihkan ke perangkat ini.
Output dari serial debugger pada titik ini akan terlihat seperti gambar di bawah ini. Setelah selesai menemukan, Alexa secara lisan akan memberi tahu Anda bahwa ia telah "menemukan perangkat [N]" di jaringan Anda.
Dalam fungsi setup()
, perhatikan cuplikan berikut:
new WemoCallbackHandler(&commandReceived)
Ini adalah panggilan balik di mana kita akan menangkap perintah dari Alexa. Tubuhnya didefinisikan dalam WemoCallbackHandler.h (WemoCallbackHandler::handleCallback). Setelah kami menangkap perintah dari Alexa, kami dapat melakukan apa yang kami suka dengannya. Pada baris sebelumnya, kami telah menyiapkan kemungkinan perintah yang dapat digunakan, dengan baris kode berikut:
wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");
Jadi ini adalah 4 "server" atau pendengar terpisah yang kami jalankan di chip. Ini mengatur kemampuan untuk mengatakan salah satu dari perintah berikut ke Alexa:
Alexa, nyalakan tv Alexa, matikan tv Alexa, nyalakan televisi Alexa, matikan televisi Alexa, nyalakan tv Alexa saya, matikan tv saya Alexa, nyalakan televisi saya Alexa, matikan televisi saya
Dan ini adalah bagaimana kita akan mengujinya. Kami berharap bahwa mengatakan salah satu dari perintah itu akan membangunkan kode kami dan memasukkan panggilan balik itu, di mana kami dapat melakukan apa yang kami suka dengannya.
Tambahkan Perintah IR
Sekarang kita menerima perintah, saatnya untuk menanganinya dengan… menyalakan/mematikan TV kita. Jadi ini akan menjadi segalanya — wifi, emulator wemo, dan IR — semuanya disatukan. TV saya adalah LG, jadi saya mencari urutan yang sesuai untuk menyalakan/mematikan, dan mengirimkannya melalui fungsi sendNEC perpustakaan IR kami (LG menggunakan protokol NEC). Encoding/decoding IR adalah subjek yang terpisah dalam dirinya sendiri, di mana pesan dikodekan dalam modulasi sinyal; itu adalah spesifikasi pengaturan waktu, tanda, dan spasi yang sangat tepat. Setiap pabrikan cenderung menggunakan protokol miliknya sendiri untuk perintah, dan dengan waktu yang berbeda; itu cukup menarik, dan Anda dapat menggali lebih dalam dengan melihat ke dalam kode sumber perpustakaan IR itu, googling, dll. Tetapi untuk kenyamanan kami, detail semua itu diurus untuk kami oleh perpustakaan IR kami.
TV Anda bukan LG? Hanya google kode yang benar. Inilah perintah untuk Sony TV (peringatan: tidak diuji):
irSend.sendSony(0xa90, 12);
Jika Anda ingin benar-benar melakukannya sendiri, Anda dapat mengatur penerima IR, mengarahkan remote (atau pemancar IR) ke sana, dan memecahkan kode kode yang dikirim; itu tutorial yang berbeda, meskipun.
Tes Akhir ke Akhir
- Tempatkan Alexa Anda di mana pun ia dapat mendengar Anda.
- Tempatkan ESP8266 Anda dengan dioda IR yang terpasang, dalam jangkauan kendali jarak jauh TV.
- Ucapkan "Alexa, temukan perangkat." Tunggu hingga melaporkan keberhasilan (seharusnya menemukan setidaknya satu perangkat).
- Ucapkan "Alexa, nyalakan TV saya" atau "Alexa, matikan TV saya."
Alexa harus memahami perintah Anda (sebagai perintah smarthome, tidak diarahkan ke keterampilan tertentu), mencari perangkat lokal untuk menanganinya, dan mengirim perintah ke perangkat (ESP8266 Anda). Perangkat Anda harus menerimanya dan mengirim perintah remote control ke TV. Anda dapat melihat dioda Anda melalui kamera ponsel untuk memastikan bahwa itu memancarkan.
Karena kode IR untuk mematikan TV sama dengan kode untuk menyalakannya, tidak masalah apakah Anda memberikan perintah untuk menghidupkan atau mematikan. Ini adalah kode yang sama, dan mengubah status. Jika TV mati, itu harus menyala, dan jika hidup, itu harus mati.
Penyelesaian masalah
Apakah Anda terhubung ke Wifi?
Apakah Anda memasukkan nama pengguna/kata sandi yang benar ke dalam nilai variabel yang benar?
//SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";
Apakah Anda mendapatkan pesan kegagalan, atau kesalahan apa pun melalui port debug serial, saat menghubungkan ke Wifi?
Apakah Wifi Anda dihidupkan, dan dapatkah Anda menyambungkannya melalui sarana biasa lainnya?
Apakah perangkat Anda ditemukan oleh Alexa?
Alexa akan mengirimkan permintaan untuk menemukan perangkat ketika Anda mengatakan "Alexa, temukan perangkat."
Alexa Anda harus dikonfigurasi dan diatur dengan benar dan terhubung ke jaringan Wifi yang sama dengan ESP8266 Anda.
Lihat di Fauxmo.h. Lihat fungsi Fauxmo::handle(). Ini adalah kode pertama yang akan dijalankan setelah ESP8266 mendengar panggilan tersebut. Masukkan pesan debug untuk melihat apakah ada kode setelahnya
if (len > 0) {
sedang berlari. Jika tidak, maka perintah tidak diterima. Jika ya, maka tampaknya perintah diterima, tetapi tidak ditangani dengan benar. Ikuti kode dari sana untuk mencari tahu apa masalahnya.
Apakah Anda memiliki banyak perangkat lain yang dapat ditemukan di jaringan Anda? Terlalu banyak dapat menyebabkan penemuan berjalan lebih lambat, atau bahkan terkadang gagal.
Apakah perangkat Anda menerima perintah?
Saat Anda mengeluarkan perintah "Alexa, nyalakan TV saya," eksekusi harus memasuki WemoCallbackHandler::handleCallback handler
Anda (dalam file WemoCallbackHandler.h). Jika Anda belum melakukannya, coba keluarkan beberapa pesan debug di sana untuk memastikan bahwa itu diaktifkan saat Anda mengeluarkan perintah. Juga, coba pastikan bahwa Alexa tahu tentang perangkat Anda dengan mengatakan "Alexa, temukan perangkat" sebelum mengeluarkan perintah Anda. Langkah ini mengasumsikan bahwa penemuan perangkat telah berhasil.
Apakah dioda IR memancarkan?
Seperti yang dijelaskan sebelumnya, ketika menurut Anda perangkat Anda harus memancarkan, arahkan kamera ponsel Anda ke sana dan lihat dioda melalui kamera. Meskipun dalam kehidupan nyata Anda tidak dapat melihat apa pun, melalui kamera itu akan muncul sebagai cahaya normal yang menyala dan berkedip. Jika Anda melihat ini, maka itu memancarkan ... sesuatu.
Apakah sinyal IR terbalik?
Dioda IR Anda mungkin disambungkan sedemikian rupa sehingga sinyal pada dasarnya terbalik. Harap bersabar dengan penjelasan saya, karena saya bukan ahli elektronik atau pengkabelan, tetapi hasil dari pengkabelan yang salah dioda adalah bahwa lampu IR akan ON secara default, tetapi dimatikan ketika perpustakaan IRSend bermaksud untuk mengubah itu. Jika ini masalahnya, lampu IR Anda harus menyala (terlihat melalui kamera) secara default, setelah kode setup()
berjalan, tetapi sebelum hal lain terjadi. Jika Anda mengomentari semua kode di dalam loop()
, Anda akan melihatnya terus menyala.
Untuk melihat lebih jelas bagaimana cara memperbaikinya, masuk ke folder libraries/IRemoteESP8266/src dari kode tutorial. Lihat konstruktor:
IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }
Argumen "terbalik" dan logika yang menanganinya adalah yang sedang kita bicarakan. Jika pengkabelan Anda terbalik, solusi termudah adalah membuat perubahan kecil pada kode untuk memungkinkan hal ini (daripada memasang kembali ... tetapi jika tentu saja Anda dapat melakukannya jika Anda mau). Ubah saja baris ini di AlexaTvRemote.ino:
//initialize the IR irSend = new IRsend(IR_PIN, false);
ke
//initialize the IR irSend = new IRsend(IR_PIN, true);
Apakah Anda memiliki kode dan perintah kendali jarak jauh yang benar?
Jika semuanya tampak baik-baik saja, tetapi TV tidak mematuhinya, kemungkinan besar ada yang salah dengan kode IR. Coba panggilan fungsi yang berbeda pada antarmuka pustaka IR tersebut (misalnya, sendLG
, sendPanasonic
, sendSharp
, dll.), atau pastikan yang Anda gunakan cocok dengan perangkat keras Anda. Sangat tidak mungkin perangkat keras TV Anda tidak didukung oleh perpustakaan itu, tetapi saya kira itu mungkin secara teknis.
Pastikan kode yang Anda kirim adalah kode yang tepat untuk perangkat keras Anda. Anda mungkin harus melakukan penggalian di google untuk menemukan yang tepat. Jika semuanya gagal, selalu ada opsi untuk mendeteksi kode yang dipancarkan dari remote kerja Anda, saat Anda menekan tombol Power—tetapi itu adalah tutorial yang berbeda dan memerlukan perangkat keras yang berbeda.
Membungkus
Semoga semuanya berhasil untuk Anda. Jika demikian (dan mungkin bahkan jika tidak), ini adalah cara yang baik untuk memotong gigi Anda pada beberapa subjek sekaligus:
- Alexa
- Pemrograman tertanam
- Chip ESP8266
- Arduino IDE
Juga tentu saja, Anda mungkin memiliki sedikit kemudahan, untuk dapat menghidupkan/mematikan tv Anda dengan perintah suara.
Mengapa Hack?
Mengapa ini merupakan peretasan, dan bukan bagian dari API dasar untuk Alexa? Setelah mempelajari cara mengembangkan keterampilan Alexa pertama saya, yang benar-benar ingin saya ketahui adalah "bagaimana saya bisa mengirim perintah langsung dari Alexa ke perangkat lain di jaringan?" Sayang sekali bahwa Amazon belum mengekspos API lengkap untuk komunikasi antara perangkat Alexa dan objek lain di jaringan lokal, tanpa melalui paradigma "keterampilan" atau "rumah pintar" (di mana semuanya harus dikirim ke AWS sebelum melakukan apa pun), tetapi mereka tidak melakukannya.
Cobalah untuk Mengambilnya Lebih Jauh
Cobalah serangkaian perintah remote control untuk mengontrol tv Anda secara lebih penuh, seperti mengubah saluran dan mengontrol volume. Uji batas chip dengan melihat berapa banyak perintah berbeda yang dapat Anda dengarkan pada satu ESP8266 (petunjuk: angkanya hampir tidak menembus dua digit, tanpa pemrograman yang sangat pintar). Jika Anda mahir dengan perangkat keras, coba kendalikan perangkat lain tidak melalui IR, dengan menghubungkannya langsung ke chip ESP8266; seperti pencahayaan dan semacamnya. Temukan kembali wemo!
- Bagaimana Saya Membuat Stasiun Cuaca Arduino yang Berfungsi Penuh
- Bekerja dengan Pengambilan Sampel Audio ESP32