如何用for循环实现按键按下时各LED依次闪烁?附GPIO报错及代码
按键控制LED依次闪烁实现方案
报错原因
你遇到的RuntimeError: You must setup() the GPIO channel first报错由语法书写错误直接导致:
按键检测行的括号位置错误,你写的if(GPIO.input(BUTTON_PIN == GPIO.HIGH)):是先计算BUTTON_PIN == GPIO.HIGH的布尔值,再把这个布尔值当成引脚号传给了GPIO.input(),GPIO找不到对应通道才抛出未初始化的错误。
原有逻辑缺陷
- 单次for循环遍历完3个LED后程序会直接执行
GPIO.cleanup()退出,确实来不及按按键触发效果 blink()函数内部修改全局变量previous_button_state时未声明global,运行时会抛出变量未定义的错误- 没有做按键消抖,单次按键容易触发多次闪烁
可运行的实现代码
import RPi.GPIO as GPIO import time def blink(led): GPIO.output(led, GPIO.HIGH) time.sleep(0.2) GPIO.output(led, GPIO.LOW) # 声明修改全局变量 global previous_button_state previous_button_state +=1 if previous_button_state > 2: previous_button_state = 0 previous_button_state = 0 LED_PIN = [17, 22, 27] BUTTON_PIN = 26 GPIO.setmode(GPIO.BCM) # 按键设置为下拉模式,默认低电平,按下为高电平 GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) for pin in LED_PIN: GPIO.setup(pin, GPIO.OUT) try: # 外层加死循环持续检测按键 while True: # 修正参数位置 if GPIO.input(BUTTON_PIN) == GPIO.HIGH: # 按键消抖,检测到高电平后延时20ms再判断,避免抖动误触发 time.sleep(0.02) if GPIO.input(BUTTON_PIN) == GPIO.HIGH: blink(LED_PIN[previous_button_state]) # 等待按键松开,避免长按一直触发 while GPIO.input(BUTTON_PIN) == GPIO.HIGH: time.sleep(0.01) except KeyboardInterrupt: # 按Ctrl+C退出时清理GPIO GPIO.cleanup()
功能说明
每次按下按键时会按顺序闪烁17、22、27号LED,3轮后回到第一个LED循环,按Ctrl+C可以终止程序。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

