本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:期望氢气球

  在上一篇文章中,我们利用 ESP32 的 GPIO 中断成功捕获了红外信号的脉冲时长。成功运行后你会活得一串数字。但是,看着串口打印出来的一串串 560, 1690, 560, 560... 数字,你可能会感到困惑:这些数字到底代表什么?为什么不同品牌的家电这串数字完全不同?

一、 物理层:载波

  首先要纠正一个直觉上的误区:红外遥控器并不是简单地亮灯代表 1,灭灯代表 0。

  如果我们直接由 GPIO 控制红外 LED 亮灭,信号会立刻淹没在日光灯、太阳光等环境红外线噪音中。为了解决这个问题,红外遥控引入了载波的概念。

  • 调制: 遥控器发射信号时,并不是让 LED 持续亮,而是以特定的频率(38kHz)快速闪烁。
  • 解调: 电器上的红外接收头,内部集成了带通滤波器。它只对 38kHz 频率闪烁的红外光敏感,对于阳光这种直流或低频红外光视而不见。

      关键点: 我们代码中记录的 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 位数据被分成了四个部分:

    1. 引导码:9000μs 高电平 + 4500μs 低电平。让接收头调整增益,准备接收数据。
    2. 地址码: 0x00 (8位) ,告诉接收方我是电视机遥控器。
    3. 地址反码 : 0xFF 校验。0x00 取反就是 0xFF。如果接收头收到的两段数据不互为反码,说明传输传错了,直接丢弃。
    4. 命令码: 0x02 (8位)具体动作。比如“音量+”。
    5. 命令反码 : 0xFD (8位) 校验命令是否正确。
    逆向未知设备

      如果你遇到了一个奇葩设备,既不是 NEC 也不是 Sony,甚至 Home Assistant 社区都没人讨论,该怎么办?

      只能使用Raw 大法,不要试图去理解它,成为它。而是直接录音。 在 Home Assistant 或 ESPHome 中,使用 raw 模式。直接记录刚才提到的 [560, 1690, 560, 560...] 数组。原样播放,是能直接解决问题的。

      手把手教你破解红外遥控器协议规则

      手把手教你破解红外遥控器协议规则

  • #在头条安利我的兴趣#