1. 从零开始:ESP8266红外控制空调的准备工作
第一次用ESP8266控制空调时,我对着开发板和一串代码发懵——这玩意儿真能替代遥控器?实测下来不仅可行,而且比想象中简单。先说说基础装备:一块ESP8266开发板(NodeMCU就行)、红外发射管(LED)和接收头(VS1838B这类),再加个杜邦线就能开工。这里有个坑要注意:红外发射管有正负极之分,接反了信号发不出去,我第一次就栽在这。
安装IRremoteESP8266库时,推荐用Arduino IDE的库管理器直接搜,比手动下载省心。安装完记得检查库版本,我遇到过v2.7.19和v2.8.0协议支持差异的问题。硬件连接更简单:发射管正极接GPIO4(D2引脚),负极接GND;接收头VCC接3.3V,OUT接任意GPIO(比如D5),GND接地。这里有个实用技巧:用手机摄像头对准发射管,按下发送代码时能看到紫色光点,说明硬件没问题。
2. 方法一:原始码发送——最直接的"复读机"方案
2.1 抓取红外信号就像录音
原始码发送相当于把空调遥控器的信号原样录制再播放。用库里的IRrecvDumpV2例程抓信号时,建议把手机万能遥控调成"学习模式"(我用的小米手机),对准接收头按按钮。串口会输出两段关键数据:rawData数组和协议类型。这里容易踩的坑是信号干扰——日光灯、LED灯都可能影响接收,最好在暗环境下操作。
我抓取美的空调开关信号时,rawData数组长度199,38kHz载波频率。注意看串口输出的"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-20:1011(电源开+制冷模式)
- 位19-15:00101(温度24℃的编码值)
- 位14-0:001111101000000(包含风速、睡眠模式等)
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秒才能响应开机指令,这在自动化场景要特别注意。