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

寻求ESP8266(MicroPython)每日定时重启的简易实现方案

嘿,我刚好在ESP8266上用MicroPython折腾过类似的定时重启需求,给你几个简单靠谱的方案,完全不用搞那种占RAM的无限循环:

方案1:深度睡眠+RTC定时(最省资源,强烈推荐)

这是长期无人值守场景的最优解——ESP8266进入深度睡眠时几乎不消耗资源,RAM完全释放,到设定时间自动唤醒重启,完美契合你的需求。

步骤逻辑:

  1. 同步网络时间(确保定时准确)
  2. 计算当前时间到目标重启时间的间隔
  3. 进入深度睡眠,到点自动重启

代码示例:

import machine
import ntptime
import time

def sync_network_time():
    """同步NTP网络时间,确保时间准确"""
    try:
        ntptime.settime()
        print("NTP时间同步成功")
    except Exception as e:
        print(f"NTP同步失败,将使用RTC本地时间: {e}")

# 先同步时间
sync_network_time()

# 获取当前时间(格式:年, 月, 日, 星期, 时, 分, 秒, 微秒)
current_time = time.localtime()
print(f"当前时间: {current_time[3]}:{current_time[4]}:{current_time[5]}")

# 设置每日重启时间,比如凌晨2点
target_hour = 2
target_minute = 0
target_second = 0

# 计算距离下次重启的秒数
current_total_seconds = current_time[3] * 3600 + current_time[4] * 60 + current_time[5]
target_total_seconds = target_hour * 3600 + target_minute * 60 + target_second

if current_total_seconds < target_total_seconds:
    sleep_seconds = target_total_seconds - current_total_seconds
else:
    # 今天已经过了目标时间,顺延到明天
    sleep_seconds = (24 * 3600) - current_total_seconds + target_total_seconds

print(f"距离下次重启还有 {sleep_seconds//3600}小时{sleep_seconds%3600//60}分钟")

# 进入深度睡眠(参数为毫秒),唤醒后自动重启
machine.deepsleep(sleep_seconds * 1000)
方案2:硬件定时器触发重启(适合需保持运行的场景)

如果你的设备需要在重启前持续运行其他任务,可以用硬件定时器触发重启逻辑——定时器是硬件级别的,不会占用太多RAM,也不用轮询时间。

代码示例:

import machine
import time

restart_triggered = False

def trigger_restart(timer):
    """定时器回调函数,设置重启标志"""
    global restart_triggered
    restart_triggered = True

# 初始化定时器,设置24小时触发一次(单位:毫秒)
daily_timer = machine.Timer(-1)
daily_timer.init(period=24*3600*1000, mode=machine.Timer.PERIODIC, callback=trigger_restart)

# 主循环:处理你的业务逻辑
while True:
    # 这里写你的设备业务代码,比如采集数据、控制外设等
    print("设备运行中...")
    time.sleep(1)
    
    # 检测重启标志,触发重启
    if restart_triggered:
        print("准备重启设备...")
        machine.reset()
方案3:快速上手的NTP+睡眠(适合简单场景)

如果不想搞复杂的时间计算,直接用time.sleep()也能实现,缺点是睡眠期间设备保持运行状态,功耗比深度睡眠高,但代码最简单:

import ntptime
import time
import machine

# 同步时间
ntptime.settime()
current_hour = time.localtime()[3]

# 计算到凌晨2点的睡眠时长
if current_hour < 2:
    sleep_hours = 2 - current_hour
else:
    sleep_hours = 24 - current_hour + 2

# 睡眠到指定时间后重启
time.sleep(sleep_hours * 3600)
machine.reset()

注意事项

  • 用NTP同步时间时,确保ESP8266能正常联网;如果是离线场景,可以给ESP8266外接RTC模块保持时间。
  • 深度睡眠方案中,ESP8266唤醒后会从头执行代码,所以每次启动都要重新同步时间(或读取外接RTC)。
  • 电池供电场景优先选方案1,功耗极低,能大幅延长续航。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:46