树莓派MicroPython如何实现双LED分别闪烁5秒
问题根因
原代码无法正常闪烁的核心原因是执行逻辑错误:编写的blink_red()、blink_blue()单次调用只会完成1次LED状态翻转,之后外层的utime.sleep(5)是全阻塞逻辑,5秒等待期间不会再执行任何LED状态切换操作,自然会出现LED常亮5秒再切换的现象。除此之外原代码还存在模块引用不统一、逻辑重复冗余的问题。
修正方案
符合编码规范的优化实现
遵循DRY(不要重复代码)原则,把重复的闪烁逻辑抽成通用传参函数,同时统一使用MicroPython的utime模块做时间控制,用时间差计算避免累计误差:
import utime from machine import Pin # 按实际接线修改引脚编号 RED = Pin(15, Pin.OUT) BLUE = Pin(14, Pin.OUT) def blink(target_led, duration, interval=0.5): """ 控制指定LED闪烁 :param target_led: 要点亮闪烁的LED引脚对象 :param duration: 闪烁总时长,单位秒 :param interval: 闪烁亮灭切换间隔,单位秒,默认0.5秒 """ # 先熄灭非当前控制的LED other_led = BLUE if target_led is RED else RED other_led.value(0) # 记录开始时间,用时间差判断结束,避免循环计数的累计误差 start_time = utime.ticks_ms() while utime.ticks_diff(utime.ticks_ms(), start_time) < duration * 1000: target_led.toggle() utime.sleep(interval) # 闪烁结束后关闭当前LED,避免残留常亮 target_led.value(0) # 主循环 while True: blink(RED, 5) blink(BLUE, 5)
基于原有代码的最小改动版本
如果不想重构原有函数,只需要把外层阻塞的5秒等待替换成时间循环,在5秒内反复调用对应的闪烁函数即可,同时统一修正模块引用:
# 保留原有的两个闪烁函数 def blink_red(): RED.toggle() BLUE.value(0) utime.sleep(0.5) def blink_blue(): BLUE.toggle() RED.value(0) utime.sleep(0.5) while True: # 红色LED闪烁5秒 start = utime.ticks_ms() while utime.ticks_diff(utime.ticks_ms(), start) < 5000: blink_red() # 蓝色LED闪烁5秒 start = utime.ticks_ms() while utime.ticks_diff(utime.ticks_ms(), start) < 5000: blink_blue()
原代码的具体错误点
- 调用逻辑错误:单次调用闪烁函数仅翻转1次LED状态,外层的
sleep(5)阻塞期间没有任何状态切换操作,无法实现闪烁效果 - 模块引用混乱:代码中同时出现
time.sleep()和utime.sleep(),MicroPython环境下没有标准库time,容易触发导入报错 - 代码冗余:两个闪烁函数逻辑完全一致,仅控制的LED对象不同,重复编写不利于后续维护修改
内容的提问来源于stack exchange,提问作者Eureka
相关产品推荐
相关产品推荐

