J'ai trouvé un moyen de me faire des amis avec un climatiseur (ou un autre appareil contrôlé par une télécommande) et une maison intelligente, ou de contrôler cet appareil, par exemple, à partir d'un cellulaire.
En théorie, il suffit de connecter l'esp8266 (environ 2 $ en provenance des Chinois) à la LED infrarouge, de remplir le firmware et vous avez terminé.

Dans la pratique, cela s'est avéré un peu plus compliqué, car ma révision esp-01 a dû souder (quelque chose
comme ça ) le câblage à la jambe d'un microcircuit mesurant 5 * 5mm, sortie un GPIO supplémentaire. Je recommande d'utiliser une révision plus ancienne, par exemple ESP-12.
Pour les lecteurs qui ne connaissent pas esp8266, je vous suggère de lire
cet article .
Composants et modules
*
Esp8266 révision esp-01*
FT232RL: Adaptateur USB vers série 232 TTL + fils pour la connexion
*
Photodétecteur Tsop 4838*
Régulateur 3.3v*
Transistor S9014* LED infrarouge 5013IRAB (longueur d'onde 940 nm)
* Résistance 330 ohms
*
Conseil de projet* Fer à souder, soudure, flux.
* Pour travailler avec IR, la remarquable
bibliothèque IRremoteESP8266 est utilisée . Auteurs Mark Szabo, Sebastien Warin, Ken Shirriff.
Enregistrement des codes
* Connectez le
photodétecteur , VCC à +3,3, GND à zéro, OUT à GPIO.
* Ouvrez un exemple de vidage de codes à partir de notre bibliothèque \ IRremoteESP8266 \ examples \ IRrecvDump \ IRrecvDump.ino
* Si nécessaire, modifiez le numéro de broche auquel nous avons connecté la sortie du photodétecteur (ligne «int RECV_PIN = 2;»).
* Remplissez le firmware. Nous sommes connectés à la sortie du module. Alternativement, maintenez enfoncés les boutons de la télécommande pour les codes de vidage.
Pour le reniflard Tion O2, j'ai obtenu les codes suivants:
Vers le bas
16711935
NEC décodé: FF00FF (32 bits)
- haut
16724175
NEC décodé: FF30CF (32 bits)
- Set
16722135
NEC décodé: FF28D7 (32 bits)
- Puissance
16720095
NEC décodé: FF20DF (32 bits)
Le photodétecteur n'est plus nécessaire tant que vous n'avez pas besoin de "saisir" le code d'une autre télécommande.
Gestion des appareils
* Connectez la LED IR selon le schéma.

(Image empruntée à Fritzing)
GPIO peut être utilisé différemment. À partir d'une tension de 3,3 V, la LED fonctionne également normalement.
UPD: Comme indiqué à juste titre dans les commentaires, il est conseillé d'utiliser une
résistance de limitation de courant .
* Le firmware de démonstration avec le serveur est ici
\ IRremoteESP8266 \ examples \ IRServer \ IRServer.ino
* Modifiez le nom et le mot de passe de votre point d'accès afin que esp puisse s'y connecter. Et aussi le nombre de GPIO utilisés
const char* ssid = ".....";
const char* password = ".....";
IRsend irsend(0);
* Module de micrologiciel.
* Une fois connecté à la console, l'adresse IP attribuée par esp sera affichée.
Vous pouvez maintenant envoyer le code en saisissant dans le navigateur une adresse au
format 192.168.1.1/ir?code=16720095 (il suffit de remplacer l'IP et le code souhaités).
Code de mise à niveau du micrologiciel Air #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(); }
J'ai fait cette page pour la commodité de gérer mon reniflard.
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>
Plus précisément, dans mon cas, le reniflard fonctionne de manière inhabituelle avec la télécommande, la première fois qu'il se "réveille", il allume le rétroéclairage et ce n'est qu'après que cela commence à recevoir des commandes. Lorsque l'automatisation mérite d'être prise en compte.
J'espère que cette instruction est utile à quelqu'un. Veuillez partager le firmware mis à jour.