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

多LED独立定时闪烁故障:共享start变量致仅红LED工作

解决多LED独立计时闪烁问题

你的问题根源确实是所有LED共享同一个全局start变量——红LED每次切换状态都会修改这个变量,导致绿、蓝LED的计时逻辑完全被打乱,自然无法正常工作。要解决这个问题,核心就是给每个LED分配独立的计时起始变量。

修改方案:用字典存储独立计时变量

我们可以创建一个字典,把每个LED的引脚号作为键,对应的计时起始时间作为值,这样每个LED的计时都互不干扰。

修改后的完整代码

import time
import RPi.GPIO as GPIO

red = 26
green = 19
blue = 13

# 用字典存储每个LED的独立计时起始时间
led_timers = {
    red: time.monotonic(),
    green: time.monotonic(),
    blue: time.monotonic()
}

GPIO.setmode(GPIO.BCM)
GPIO.setup(red, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)

def led(pin, on, off):
    # 根据引脚获取对应的计时起始时间,不再用全局变量
    start = led_timers[pin]
    
    if pin == 26:
        color = "Red"
    elif pin == 19:
        color = "Green"
    elif pin == 13:
        color = "Blue"

    if not GPIO.input(pin):
        if now >= start + off:
            GPIO.output(pin, GPIO.HIGH) 
            print(color, "ON")
            # 更新当前LED的计时起始时间,不影响其他LED
            led_timers[pin] = now

    if GPIO.input(pin):
        if now >= start + on:
            GPIO.output(pin, GPIO.LOW) 
            print(color, "OFF")
            # 同样只更新当前LED的计时
            led_timers[pin] = now

try:
    while True:
        now = time.monotonic()
        led(red, 1, 1)
        led(green, 2, 2)
        led(blue, 3, 3)

except KeyboardInterrupt:
    GPIO.output(red, GPIO.LOW)
    GPIO.output(green, GPIO.LOW)
    GPIO.output(blue, GPIO.LOW)
    GPIO.cleanup()

关键修改点说明

  • 移除了全局start变量,改用led_timers字典存储每个LED的独立计时起点
  • 在led函数中,只操作当前引脚对应的计时值,修改后也只更新该引脚的计时,完全不会影响其他LED的逻辑
  • 初始时给每个LED都设置相同的起始时间,保证三者同时开始运行

这样修改后,红LED每1秒切换一次、绿LED每2秒切换一次、蓝LED每3秒切换一次,三者就能独立正常工作了。

内容的提问来源于stack exchange,提问作者Javad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:22:50