3、红外遥控协议基础:红外通信原理、NEC协议详解
做温湿度联动空调,第一步不是写代码,而是搞懂遥控器怎么跟空调「说话」的。说白了,红外遥控就是利用人眼看不见的红外光,通过特定频率的脉冲来传递0和1。我最早做这个项目时,以为直接买个红外发射管就能搞定,结果空调死活没反应——后来才发现,协议没对上,一切都是白搭。
3.1 红外通信原理:光与电的默契
红外遥控的核心其实很简单:
- 载波:红外LED以38kHz的频率快速闪烁(人眼看不见)
- 调制:把要发送的数据「骑」在这个载波上
- 解调:接收端(空调里的红外接收头)把载波滤掉,还原出原始数据
为什么是38kHz?嗯,这算是行业约定。我查过资料,早期日本厂商选这个频率是因为它避开了常见的环境光干扰(比如日光灯50Hz/100Hz的谐波)。现在市面上90%的家电都用38kHz,包括你家的空调、电视、机顶盒。
关键参数速查表
| 参数 | 典型值 | 说明 |
|---|---|---|
| 载波频率 | 38 kHz | 也有36kHz、40kHz,但38kHz最主流 |
| 发射波长 | 940 nm | 近红外波段,普通红外LED都能覆盖 |
| 有效距离 | 5~15米 | 取决于发射功率和接收灵敏度 |
| 调制方式 | OOK(开关键控) | 有载波=1,无载波=0 |
你想想看,红外接收头其实是个「懒人」——它只关心有没有38kHz的信号,不关心信号里具体是什么。所以我们要做的,就是把数据编码成特定时间长度的脉冲串,让接收头能正确解调。
3.2 NEC协议详解:家电界的通用语言
NEC协议是日本电气公司(NEC)在80年代推出的红外遥控协议。虽然叫「协议」,但它其实只定义了物理层和数据链路层——也就是「怎么发」和「发什么格式」。我拆过十几个品牌的空调遥控器,发现90%都基于NEC协议,只是数据定义不同。
3.2.1 协议帧结构
一个完整的NEC帧长这样:
引导码 + 地址码(8bit) + 地址反码(8bit) + 命令码(8bit) + 命令反码(8bit) + 停止位
总共34位数据(不含引导码和停止位)。为什么要有反码?说白了就是校验——接收端把地址码和地址反码加起来,如果结果不是0xFF,说明传输出错了。我在项目中遇到过,有些廉价遥控器不按规范来,反码算错了,导致空调偶尔误动作。嗯,这里要注意:反码校验是NEC协议的保命符,别省。
3.2.2 时序细节
NEC协议用脉冲宽度来表示0和1:
| 信号 | 载波脉冲 | 空闲间隔 | 总时长 |
|---|---|---|---|
| 引导码 | 9 ms | 4.5 ms | 13.5 ms |
| 逻辑"0" | 560 μs | 560 μs | 1.12 ms |
| 逻辑"1" | 560 μs | 1.69 ms | 2.25 ms |
| 重复码 | 9 ms | 2.25 ms | 11.25 ms |
| 停止位 | 560 μs | — | 560 μs |
引导码的作用是「唤醒」接收端——告诉它「我要发数据了,准备好」。逻辑0和1的区别在于空闲间隔的长短:560μs对560μs是0,560μs对1.69ms是1。这个设计很巧妙,你想想看,接收端只需要测量两次下降沿之间的时间差就能判断是0还是1,不需要精确的时钟同步。
我的经验:用逻辑分析仪抓NEC信号时,别只看波形。把时间光标放在引导码的下降沿,然后测量到第一个数据位下降沿的时间——如果刚好是13.5ms左右,说明引导码正确。我曾经被一个劣质遥控器坑过,它的引导码只有8ms,导致接收端偶尔漏帧。
3.2.3 重复码与连发机制
当你长按遥控器按键时,NEC协议不会重复发送完整帧,而是发送重复码。重复码的结构是:9ms载波 + 2.25ms空闲 + 560μs停止位。接收端检测到重复码后,就知道「用户还在按着同一个键」,于是继续执行上次的命令。
这个机制在空调遥控器里特别重要——比如调温度时,你按住「升温」键不放,遥控器每隔110ms左右发一个重复码,空调就持续升温。如果每次都发完整帧,不仅功耗高,还容易因为时序偏差导致误码。
3.3 常见空调遥控器编码格式分析
NEC协议只定义了「怎么发」,没定义「发什么」。所以不同品牌的空调,遥控器编码格式千差万别。我拆解过格力、美的、海尔、大金四个品牌的遥控器,发现它们的编码格式各有特点:
| 品牌 | 地址码 | 命令码结构 | 特殊点 |
|---|---|---|---|
| 格力 | 0x00 | 8位功能码 + 8位校验 | 校验码是功能码的取反 |
| 美的 | 0x88 | 16位数据,高8位是功能,低8位是温度 | 温度用BCD码编码 |
| 海尔 | 0x01 | 24位数据,包含模式、风速、温度、定时 | 使用扩展NEC协议,数据位更长 |
| 大金 | 0x20 | 16位数据,但位序是LSB first | 与标准NEC的MSB first相反 |
你看,光是地址码就各不相同。格力用0x00,美的用0x88——这意味着如果你用格力的遥控器去控制美的空调,地址码就对不上,空调根本不会响应。我曾经犯过这个错:拿着格力的遥控器代码去控制美的空调,折腾了两天才发现是地址码的问题。
避坑指南:
- 不要假设所有空调都用标准NEC协议——有些品牌用RC-5、Sony SIRC甚至自定义协议
- 地址码不一定固定——有些空调会通过拨码开关或遥控器配对来改变地址
- 命令码的位序(MSB first vs LSB first)一定要确认——搞反了数据全错
3.4 核心知识体系一览
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的知识点串起来了。从底层的红外通信原理,到NEC协议的帧结构和时序,再到具体空调品牌的编码差异——每一步都是环环相扣的。我个人习惯是先搞懂原理,再去看协议细节,最后才动手写代码。顺序搞反了,很容易被各种细节绕晕。