Saya menemukan cara untuk berteman dengan AC (atau perangkat lain yang dikendalikan oleh remote control) dan rumah pintar, atau mengendalikan perangkat ini, misalnya, dari perangkat seluler.
Secara teori, cukup sambungkan esp8266 (sekitar $ 2 dari Cina) ke LED inframerah, isi firmware dan Anda selesai.

Dalam praktiknya, ternyata menjadi agak lebih rumit, karena revisi saya esp-01 harus menyolder (sesuatu
seperti ini ) kabel ke kaki microcircuit berukuran 5 * 5mm, menghasilkan GPIO tambahan. Saya sarankan menggunakan revisi yang lebih lama, misalnya ESP-12.
Untuk pembaca yang tidak terbiasa dengan esp8266, saya sarankan Anda membaca
artikel ini .
Komponen dan Modul
*
Revisi Esp8266 esp-01*
FT232RL: USB ke Serial 232 TTL Adapter + kabel untuk koneksi
*
Tsop 4838 photodetector*
3.3v regulator*
Transistor S9014* Infrared LED 5013IRAB (panjang gelombang 940 nm)
* 330 ohm resistor
*
Papan Proyek* Solder, solder, fluks.
* Untuk bekerja dengan IR,
perpustakaan luar biasa
IRremoteESP8266 digunakan . Penulis Mark Szabo, Sebastien Warin, Ken Shirriff.
Menyimpan Kode
* Hubungkan
photodetector , VCC ke +3.3, GND ke nol, OUT ke GPIO.
* Buka contoh untuk membuang kode dari perpustakaan kami \ IRremoteESP8266 \ contoh \ IRrecvDump \ IRrecvDump.ino
* Jika perlu, ubah nomor pin yang kami hubungkan dengan OUT dari photodetector (baris βint RECV_PIN = 2;β).
* Isi firmware. Kami terhubung ke output modul. Sebagai alternatif, tahan tombol remote control untuk kode dump.
Untuk nafas Tion O2, saya mendapat kode berikut:
Turun
16711935
Decode NEC: FF00FF (32 bit)
- naik
16724175
Decode NEC: FF30CF (32 bit)
- Atur
16722135
Decode NEC: FF28D7 (32 bit)
- Kekuasaan
16720095
Decode NEC: FF20DF (32 bit)
Fotodetektor tidak lagi diperlukan hingga Anda perlu "mengambil" kode kendali jarak jauh lain.
Manajemen perangkat
* Hubungkan LED IR sesuai dengan skema.

