You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派开发中如何检测指定状态在固定时长内持续保持为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:15:02