
本文介绍如何在树莓派4上通过红外接收模块捕获遥控器按键信号,并结合lcd显示实现事件驱动的文本切换逻辑,无需阻塞主线程,支持实时响应与非键盘外设交互。
本文介绍如何在树莓派4上通过红外接收模块捕获遥控器按键信号,并结合lcd显示实现事件驱动的文本切换逻辑,无需阻塞主线程,支持实时响应与非键盘外设交互。
在嵌入式Python项目中,仅依赖 keyboard 包无法处理红外(IR)遥控等外部输入设备——因其专为PC键盘设计,不支持GPIO级红外信号解码。要在树莓派4上实现“LCD循环显示 → 按下遥控键立即切换内容”的功能,需采用底层红外信号接收 + 非阻塞事件检测方案。
✅ 推荐技术栈
- 硬件:VS1838B红外接收头(38kHz载波)、红外遥控器、I²C或SPI接口LCD(如1602 + PCF8574)
- 软件:lirc(Linux Infrared Remote Control)服务 + Python python-lirc 或原生GPIO中断(推荐 RPi.GPIO + 红外脉冲解码库如 pyirrec),或更轻量的 gpiozero 配合预配置LIRC
? 快速部署(基于LIRC,稳定可靠)
-
启用LIRC并配置接收器
编辑 /boot/config.txt,添加:dtoverlay=gpio-ir,gpio_pin=17
重启后运行 sudo mode2 -d /dev/lirc0,按下遥控键应看到脉冲输出,确认硬件连通。
-
录制遥控键码(以“任意键”为例)
sudo irrecord -d /dev/lirc0 ~/lircd.conf
按提示操作生成配置文件,再复制到系统路径:
sudo cp ~/lircd.conf /etc/lirc/lircd.conf sudo systemctl restart lircd
-
Python主程序(非阻塞响应示例)
使用 python-lirc 库监听按键(安装:pip3 install python-lirc):import lirc import time from datetime import datetime # 假设已封装好lcd_print()函数(如使用Adafruit_CircuitPython_CharLCD) # 初始化LIRC socket sock = lirc.init("lcd_remote", blocking=False) # 初始状态 state = "idle" # "idle", "counting", "stopped" start_time = time.time() def lcd_print(text): # 示例:实际请替换为你的LCD驱动调用 print(f"[LCD] {text}") try: while True: # 主循环:控制LCD显示逻辑 now = time.time() if state == "idle": lcd_print("Hello StackOverflow!") state = "counting" start_time = now elif state == "counting": if now - start_time >= 5: lcd_print("HI!") state = "stopped" elif state == "stopped": pass # 等待按键唤醒 # 非阻塞检查红外按键(关键!避免卡死) code = lirc.nextcode() # 返回空列表[]或[{"code": "KEY_OK", "repeat": 0}] if code and len(code) > 0: key = code[0].get("code", "") print(f"IR key detected: {key}") if state == "stopped": lcd_print("See you soon!") else: lcd_print("Hello StackOverflow!") state = "idle" # 重置状态机 time.sleep(0.1) # 减轻CPU占用 except KeyboardInterrupt: print("\nExiting...") finally: lirc.deinit()
⚠️ 关键注意事项
- 不要轮询GPIO电平替代红外解码:问题答案中提到“检查按钮高低电平会阻塞程序”,这是因为原始红外信号是调制脉冲(38kHz),直接读取GPIO无法识别编码,必须经LIRC或专用解码库处理。
- blocking=False 是核心:若使用 lirc.nextcode(blocking=True),程序将永久等待按键,失去LCD定时刷新能力。
- 重复按键处理:lirc.nextcode() 返回的字典含 "repeat" 字段(>0表示长按重复),建议过滤 repeat == 0 避免误触发。
- LCD线程安全:若LCD驱动非线程安全,所有 lcd_print() 调用应在同一主线程完成,本方案已满足。
✅ 总结
通过LIRC服务接管红外信号解码,配合非阻塞的 nextcode() 调用,可在树莓派4上实现高可靠性、低延迟的遥控交互。该方案脱离键盘依赖,扩展性强——后续可轻松接入多键映射、组合键逻辑或与MQTT联动,是IoT人机界面开发的标准实践路径。









