气候管理便宜又开朗(IRremoteESP8266库和Tion 02呼吸器)

找到了一种方法,可以与空调(或其他由遥控器控制的设备)和智能家居成为朋友,或例如通过蜂窝电话来控制此设备。
从理论上讲,只需将esp8266(中文约2美元)连接到红外LED,填写固件即可完成操作。


实际上,事实证明它要复杂一些,因为 我的修订版esp-01必须将布线焊接( 类似 )到5 * 5mm的微电路的腿上,并输出一个额外的GPIO。 我建议使用旧版本,例如ESP-12。
对于不熟悉esp8266的读者,建议您阅读本文

组件和模块


* Esp8266修订版esp-01
* FT232RL:USB至串行232 TTL适配器 +用于连接的电线
* Tsop 4838光电探测器
* 3.3v稳压器
* 晶体管S9014
*红外LED 5013IRAB(波长940 nm)
* 330欧姆电阻
* 项目委员会
*烙铁,焊锡,助焊剂。
*为了使用IR,使用了出色的库IRremoteESP8266 。 作者Mark Szabo,Sebastien Warin,Ken Shirriff。

保存代码


*将光电检测器 ,VCC连接至+ 3.3,GND连接至零,OUT连接至GPIO。
*从我们的库\ IRremoteESP8266 \示例\ IRrecvDump \ IRrecvDump.ino打开一个示例代码转储
*如有必要,请更改连接光电检测器OUT的引脚号(“ int RECV_PIN = 2;”行)。
*填充固件。 我们已连接到模块的输出。 或者,按住遥控器按钮以获取转储代码。
对于Tion O2呼吸器,我得到以下代码:
往下
16711935
解码的NEC:FF00FF(32位)
-向上
16724175
解码的NEC:FF30CF(32位)
-设置
16722135
解码的NEC:FF28D7(32位)
-电源
16720095
解码的NEC:FF20DF(32位)


除非您需要“抓住”另一个遥控器的代码,否则不再需要光电探测器。

设备管理


*根据方案连接IR LED。

(图片来自Fritzing)
可以使用不同的GPIO。 从3.3v电压开始,LED也可以正常工作。
UPD:如注释中正确指出的那样,建议使用限流电阻器
*服务器的演示固件在这里
\ IRremoteESP8266 \示例\ IRServer \ IRServer.ino
*更改其中的访问点的名称和密码,以便esp可以连接到它。 以及使用的GPIO数量
const char* ssid = ".....";
const char* password = ".....";
IRsend irsend(0);

*固件模块。
*连接到控制台后,将显示esp分配的IP地址。

现在,您可以通过在浏览器中输入格式为192.168.1.1/ir?code=16720095的地址(只需替换所需的IP和代码)来发送代码。

空中升级固件代码
 /* * IRremoteESP8266: IRServer - demonstrates sending IR codes controlled from a webserver * An IR LED must be connected to ESP8266 pin 0. * Version 0.1 June, 2015 */ #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(); } 



我创建此页面是为了方便管理呼吸。
brizer.html
 <html> <head> <script> function sendIR(str) { if (str.length == 0) { // document.getElementById("txtHint").innerHTML = ""; return; } else { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { // document.getElementById("txtHint").innerHTML = this.responseText; } }; xmlhttp.open("GET", "http://192.168.0.193/" + str, true); xmlhttp.send(); } } </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> 



具体地说,在我的情况下,呼吸器与遥控器异常地工作,第一次“唤醒”呼吸器时,它打开了背光,只有在开始接收命令之后才打开。 当自动化值得考虑时。

我希望此说明对某人有用。 请共享更新的固件。

Source: https://habr.com/ru/post/zh-CN401637/


All Articles