多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
相关产品推荐
相关产品推荐