(Gambar dipinjam dari Fritzing)
GPIO dapat digunakan berbeda. Dari tegangan 3.3V, LED juga berfungsi normal.
UPD: Seperti yang tercantum dalam komentar, disarankan untuk menggunakan
resistor pembatas arus .
* Demo firmware dengan server ada di sini
\ IRremoteESP8266 \ contoh \ IRServer \ IRServer.ino
* Ubah nama dan kata sandi dari titik akses Anda di dalamnya sehingga esp dapat terhubung dengannya. Dan juga jumlah GPIO yang digunakan
const char* ssid = ".....";
const char* password = ".....";
IRsend irsend(0);
* Modul firmware.
* Ketika terhubung ke konsol, alamat IP yang dialokasikan oleh esp akan ditampilkan.
Sekarang Anda dapat mengirim kode dengan memasukkan alamat
192.168.1.1/ir?code=16720095 di browser (ganti IP dan kode yang diinginkan) di browser.
Kode firmware peningkatan udara #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <IRremoteESP8266.h> const char* ssid = "FFFF"; const char* password = "XXXX"; unsigned long last_cmd_send_time = 0; MDNSResponder mdns; ESP8266WebServer server(80); const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>"; // IRsend irsend(2); IRsend irsend(13); void handleRoot() { server.send(200, "text/html", "<html><head> <title>ESP8266 Demo (Web Update)</title></head><body><h1>Hello from ESP8266, you can send NEC encoded IR signals from here!</h1><p><a href=\"ir?code=16769055\">Send 0xFFE01F</a></p><p><a href=\"ir?code=16429347\">Send 0xFAB123</a></p><p><a href=\"ir?code=16771222\">Send 0xFFE896</a></p></body></html>"); } void handleIr(){ for (uint8_t i=0; i<server.args(); i++){ if(server.argName(i) == "code") { unsigned long code = server.arg(i).toInt(); irsend.sendNEC(code, 32); } } handleRoot(); } void handleSeq(){ unsigned long code = 0; unsigned long cnt = 0; unsigned long dl = 0; unsigned long nwt = 0; for (uint8_t i=0; i<server.args(); i++){ if(server.argName(i) == "code") { code = server.arg(i).toInt(); } if(server.argName(i) == "count") { cnt = server.arg(i).toInt(); } if(server.argName(i) == "delay") { dl = server.arg(i).toInt(); } if(server.argName(i) == "need_wait") { nwt = server.arg(i).toInt(); } } if (nwt > 0){ unsigned long wt = millis() - last_cmd_send_time; if (wt < nwt && wt > 0) { delay(nwt - wt); } } if (code != 0) { for (uint8_t i=0; i<cnt; i++){ irsend.sendNEC(code, 32); delay(dl); } } last_cmd_send_time = millis(); handleRoot(); } void handleNotFound(){ String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i=0; i<server.args(); i++){ message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } void setup(void){ irsend.begin(); Serial.begin(115200); WiFi.mode(WIFI_AP_STA); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (mdns.begin("esp8266", WiFi.localIP())) { Serial.println("MDNS responder started"); } server.on("/", handleRoot); server.on("/ir", handleIr); server.on("/seq", handleSeq); server.on("/inline", [](){ server.send(200, "text/plain", "this works as well"); }); server.on("/update", HTTP_GET, [](){ server.sendHeader("Connection", "close"); server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/html", serverIndex); }); server.on("/update", HTTP_POST, [](){ server.sendHeader("Connection", "close"); server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK"); ESP.restart(); },[](){ HTTPUpload& upload = server.upload(); if(upload.status == UPLOAD_FILE_START){ Serial.setDebugOutput(true); WiFiUDP::stopAll(); Serial.printf("Update: %s\n", upload.filename.c_str()); uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; if(!Update.begin(maxSketchSpace)){//start with max available size Update.printError(Serial); } } else if(upload.status == UPLOAD_FILE_WRITE){ if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){ Update.printError(Serial); } } else if(upload.status == UPLOAD_FILE_END){ if(Update.end(true)){ //true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } Serial.setDebugOutput(false); } yield(); }); server.onNotFound(handleNotFound); server.begin(); Serial.println("HTTP server started"); } void loop(void){ server.handleClient(); }
Saya membuat halaman ini untuk kenyamanan mengatur nafas saya.
brizer.html <html> <head> <script> function sendIR(str) { if (str.length == 0) { </script> </head> <body> <div id="demo"> <button type="button" onclick="sendIR('ir?code=16724175')">Up</button> <button type="button" onclick="sendIR('ir?code=16711935')">Down</button> <button type="button" onclick="sendIR('ir?code=16722135')">Set</button> <button type="button" onclick="sendIR('ir?code=16720095')">Power</button> <button type="button" onclick="sendIR('seq?need_wait=11000&code=16722135&count=2&delay=20');sendIR('seq?code=16711935&count=50&delay=20');sendIR('seq?code=16724175&count=21&delay=20')">day</button> <button type="button" onclick="sendIR('seq?need_wait=11000&code=16722135&count=2&delay=20');sendIR('seq?code=16711935&count=50&delay=20');sendIR('seq?code=16724175&count=35&delay=20')">night</button> <a href="http://192.168.0.193/update">update</a> </div> </body> </html>
Secara khusus, dalam kasus saya, pernafasan bekerja dengan remote control yang tidak biasa, pertama kali "bangun", menyalakan lampu latar, dan hanya setelah itu mulai menerima perintah. Ketika otomasi layak untuk dipertimbangkan.
Saya harap instruksi ini bermanfaat bagi seseorang. Silakan bagikan firmware yang diperbarui.