用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安装在空调附近的天花板上,配合广角红外发射管,可以获得最佳的控制效果。