树莓派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
相关产品推荐
相关产品推荐

