用ESP8266和IRremoteESP8266库,把旧空调改造成智能空调(附完整代码)
用ESP8266和IRremoteESP8266库打造智能空调控制器家里的老空调还在兢兢业业工作但每次都要找遥控器实在麻烦通过ESP8266开发板和IRremoteESP8266库我们可以轻松将传统空调升级为支持手机远程控制的智能设备。这个项目不仅成本低廉还能让你体验到DIY智能家居的乐趣。1. 项目准备与硬件连接在开始之前我们需要准备以下材料ESP8266开发板如NodeMCU或Wemos D1 mini红外发射二极管建议使用940nm波长面包板和杜邦线手机用于红外信号采集220Ω电阻保护红外发射管硬件连接非常简单将红外发射管的正极较长引脚通过220Ω电阻连接到ESP8266的GPIO4引脚将红外发射管的负极连接到ESP8266的GND引脚通过Micro USB线为ESP8266供电提示如果找不到原装遥控器可以使用手机上的万能遥控App作为替代方案来采集红外信号。2. 开发环境搭建与库安装我们需要配置Arduino IDE来支持ESP8266开发打开Arduino IDE进入文件→首选项在附加开发板管理器网址中添加http://arduino.esp8266.com/stable/package_esp8266com_index.json打开工具→开发板→开发板管理器搜索并安装esp8266安装IRremoteESP8266库打开工具→管理库搜索IRremoteESP8266并安装验证安装是否成功#include IRremoteESP8266.h #include IRsend.h void setup() { Serial.begin(115200); Serial.println(IR库安装成功); } void loop() {}上传这段代码后打开串口监视器波特率115200如果看到IR库安装成功的提示说明环境配置正确。3. 红外信号采集与解码采集空调遥控器的红外信号是整个项目的关键步骤。我们使用IRrecvDumpV2示例程序来完成这项工作打开Arduino IDE选择文件→示例→IRremoteESP8266→IRrecvDumpV2将程序上传到ESP8266打开串口监视器波特率115200用遥控器对准红外接收头按下按键你会看到类似这样的输出Protocol : COOLIX Code : 0xB29F40 (24 Bits) Power: On, Mode: 0 (Cool), Fan: 4 (Min), Temp: 24C记录下Protocol和Code信息这些将用于后续的控制程序。对于每个常用功能开/关、温度调节、模式切换等都需要单独采集并记录对应的红外编码。4. 实现基础红外控制功能有了红外编码后我们可以编写控制程序了。以下是三种常用的控制方法4.1 原始信号发送法这种方法直接发送采集到的原始红外信号#include IRremoteESP8266.h #include IRsend.h const uint16_t kIrLed 4; IRsend irsend(kIrLed); uint16_t rawData[199] {4418, 4488, 510, 1656, 534, 542, 536, 1632, 510, 1656, 510, 566, 510, 568, 510, 1658, 508, 568, 514, 564, 534, 1632, 512, 566, 510, 568, 518, 1674, 494, 1672, 486, 566, 512, 1656, 512, 1656, 512, 564, 516, 560, 518, 1650, 510, 1658, 534, 1632, 510, 1656, 510, 1656, 512, 566, 510, 1656, 512, 1654, 512, 566, 514, 564, 512, 566, 510, 566, 512, 566, 510, 566, 512, 1654, 514, 566, 534, 542, 512, 566, 510, 568, 512, 566, 512, 564, 512, 1656, 512, 566, 510, 1658, 510, 1658, 510, 1658, 508, 1656, 512, 1656, 510, 1656, 510, 5284, 4444, 4460, 512, 1656, 510, 566, 536, 1632, 512, 1656, 512, 566, 512, 566, 512, 1656, 514, 562, 512, 566, 512, 1656, 512, 566, 512, 566, 512, 1656, 510, 1658, 510, 566, 510, 1658, 510, 1656, 510, 566, 512, 566, 510, 1658, 510, 1656, 510, 1658, 510, 1656, 510, 1656, 512, 566, 512, 1656, 510, 1656, 510, 566, 512, 566, 512, 566, 510, 566, 512, 566, 516, 560, 512, 1656, 512, 566, 510, 566, 512, 566, 512, 566, 512, 566, 512, 566, 512, 1656, 512, 566, 510, 1656, 510, 1656, 512, 1658, 510, 1656, 510, 1656, 510, 1658, 510}; void setup() { irsend.begin(); } void loop() { irsend.sendRaw(rawData, 199, 38); // 发送原始红外信号 delay(5000); // 每5秒发送一次 }4.2 协议控制法如果空调使用标准协议如COOLIX可以使用更简洁的控制方式#include IRremoteESP8266.h #include ir_Coolix.h const uint16_t kIrLed 4; IRCoolixAC ac(kIrLed); void setup() { ac.begin(); ac.on(); ac.setMode(kCoolixCool); ac.setFan(4); ac.setTemp(24); } void loop() { ac.send(); delay(5000); }4.3 编码直接发送法对于已知协议和编码的情况可以直接发送编码#include IRremoteESP8266.h #include IRsend.h const uint16_t kIrLed 4; IRsend irsend(kIrLed); void setup() { irsend.begin(); } void loop() { irsend.sendCOOLIX(0xB29F40); // 发送COOLIX协议编码 delay(5000); }5. 进阶功能实现5.1 通过WiFi远程控制让ESP8266接入家庭WiFi网络实现手机远程控制#include ESP8266WiFi.h #include IRremoteESP8266.h #include IRsend.h const char* ssid 你的WiFi名称; const char* password 你的WiFi密码; const uint16_t kIrLed 4; IRsend irsend(kIrLed); WiFiServer server(80); void setup() { Serial.begin(115200); irsend.begin(); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } server.begin(); Serial.println(WiFi连接成功); Serial.println(WiFi.localIP()); } void loop() { WiFiClient client server.available(); if (client) { String request client.readStringUntil(\r); if (request.indexOf(/power) ! -1) { irsend.sendCOOLIX(0xB29F40); // 发送开机命令 } else if (request.indexOf(/tempup) ! -1) { irsend.sendCOOLIX(0xB29F41); // 温度 } else if (request.indexOf(/tempdown) ! -1) { irsend.sendCOOLIX(0xB29F42); // 温度- } client.println(HTTP/1.1 200 OK); client.println(Content-Type: text/html); client.println(); client.println(控制命令已执行); delay(1); client.stop(); } }5.2 集成到Home Assistant通过MQTT协议将控制器接入Home Assistant在Home Assistant中安装MQTT集成修改ESP8266代码添加MQTT支持#include ESP8266WiFi.h #include PubSubClient.h #include IRremoteESP8266.h #include IRsend.h const char* ssid 你的WiFi名称; const char* password 你的WiFi密码; const char* mqtt_server homeassistant.local; const uint16_t kIrLed 4; WiFiClient espClient; PubSubClient client(espClient); IRsend irsend(kIrLed); void callback(char* topic, byte* payload, unsigned int length) { String message; for (int i 0; i length; i) { message (char)payload[i]; } if (String(topic) home/ac/power) { irsend.sendCOOLIX(0xB29F40); } else if (String(topic) home/ac/temp) { int temp message.toInt(); // 根据温度值发送对应的红外编码 } } void reconnect() { while (!client.connected()) { if (client.connect(ESP8266ACController)) { client.subscribe(home/ac/#); } else { delay(5000); } } } void setup() { irsend.begin(); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); } client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }5.3 添加温度传感器实现自动控制结合DHT22温度传感器实现自动温控#include DHT.h #include IRremoteESP8266.h #include IRsend.h #define DHTPIN 5 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); const uint16_t kIrLed 4; IRsend irsend(kIrLed); void setup() { dht.begin(); irsend.begin(); } void loop() { float temp dht.readTemperature(); if (temp 26) { irsend.sendCOOLIX(0xB29F40); // 开启空调 } else if (temp 22) { irsend.sendCOOLIX(0xB29F41); // 关闭空调 } delay(60000); // 每分钟检查一次温度 }6. 项目优化与故障排除6.1 提高红外信号发射强度使用多个红外发射管并联增加发射功率确保发射管正对空调红外接收窗口避免阳光直射等强光源干扰6.2 常见问题解决问题现象可能原因解决方案空调无反应红外发射管接反检查发射管极性控制不稳定电源不足使用独立5V电源供电无法连接WiFi信号弱检查路由器距离或增加中继编码识别错误遥控器协议不匹配尝试其他解码方式6.3 电源管理优化对于长期运行的设备建议使用5V/2A的电源适配器考虑添加电容稳压电路如需电池供电选择18650电池升压模块7. 扩展应用场景这个红外控制方案不仅适用于空调还可以用于电视、机顶盒等影音设备电风扇、空气净化器等家电投影仪、电动幕布等办公设备自定义红外遥控场景如影院模式一键关闭灯光、拉上窗帘等通过简单的代码修改你可以创建一个万能红外控制器整合家中所有红外设备的控制功能。我在实际项目中发现将ESP8266安装在空调附近的天花板上配合广角红外发射管可以获得最佳的控制效果。