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

树莓派GPIO按键触发错误事件:二次按键播放音频不符如何解决

故障原因
  • 两个按键共用全局的vtc(当前音频时长)、started_t(上次触发时间)变量,任意按键触发后,冷却阈值就被设置为该按键对应音频的时长,冷却期内按另一个按键会直接被拦截,不会执行对应播放逻辑。
  • GPIO输入引脚未配置上下拉电阻,易受外界干扰出现电平浮动,可能引发误触发。
修正后代码
#!/usr/bin/env python
#coding: utf8
import time 
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
# 配置引脚为输入模式,启用上拉电阻,按键另一端接GND即可
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    vtc1 = 7       # 音频1时长(秒)
    vtc2 = 6       # 音频2时长(秒)
    
    # 两个按键分别维护自己的上次触发时间
    started_t1 = 0
    started_t2 = 0

    while True:     
        # 按键1逻辑,上拉模式下按下为低电平,所以用not判断
        if not GPIO.input(23) and time.time() - started_t1 > vtc1:
            started_t1 = time.time()
            print("按键1按下")
            # 先停止之前的播放进程,避免音频重叠
            os.system('pkill omxplayer > /dev/null 2>&1')
            os.system('omxplayer -o local /audio_project/sound_1.WAV &')
        time.sleep(0.2)

        # 按键2逻辑
        if not GPIO.input(24) and time.time() - started_t2 > vtc2:
            started_t2 = time.time()
            print("按键2按下")
            os.system('pkill omxplayer > /dev/null 2>&1')
            os.system('omxplayer -o local /audio_project/sound_2.WAV &')
        time.sleep(0.2)
except Exception as e:
    print(f"发生异常: {e}")
finally:
    GPIO.cleanup()
补充说明

如果你的按键接线是另一端接3.3V,把代码里的not GPIO.input(xx)判断去掉,同时把GPIO配置改为pull_up_down=GPIO.PUD_DOWN即可。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:03