为何代码控制LED常亮?如何实现函数定时延迟执行
问题解决与实现方案
一、修复LED无法自动切换状态的问题
你的代码存在两个关键问题导致LED一直点亮:
- 未正确引用
machine模块下的Pin类,直接使用Pin()会引发隐式错误(部分MicroPython环境可能兼容,但规范写法必须明确引用) - 每次调用
mosfet_toggle都重新创建Pin实例,容易导致引脚状态管理混乱
修复后的代码
import machine import utime # 定义引脚编号 power_mosfet = 0 reset_mosfet = 1 mosfet_toggle_srt = 2 mosfet_toggle_med = 5 mosfet_toggle_long = 7 # 提前初始化引脚(避免重复创建实例) power_pin = machine.Pin(power_mosfet, machine.Pin.OUT) reset_pin = machine.Pin(reset_mosfet, machine.Pin.OUT) def mosfet_toggle(pin, toggle_period): pin.value(1) utime.sleep(toggle_period) pin.value(0) utime.sleep(2) def toggle(pin): pin.toggle() # 测试:点亮7秒后熄灭,保持2秒 mosfet_toggle(power_pin, mosfet_toggle_long)
如果需要循环切换状态,取消注释并修改循环代码:
while True: utime.sleep(2) mosfet_toggle(power_pin, 1) utime.sleep(2)
二、实现函数在特定时长后非阻塞运行
使用utime.sleep()会阻塞主线程,无法同时执行其他任务。推荐使用MicroPython的machine.Timer实现非阻塞延时执行:
单次延时执行示例
import machine def delayed_function(pin): pin.toggle() print("函数已执行") # 初始化引脚 power_pin = machine.Pin(power_mosfet, machine.Pin.OUT) # 创建定时器,延时5秒后执行delayed_function timer = machine.Timer(-1) # -1表示虚拟定时器(不绑定硬件定时器) timer.init(period=5000, mode=machine.Timer.ONE_SHOT, callback=lambda t: delayed_function(power_pin))
周期性重复执行示例
如果需要函数每隔固定时间执行一次,使用PERIODIC模式:
timer.init(period=3000, mode=machine.Timer.PERIODIC, callback=lambda t: delayed_function(power_pin))
关键说明
period参数单位为毫秒,5000即5秒ONE_SHOT模式表示定时器只触发一次,PERIODIC表示周期性触发- 回调函数必须接受一个参数(定时器对象),因此用lambda表达式传递额外参数(如引脚)
内容的提问来源于stack exchange,提问作者user8261244
相关产品推荐
相关产品推荐

