IRremoteESP8266库实战:三种方法解析与发送空调红外码

张开发
2026/4/18 0:06:38 15 分钟阅读

分享文章

IRremoteESP8266库实战:三种方法解析与发送空调红外码
1. 从零开始ESP8266红外控制空调的准备工作第一次用ESP8266控制空调时我对着开发板和一串代码发懵——这玩意儿真能替代遥控器实测下来不仅可行而且比想象中简单。先说说基础装备一块ESP8266开发板NodeMCU就行、红外发射管LED和接收头VS1838B这类再加个杜邦线就能开工。这里有个坑要注意红外发射管有正负极之分接反了信号发不出去我第一次就栽在这。安装IRremoteESP8266库时推荐用Arduino IDE的库管理器直接搜比手动下载省心。安装完记得检查库版本我遇到过v2.7.19和v2.8.0协议支持差异的问题。硬件连接更简单发射管正极接GPIO4D2引脚负极接GND接收头VCC接3.3VOUT接任意GPIO比如D5GND接地。这里有个实用技巧用手机摄像头对准发射管按下发送代码时能看到紫色光点说明硬件没问题。2. 方法一原始码发送——最直接的复读机方案2.1 抓取红外信号就像录音原始码发送相当于把空调遥控器的信号原样录制再播放。用库里的IRrecvDumpV2例程抓信号时建议把手机万能遥控调成学习模式我用的小米手机对准接收头按按钮。串口会输出两段关键数据rawData数组和协议类型。这里容易踩的坑是信号干扰——日光灯、LED灯都可能影响接收最好在暗环境下操作。我抓取美的空调开关信号时rawData数组长度19938kHz载波频率。注意看串口输出的Mesg Desc.字段这里会解析出温度、风速等参数后面调试时会用到。实测发现同一个按钮多次抓取的rawData数值可能有微小差异但十六进制协议码如0xB29F40必须完全一致才算有效。2.2 发送代码的实战细节发送程序里有个关键参数容易忽略irsend.sendRaw(rawData, 199, 38)中的199表示数组长度必须和抓取时完全一致。我曾因为少写了个元素导致空调没反应。另一个细节是kIrLed引脚定义——如果换用GPIO5代码里所有出现kIrLed的地方都要同步修改。调试时建议先用接收程序验证信号在发送端和接收端各接一个ESP8266看接收端能否解析出相同数据。遇到过信号弱的情况解决方法是在发射管串联100Ω电阻提升驱动电流。代码里的delay(2000)也别删空调主板处理信号需要时间连续发送会导致指令丢失。3. 方法二协议类控制——像编程一样调空调3.1 协议识别的门道当IRrecvDumpV2输出Protocol: COOLIX时就要在代码里包含ir_Coolix.h。不同品牌协议不同格力常用GREE海尔多用HAIER_AC。库文件里有个ac.protocols.txt文件列出了所有支持的协议建议提前查阅。有个冷知识部分国产空调会混用协议比如米家空调可能用CARRIER_AC协议。创建IRCoolixAC对象后通过ac.on()、setTemp(24)这样的方法就能控制参数比原始码直观多了。但这里有个隐藏关卡不同协议的参数枚举值不同。比如setFan(4)在COOLIX协议表示最小风速在DAIKIN协议却可能变成自动模式。建议先在库文件里搜索kCoolixFan这类常量定义避免调错参数。3.2 动态调节的实战技巧实际项目中我常用方法二做温控联动读取DHT11温湿度数据动态调用ac.setTemp()。这里分享个避坑经验空调有指令冷却时间约1秒连续调用ac.send()会失效。正确做法是用静态变量记录上次状态只有参数变化时才发送。例如static uint8_t lastTemp 0; if(currentTemp ! lastTemp){ ac.setTemp(currentTemp); ac.send(); lastTemp currentTemp; }4. 方法三直接协议码发送——平衡派的选择4.1 协议码的精妙之处当IRrecvDumpV2显示Code: 0xB29F40 (24 Bits)时可以直接用irsend.sendCOOLIX(0xB29F40)发送。这个十六进制数其实是按协议规则编码的状态包前4位0xB表示电源开接着5位0x29是温度值最后3位0xF40包含风速模式。用这种方法比原始码省内存不用存rawData数组又比协议类更灵活。解析协议码需要看协议文档。以COOLIX为例0xB29F40的二进制是101100101001111101000000按位段拆分后位23-201011电源开制冷模式位19-1500101温度24℃的编码值位14-0001111101000000包含风速、睡眠模式等4.2 动态生成协议码的秘诀在智能家居项目中我常用位运算动态生成协议码。比如设置26℃制冷模式uint32_t tempCode (26 - 17) 15; //温度值位移 uint32_t modeCode 0xB 20; //制冷模式 uint32_t fullCode modeCode | tempCode | 0xF40; irsend.sendCOOLIX(fullCode);这种方法的优势是代码精简但需要预先研究协议文档。有个取巧的办法先用方法二生成目标状态的十六进制码再拆解位段规则。5. 调试中的血泪教训信号不稳定时首先检查发射管距离——空调红外接收窗一般在右侧距离最好在3米内。遇到过最诡异的问题是信号时灵时不灵最后发现是开发板USB供电不足换用5V/2A充电头解决。另外某些空调如大金需要先发引导码这时要改用irsend.sendDaikin()这类专用方法。协议兼容性也是大坑。有次用COOLIX协议控制华凌空调发现温度调节无效。后来发现虽然协议相同但华凌的温度偏移量要2。建议在新机型上先用遥控器测试各功能记录下对应的十六进制码再编码。还有个细节部分空调关机后需要延迟5秒才能响应开机指令这在自动化场景要特别注意。

更多文章