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

为何代码控制LED常亮?如何实现函数定时延迟执行

问题解决与实现方案

一、修复LED无法自动切换状态的问题

你的代码存在两个关键问题导致LED一直点亮:

  1. 未正确引用machine模块下的Pin类,直接使用Pin()会引发隐式错误(部分MicroPython环境可能兼容,但规范写法必须明确引用)
  2. 每次调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:45:30