为什么我的Raspberry Pi一直检测到按键处于按下状态?
树莓派按键控制风扇/LED故障修复方案
故障根因
- 逻辑运算符误用:Python中逻辑与判断需使用
and,原代码使用位运算符&,位运算符优先级高于比较运算符,导致GPIO.input(13) == 0 & fanOn == True实际运算逻辑为GPIO.input(13) == (0 & fanOn) == True,条件判断完全失效,是持续误判按键状态的核心原因。 - 输出逻辑冲突:循环首行直接将按键输入电平赋值给LED/风扇输出引脚13,和后续的状态切换逻辑冲突,导致按键动作时输出会先跟随按键电平变化,再被后续逻辑修改,触发先熄灭再亮起的异常表现。
- 读取对象错误:判断条件读取的是输出引脚13的电平,而非按键输入引脚19的电平,逻辑链路完全错误。
- 上拉输入逻辑适配错误:你配置了按键引脚为上拉输入
PUD_UP,默认状态引脚为高电平,按键按下时为低电平,原逻辑没有适配该触发逻辑做状态切换判断。
修复后代码
import drivers import time display = drivers.Lcd() import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # 按键输入引脚 上拉模式:默认高电平,按下为低电平 GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 风扇/LED输出引脚 GPIO.setup(13, GPIO.OUT) GPIO.output(13, 0) fanOn = False display.lcd_display_string("Fan: off", 1) try: while True: # 读取按键状态,做按下触发判断 key_state = GPIO.input(19) # 按键按下时(低电平)触发状态切换 if key_state == 0: # 消抖延迟 time.sleep(0.02) # 二次确认按键确实按下 if GPIO.input(19) == 0: if fanOn: # 切换为关闭状态 GPIO.output(13, 0) display.lcd_backlight(1) display.lcd_clear() display.lcd_display_string("Fan: off", 1) print("off") fanOn = False else: # 切换为开启状态 GPIO.output(13, 1) display.lcd_backlight(1) display.lcd_clear() display.lcd_display_string("Fan: on ", 1) print("on") fanOn = True # 等待按键松开,避免重复触发 while GPIO.input(19) == 0: time.sleep(0.01) time.sleep(0.01) except KeyboardInterrupt: GPIO.cleanup() display.lcd_clear()
内容的提问来源于stack exchange,提问作者Daniel Caminero
相关产品推荐
相关产品推荐

