You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:06:00