树莓派4按键控制红、蓝、绿LED依次点亮代码故障咨询
问题原因
- 你的代码没有做按键边沿检测:你按下按键的时长通常远大于循环间隔的10ms,只要按键保持按下状态,每次循环都会匹配对应
previous_button_state的条件,导致状态连续切换3次,最终表现为按一次按键三个LED依次点亮 else分支逻辑错误:仅在按键未按下时关闭红色LED,蓝色、绿色LED不会被该分支控制,不符合预期逻辑- 缺少机械按键消抖逻辑,容易出现状态误判
修复方案
调整逻辑为仅在按键从松开变为按下的瞬间触发一次状态切换,同时修正LED控制逻辑即可实现预期效果,修复后的代码如下:
import RPi.GPIO as GPIO import time current_led_state = 0 last_button_level = GPIO.LOW DEBOUNCE_DELAY = 0.02 # 20ms消抖时间 LED_RED = 17 LED_BLUE = 27 LED_GREEN = 22 BUTTON_PIN = 26 GPIO.setmode(GPIO.BCM) # 按键如果没有外接下拉电阻,开启内部下拉避免电平浮动,接了上拉则删除pull_up_down参数即可 GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED_RED, GPIO.OUT) GPIO.setup(LED_BLUE, GPIO.OUT) GPIO.setup(LED_GREEN, GPIO.OUT) # 初始全部熄灭 GPIO.output(LED_RED, GPIO.LOW) GPIO.output(LED_BLUE, GPIO.LOW) GPIO.output(LED_GREEN, GPIO.LOW) while True: current_button_level = GPIO.input(BUTTON_PIN) # 检测按键按下的上升沿 if current_button_level == GPIO.HIGH and last_button_level == GPIO.LOW: time.sleep(DEBOUNCE_DELAY) # 消抖后确认按键确实按下,再执行状态切换 if GPIO.input(BUTTON_PIN) == GPIO.HIGH: if current_led_state == 0: # 点亮红色LED GPIO.output(LED_RED, GPIO.HIGH) GPIO.output(LED_BLUE, GPIO.LOW) GPIO.output(LED_GREEN, GPIO.LOW) current_led_state = 1 elif current_led_state == 1: # 点亮蓝色LED GPIO.output(LED_RED, GPIO.LOW) GPIO.output(LED_BLUE, GPIO.HIGH) GPIO.output(LED_GREEN, GPIO.LOW) current_led_state = 2 elif current_led_state == 2: # 点亮绿色LED GPIO.output(LED_RED, GPIO.LOW) GPIO.output(LED_BLUE, GPIO.LOW) GPIO.output(LED_GREEN, GPIO.HIGH) current_led_state = 0 # 更新上一次的按键电平记录 last_button_level = current_button_level time.sleep(0.01) GPIO.cleanup()
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

