0

0

如何在树莓派4上实现红外遥控按键检测与LCD显示联动

心靈之曲

心靈之曲

发布时间:2026-02-25 09:10:15

|

243人浏览过

|

来源于php中文网

原创

如何在树莓派4上实现红外遥控按键检测与LCD显示联动

本文介绍在树莓派4上使用lirc(linux infrared remote control)捕获红外遥控信号,并结合python实时响应按键事件,动态控制lcd显示内容,替代键盘输入方案,适用于嵌入式人机交互项目。

本文介绍在树莓派4上使用lirc(linux infrared remote control)捕获红外遥控信号,并结合python实时响应按键事件,动态控制lcd显示内容,替代键盘输入方案,适用于嵌入式人机交互项目。

在树莓派4上实现红外遥控(IR)按键检测,是构建免接触式交互界面(如LCD信息屏、智能家居控制终端)的关键能力。不同于keyboard等仅监听PC键盘的Python库,红外遥控需依赖底层红外驱动与用户空间协议解析——LIRC(Linux Infrared Remote Control)正是为此设计的标准开源框架。

✅ 基础环境准备

  1. 硬件连接:将红外接收模块(如VS1838B)接入GPIO(推荐GPIO17,即物理引脚11),VCC接5V,GND接地;确保接收头正对遥控器发射端。
  2. 启用红外支持:编辑 /boot/config.txt,添加以下行并重启:
    dtoverlay=gpio-ir,gpio_pin=17
  3. 安装并配置LIRC
    sudo apt update && sudo apt install lirc -y
    sudo systemctl enable lircd

? 测试红外信号接收

运行以下命令验证是否能捕获原始脉冲:

sudo mode2 -d /dev/lirc0

对准遥控器任意键按下,若终端持续输出类似 space 16722159 的脉冲序列,则硬件与内核驱动正常。

?️ 配置遥控器键码映射(以常见NEC遥控为例)

生成自定义配置文件(如/etc/lirc/lircd.conf.d/my_remote.conf):

# Please make this file available to others
# at https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/
# This config file was automatically generated
# using lirc-tools-0.10.1.gitf9b6e2a on Mon Jun 10 15:22:33 2024
#
# contributed by 
#
# brand:                       MyRemote
# model no. / :                
# devices being controlled:     LCD Display
#

begin remote

  name  MyRemote
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       9000 4500
  one           560 1690
  zero          560  560
  gap          108000
  toggle_bit_mask 0x0

      begin codes
          KEY_OK                 0x00FF4AB5
          KEY_UP                 0x00FF02FD
          KEY_DOWN               0x00FFC23D
      end codes

end remote

? 提示:使用 irrecord -d /dev/lirc0 ~/lircd.conf 可交互式录制键码,避免手动猜测十六进制值。

HIX.AI
HIX.AI

HIX.AI是一个多功能的一体化AI写作助手,集成了120多种AI写作工具,支持50多种语言,能够满足各种写作需求。

下载

重启LIRC服务生效:

sudo systemctl restart lircd

? Python实时响应遥控按键(非阻塞式)

关键点在于避免irw命令阻塞主线程(如原问题中“checking the button from the ir will just stop the whole program”)。推荐使用子进程+异步读取,或更稳健的python-lirc库:

pip3 install python-lirc

完整示例代码(兼容LCD显示逻辑):

#!/usr/bin/env python3
import time
import subprocess
import threading
from lirc import RawConnection

# 模拟LCD显示函数(替换为实际LCD驱动,如RPLCD或Adafruit_CharLCD)
def lcd_print(text):
    print(f"[LCD] {text}")

# 全局状态控制
current_mode = "default"  # 'default', 'paused', 'exit'
stop_event = threading.Event()

def ir_listener():
    global current_mode
    try:
        conn = RawConnection()
        while not stop_event.is_set():
            try:
                # 非阻塞读取,超时1秒避免卡死
                code = conn.readline(timeout=1.0)
                if code and len(code) >= 2:
                    key_name = code[1].strip()
                    print(f"IR Key detected: {key_name}")
                    if key_name == "KEY_OK":
                        current_mode = "exit"
                        lcd_print("See you soon!")
                        break
                    elif key_name == "KEY_UP":
                        current_mode = "default"
                        lcd_print("Hello StackOverflow!")
                    elif key_name == "KEY_DOWN":
                        current_mode = "paused"
                        lcd_print("HI!")
            except (IOError, OSError):
                pass  # LIRC暂时不可用,继续轮询
            except Exception as e:
                print(f"IR read error: {e}")
    except Exception as e:
        print(f"LIRC init failed: {e}")

# 主显示循环(模拟5秒自动切换 + 实时响应)
def lcd_main_loop():
    start_time = time.time()
    while not stop_event.is_set():
        elapsed = time.time() - start_time
        if current_mode == "default":
            if elapsed > 5.0:
                lcd_print("HI!")
                current_mode = "paused"
        elif current_mode == "exit":
            break
        time.sleep(0.5)

if __name__ == "__main__":
    lcd_print("Hello StackOverflow!")

    # 启动IR监听线程(后台非阻塞)
    ir_thread = threading.Thread(target=ir_listener, daemon=True)
    ir_thread.start()

    # 运行主显示逻辑
    try:
        lcd_main_loop()
    except KeyboardInterrupt:
        print("\nExiting...")
    finally:
        stop_event.set()

⚠️ 注意事项与最佳实践

  • 权限问题:确保当前用户属于lirc组:sudo usermod -a -G lirc pi,否则RawConnection()会报错。
  • 去抖与重复触发:部分遥控器长按会连续发送相同码,可在Python层加入时间窗口过滤(如记录上次触发时间,间隔
  • LCD兼容性:本例中lcd_print()仅为占位;实际项目请集成对应驱动(如使用I²C接口的16×2 LCD可选用RPLCD.i2c)。
  • 性能考量:irw命令虽简单但启动开销大,不建议在循环中频繁调用subprocess.run(['irw']);python-lirc基于Unix socket直连,延迟更低、更可靠。

通过以上配置,你的树莓派4即可稳定识别红外按键,并在不中断主程序的前提下实时更新LCD内容——真正实现“遥控即响应”的嵌入式交互体验。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1651

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

485

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2308

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1541

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

715

2023.06.29

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号