手把手教你破解红外遥控器协议规则
本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:期望氢气球
在上一篇文章中,我们利用 ESP32 的 GPIO 中断成功捕获了红外信号的脉冲时长。成功运行后你会活得一串数字。但是,看着串口打印出来的一串串 560, 1690, 560, 560... 数字,你可能会感到困惑:这些数字到底代表什么?为什么不同品牌的家电这串数字完全不同?
一、 物理层:载波首先要纠正一个直觉上的误区:红外遥控器并不是简单地亮灯代表 1,灭灯代表 0。
如果我们直接由 GPIO 控制红外 LED 亮灭,信号会立刻淹没在日光灯、太阳光等环境红外线噪音中。为了解决这个问题,红外遥控引入了载波的概念。
关键点: 我们代码中记录的 560μs,并不是 LED 亮了 560 微秒,而是 LED 以 38kHz 的频率闪烁了 560 微秒。
二、 逻辑层当你剔除载波后,剩下的就是高低电平的包络线。不同的厂家定义了不同的规则来把这些电平翻译成 0 和 1,这就是编码格式。
1. 脉冲距离编码这是 NEC 协议采用的方式。无论 0 还是 1,高电平的时间是固定的。区别在于低电平的时间长短。因此当我们看到一串很整齐的短脉冲,间隔忽长忽短,基本就是 NEC。
2. PWM编码
这是 Sony 设备采用的方式。 无论 0 还是 1,低电平的时间是固定的。区别在于高电平的时间长短。波形看起来像不同宽度的实心方块排列在一起。
3. 曼彻斯特编码
这是 飞利浦采用的方式,比较古老但抗干扰强。它不看电平长短,而是看电平跳变的方向。从低变高代表 1,从高变低代表 0。这种协议很难用简单的时长数组来肉眼解析,通常需要专门的库。
三、标准 NEC 数据包结构
既然 NEC 是最通用的协议(TCL、创维、海尔、美的等大部分型号都基于此),我们来深度解剖它的一条完整指令例如:0x00FF02FD。
这 32 位数据被分成了四个部分:
- 引导码:9000μs 高电平 + 4500μs 低电平。让接收头调整增益,准备接收数据。
- 地址码: 0x00 (8位) ,告诉接收方我是电视机遥控器。
- 地址反码 : 0xFF 校验。0x00 取反就是 0xFF。如果接收头收到的两段数据不互为反码,说明传输传错了,直接丢弃。
- 命令码: 0x02 (8位)具体动作。比如“音量+”。
- 命令反码 : 0xFD (8位) 校验命令是否正确。
如果你遇到了一个奇葩设备,既不是 NEC 也不是 Sony,甚至 Home Assistant 社区都没人讨论,该怎么办?
只能使用Raw 大法,不要试图去理解它,成为它。而是直接录音。 在 Home Assistant 或 ESPHome 中,使用 raw 模式。直接记录刚才提到的 [560, 1690, 560, 560...] 数组。原样播放,是能直接解决问题的。


声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
