树莓派开发中如何检测指定状态在固定时长内持续保持为True?
树莓派按键长按检测优化方案
核心实现思路
你遇到的按键输入跳变是机械按键的正常抖动现象,无需额外硬件调整,通过时间戳检测方案可同时满足消抖、长按时长判断的需求,还能避免多层if嵌套:
- 引入变量记录首次检测到按键按下的时间戳
- 循环中持续检测按键状态:
- 按键保持按下时,计算当前时间与首次按下时间的差值,差值达到你设定的阈值(如1.5秒)时触发LED点亮
- 按键松开时,重置时间戳并熄灭LED
- 循环间隔设为10ms即可兼顾响应速度和CPU占用,不会出现sleep阻塞导致的效率问题
优化后代码
import RPi.GPIO as gpio from time import time, sleep # 配置参数,可根据需求修改 LONG_PRESS_DURATION = 1.5 # 长按触发时长,单位秒 SCAN_INTERVAL = 0.01 # 按键扫描间隔,单位秒 gpio.setmode(gpio.BOARD) gpio.setup(19, gpio.IN) gpio.setup(11, gpio.OUT) # 存储首次按下的时间戳,初始为None press_start_time = None try: while True: key_state = gpio.input(19) if key_state == 1: # 首次检测到按下,记录时间 if press_start_time is None: press_start_time = time() else: # 计算按下时长,达到阈值就点亮LED press_duration = time() - press_start_time if press_duration >= LONG_PRESS_DURATION: print("on") gpio.output(11, True) else: # 按键松开,重置时间戳,熄灭LED press_start_time = None print("off") gpio.output(11, False) sleep(SCAN_INTERVAL) finally: print("\nInterrupted.\nCleaning code") gpio.cleanup()
方案优势
- 逻辑清晰无嵌套,只需修改
LONG_PRESS_DURATION参数即可调整长按触发时长 - 不会出现固定时长sleep导致的程序阻塞,循环中可以同时添加其他任务逻辑
- 自带消抖效果:短于
SCAN_INTERVAL的抖动信号会被自动过滤,不会触发误判
内容的提问来源于stack exchange,提问作者Kamu
相关产品推荐
相关产品推荐

