本文将详细介绍树莓派与ESP32是如何搭配一体化的红外接收模块,实现38kHz红外信号的接收检测,同时搭配红外发射功能,完成“发射+接收”的闭环测试,适合新手快速上手。
红外发射模块:核心为 940nm 红外发光二极管(IR LED)。单片机输出带有 38kHz 载波调制 的脉冲信号(如常见的 NEC 编码),经板载三极管放大后驱动 LED 发射人眼不可见的红外光。
红外接收模块:核心为集成式红外接收头(如 VS1838B / HS0038)。内部集成了光电二极管、前置放大器、38kHz 带通滤波器与解调电路。它能自动滤除可见光及环境杂光干扰,并将 38kHz 载波解调为标准数字逻辑电平(有信号时输出低电平,空闲时输出高电平)。
工作电压:3.3V - 5V
核心元件:940nm红外发射二极管与VS1838B/1838一体化接收头
接收频率:38kHz
红外波长:940nm
发射功能:数字信号(输入 38kHz 脉冲调制波)
接收功能:数字信号(无信号高电平)(有信号低电平)
核心判断:检测到38kHz信号时输出0,未检测到输出1
接收距离:0.5~5米无遮挡情况下,对准后稳定接收,适合短距离测试
引脚定义:VCC(电源)、GND(接地)、OUT(信号输出)接线时切勿接反,否则模块无法工作
工作温度:-20℃ ~ 60℃
1必须38kHz载波调制:接收头内部带有 38kHz 带通滤波器。如果发射端仅输出常高/常低电平,接收端将无法正确识别信号。开发时建议直接调用现成的库(如 Arduino 的 IRremote 库等)。
2方向性与遮挡:红外线属于直线光波传输,穿透力弱,两模块之间不能有不透明物体遮挡,且二极管需尽量正对以保证最大通信距离。
3环境光干扰:避免强直射阳光或强白炽灯直射接收头,强光会导致接收灵敏度下降或误触发。

重点提醒:不要用普通光敏二极管替代一体化接收头!普通光敏二极管无法解调38kHz载波,会导致无法检测到红外信号,必须使用HX1838、VS1838这类一体化模块。
| 以树莓派Pico开发板为例,提醒: 请按下图的引脚标识接线,务必不能接错。如果接错线通电后会导致设备烧毁! |

| 以树莓派Pico开发板为例,提醒: 请按下图的引脚标识接线,务必不能接错。如果接错线通电后会导致设备烧毁! |

通过上面参数我们已经了解到红外接收传感器是可直接识别38kHz标准红外载波信号。我们使用红外发射模块来发送出38KHz信号,将发射对准接收就能被识别到。我这里发射使用树莓派Pico的GP16引脚用PWM(脉冲宽度调制),来生成38kHz方波(红外载波)按图接好后运行程序,只需要将发射头对着红外接收传感器不停的晃动就能显示:已检测到信号。
| main 下载这个main源代码上传至树莓派pico文件内,直接运行查看数据(如下图) |
如果你还没有搭建好树莓派Python的编程环境可参考这个帖子→:如何搭建Python编程环境

如果此时你还有别的红外频率为38KHz发射装置,也可以对着接收传感器模块就能检测到发射过来的信号!
1. 本教程实现的是“红外载波检测”,若需实现红外遥控(如接收红外遥控器的按键信号),可在本代码基础上,增加红外信号解码逻辑(如NEC编码解码)。
2. 红外发射管的发射距离可通过调整占空比优化(占空比越大,发射功率越强,距离越远),但不建议超过60%(避免发热)。
3. 若不需要持续发射红外信号,可在代码中添加按键控制,实现“按下按键发射,松开停止”的功能。
4.本文完整覆盖了树莓派Pico红外接收模块的使用,从硬件参数、接线、代码的实现,可快速完成“发射-接收”的闭环测试。
本次以ESP32-S3主板为例按下图接好连接线,务必注意不可接反,否则会烧毁设备
接收模块:VCC接3v供电,GND接GND,OUT接GPIO4
发射模块:VCC接3v供电,GND接GND,DAT接GPIO5

| VS838 下载这个源代码直接用Arduino IDE编译上传程序打开串口监视查看,查看检测数据(如下图) |
如果你还没有搭建好ESP32的ArduinoIDE的编程环境可参考这个帖子→:搭建ArduinoIDE编程环境
测试方法:发射和接收模块靠近时会显示已接收到信号,如果中间用不透明的物体挡住就会显示远离区域未收到信号。

代码流程:
1. GPIO4 通过 PWM 输出 38kHz 方波,驱动红外发射模块。
2. VS1838 接收模块接 GPIO5:
- 未收到 38kHz 红外信号:输出 HIGH(1)
- 收到 38kHz 红外信号:输出 LOW(0)
3. 程序先关闭发射,读取一次 GPIO5 的待机状态。
4. 然后开启 GPIO4 的 38kHz 信号,在 30ms 内连续读取 GPIO5 共 100 次。
5. 只要读到一次 LOW,就说明接收模块收到了发射模块的红外信号,闭环测试成功。
6. 检测完成后关闭发射,避免红外 LED 长时间工作。
可以把红外模块当作一种“无线开关”:
- 把发射端输出 38kHz的红外信号,加入一个按键来控制他输出。不按下按键时不输出,只有按下才会让发射模块输出38kHz的红外信号
- 把接收端GPIO5 检测是否收到 38kHz 信号。加一个输出引脚,如果收到信号就控制其他设备开启,如果没有收到就关闭设备。
以下用按键通过红外发射接收来控制led灯举例:
按下发射端按键
↓
GPIO4 输出 38kHz 红外
↓
接收模块 GPIO5 变为 LOW
↓
ESP32 点亮 LED
松开发射端按键
↓
GPIO4 停止输出 38kHz
↓
GPIO5 恢复 HIGH
↓
ESP32 熄灭 LED