红外遥控器的通信规则(NEC 协议),可以把它想象成遥控器和 ESP32 之间的 “秘密语言”,核心是用「高低电平的持续时间」传递 0 和 1 的二进制数据。
为什么用「高低电平时间」传数据?
红外遥控器发信号时,人眼看不到红外光,但可以通过 ** 电信号的 “高低变化”** 传递信息。
为了让接收端(ESP32)能识别,大家约定了一套规则:用不同长度的高电平表示 0 和 1,就像摩尔斯电码里 “短滴” 代表点(・)、“长滴” 代表划(—)。
完整通信流程(NEC 协议)
遥控器按一下按键,会发出一段固定格式的信号,分 3 部分:
① 引导码 → ② 数据位(32 位) → ③ 停止位(可选)
(1)① 引导码:“我要发数据啦!”
作用:告诉接收端 “准备好,要传数据了”,相当于见面先打招呼。
格式:先低电平持续 9ms(电压接近 0V),再高电平持续 4.5ms(电压接近 3.3V)。
类比:就像发电报时,先敲一个 “长停顿 + 长音”,说 “注意,要发消息了”。
(2)② 数据位:32 位的 “二进制密码”
引导码之后,会传 4 个字节(32 位) 的数据,分成:
地址码(8 位):区分不同设备(比如电视、空调遥控器,地址码不同)。
地址反码(8 位):地址码的 “反码”(用于校验,防止传错)。
命令码(8 位):具体按键的功能(比如电源键、音量 +,每个按键对应一个码)。
命令反码(8 位):命令码的 “反码”(同样用于校验)。
每一位怎么传?
每一位用 “低电平 0.56ms + 高电平” 表示:
如果高电平持续 0.56ms → 代表二进制 0
如果高电平持续 1.68ms → 代表二进制 1
举个例子:
要传二进制 1010 0101,信号会是这样:
低0.56ms → 高1.68ms(1) → 低0.56ms → 高0.56ms(0) → ...
ESP32 GPIO14接入IR
代码
from machine import Pin
import time
# 红外接收引脚(GPIO14)
IR_PIN = 14
ir_receiver = Pin(IR_PIN, Pin.IN, Pin.PULL_UP)
# 存储解码数据(4字节:地址码、地址反码、命令码、命令反码)
ir_data = [0, 0, 0, 0]
# 标记是否接收到完整数据
data_received = False
def decode_nec():
"""解码NEC协议红外信号"""
global ir_data, data_received
ir_data = [0, 0, 0, 0] # 重置数据
ESP32红外遥控通信规则与流程

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



