ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

零基础学ESP32:红外接收——让ESP32看懂遥控器!

2026/9/1 6:02:11 拓冰建站 浏览量
零基础学ESP32:红外接收——让ESP32看懂遥控器! 电视遥控器、空调遥控器、投影仪遥控器……这些遥控器都是用红外信号来传递指令的。今天这节课我们就来学习如何用ESP32接收红外信号让ESP32能“看懂”遥控器按了哪个键。学会了这节课你就能用任意遥控器来控制ESP32——开灯、关灯、播放音乐、调节音量……统统不在话下第一步找到课程看看成品效果打开逗脑IDE点击顶部“文档”在“课程” → “ESP32 MicroPython”分类下找到红外接收。打开课件你会看到本节课的最终效果按下遥控器上的任意按键ESP32的终端立刻打印出对应的按键名称——“1”、“2”……第二步红外遥控的原理发送端遥控器当你按下遥控器上的按键时遥控器会发出一串红外光信号这串信号叫做一帧数据。一帧数据包含前导码9ms高电平 4.5ms低电平告诉接收器“我要开始发数据了”用户码16位标识遥控器身份防止不同设备的遥控器互相干扰数据码8位标识具体按了哪个按键数据反码8位用于校验数据是否正确接收端ESP32 红外接收头红外接收头将光信号转换为电信号ESP32解码后就知道按了哪个键。第三步什么是中断在学习代码之前先认识一个非常重要的概念——中断。用大白话解释你正在看书正常执行程序突然手机响了中断事件你放下书去接电话执行中断处理函数接完电话继续看书回到原来程序。为什么需要中断如果没有中断程序只能一直盯着某个引脚等待数据到来堵塞式检测。这样一来程序什么都干不了效率极低。使用中断后程序可以正常执行其他任务当红外信号到来时ESP32会自动暂停当前任务去处理红外数据处理完再回来继续。这就是中断的价值——不浪费CPU响应还快。MicroPython中配置中断pin.irq(trigger触发条件,handler回调函数)trigger触发中断的条件上升沿、下降沿或两者handler中断发生后要执行的函数第四步动手接线红外接收模块只有3个引脚接线非常简单红外接收头引脚连接ESP32说明VCC3.3V电源正极GNDGND电源地OUTGPIO15信号输出接中断引脚第五步代码——中断 解码importmachineimportutimefrommachineimportPinclassIR(object):CODE{162:ch-,98:ch,226:ch,34:prev,2:next,194:play/stop,152:0,104:*,176:#,224:-,168:,144:EQ,104:0,152:100,176:200,48:1,24:2,122:3,16:4,56:5,90:6,66:7,74:8,82:9}def__init__(self,gpioNum):self.irRecvmachine.Pin(gpioNum,machine.Pin.IN,machine.Pin.PULL_UP)self.irRecv.irq(triggermachine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING,handlerself.__handler)# 配置中断信息self.ir_step0self.ir_count0self.buf64[0foriinrange(64)]self.recived_okFalseself.cmdNoneself.cmd_lastNoneself.repeat0self.repeat_lastNoneself.t_okNoneself.t_ok_lastNoneself.start0self.start_last0self.changedFalsedef__handler(self,source): 中断回调函数 thisComeInTimeutime.ticks_us()# 更新时间curtimeutime.ticks_diff(thisComeInTime,self.start)self.startthisComeInTimeifcurtime8500andcurtime9500:self.ir_step1returnifself.ir_step1:ifcurtime4000andcurtime5000:self.ir_step2self.recived_okFalseself.ir_count0self.repeat0elifcurtime2000andcurtime3000:# 长按重复接收self.ir_step3self.repeat1elifself.ir_step2:# 接收4个字节self.buf64[self.ir_count]curtime self.ir_count1ifself.ir_count64:self.recived_okTrueself.t_okself.start#记录最后ok的时间self.ir_step0elifself.ir_step3:# 重复ifcurtime500andcurtime650:self.repeat1def__check_cmd(self):byte40foriinrange(32):xi*2tself.buf64[x]self.buf64[x1]byte41ift1800andt2800:byte41user_code_hi(byte40xff000000)24user_code_lo(byte40x00ff0000)16data_code(byte40x0000ff00)8data_code_rbyte40x000000ffself.cmddata_codedefscan(self):# 接收到数据ifself.recived_ok:self.__check_cmd()self.recived_okFalse# 数据有变化ifself.cmd!self.cmd_lastorself.repeat!self.repeat_lastorself.t_ok!self.t_ok_last:self.changedTrueelse:self.changedFalse# 更新self.cmd_lastself.cmd self.repeat_lastself.repeat self.t_ok_lastself.t_ok# 对应按钮字符print(self.cmd)sself.CODE.get(self.cmd)returnself.changed,s,self.repeat,self.t_okif__name____main__:tIR(15)while(True):changed,s,repeat,t_okt.scan()print(changed,s,repeat,t_ok)utime.sleep(0.2)代码核心逻辑函数作用__init__初始化引脚配置中断__handler中断回调函数记录每个脉冲的时间间隔__check_cmd将64个脉冲数据解码为4个字节scan返回解码后的按键信息第六步保存运行拿起遥控器试试按Ctrl S保存选择ESP32开发板设备给文件命名比如ir_receiver.py点击保存。点击运行按钮终端显示日志。拿起红外遥控器对准接收头按下按键观察终端日志的变化红外接收能做什么应用场景用途智能家居控制用遥控器控制灯光、风扇、空调万能遥控器ESP32学习并模拟各种遥控器信号红外防盗报警检测到红外信号变化触发报警互动装置用遥控器控制音乐播放、LED效果切换智能电视盒子自制红外遥控的媒体播放器全程回顾步骤操作效果找到课程文档→课程→ESP32MicroPython→红外接收了解红外接收认识原理学习前导码、用户码、数据码理解红外数据格式认识中断理解“暂停当前任务去处理紧急事件”知道为什么要用中断动手接线VCC→3.3V, GND→GND, OUT→GPIO15硬件就位打开代码点击“打开”按钮代码进入编辑器保存运行CtrlS → 选择ESP32 → 运行开始监听红外信号按遥控器按下任意按键终端打印按键名称如果你对本节课感兴趣去官网www.dounao.cn下载逗脑IDE准备好相关配件跟着课件走一遍。有任何问题或建议欢迎在评论区留言告诉我们。