树莓派3B START/STOP按钮检测异常及重复打印问题求助
问题解决方案
一、STOP按钮无输出的问题
你的STOP按钮硬件直接接地,同时GPIO配置使用了GPIO.PUD_DOWN(内部下拉电阻),这会导致不管按钮是否按压,引脚始终处于LOW电平,永远触发不了GPIO.HIGH的判断条件,因此没有输出。
根据你模拟设备按钮的需求(STOP按钮常态LOW、按压时触发动作),推荐以下修改方案:
- 无需改动硬件,将STOP按钮的GPIO配置改为上拉电阻,检测LOW电平(常态为HIGH,按压按钮接地后变为LOW,对应按钮按压动作):
修改STOP引脚的配置代码:
同时修改判断逻辑:for pin in stop_pins: GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)for pin in stop_pins: if GPIO.input(pin) == GPIO.LOW: print("Pin", pin," is low (STOP pressed)")
二、START按钮重复打印的问题
这是因为while True循环会持续检测引脚电平,只要按钮处于按压状态,就会反复执行打印语句。解决方法是检测引脚的状态变化,仅在电平从HIGH变为LOW时打印一次,同时添加消抖处理(机械按钮按压时会有电平抖动)。
修改后的完整代码
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) start_pins = [14] stop_pins = [15] # 配置上拉电阻,常态HIGH,按压接地变LOW for pin in start_pins: GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) for pin in stop_pins: GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 记录引脚初始状态 start_last_state = [GPIO.HIGH for _ in start_pins] stop_last_state = [GPIO.HIGH for _ in stop_pins] debounce_time = 0.2 # 消抖时间,避免按钮抖动误触发 try: while True: # 处理START按钮 for idx, pin in enumerate(start_pins): current_state = GPIO.input(pin) # 仅在状态变化且消抖后执行操作 if current_state != start_last_state[idx]: time.sleep(debounce_time) current_state = GPIO.input(pin) if current_state == GPIO.LOW: print("Pin", pin," is low (START pressed)") start_last_state[idx] = current_state # 处理STOP按钮 for idx, pin in enumerate(stop_pins): current_state = GPIO.input(pin) if current_state != stop_last_state[idx]: time.sleep(debounce_time) current_state = GPIO.input(pin) if current_state == GPIO.LOW: print("Pin", pin," is low (STOP pressed)") stop_last_state[idx] = current_state time.sleep(0.01) # 降低循环频率,减少CPU占用 finally: GPIO.cleanup() # 程序退出时清理GPIO资源,避免引脚状态异常
代码说明
- 新增状态记录变量,仅在引脚电平发生变化时处理事件,避免重复打印
- 添加消抖时间,过滤机械按钮按压时的电平抖动,防止误触发
- 使用
try...finally块,确保程序退出时自动清理GPIO资源 - 循环末尾添加短延时,降低CPU占用率
内容的提问来源于stack exchange,提问作者user20758216
相关产品推荐
相关产品推荐

