寻求ESP8266(MicroPython)每日定时重启的简易实现方案
嘿,我刚好在ESP8266上用MicroPython折腾过类似的定时重启需求,给你几个简单靠谱的方案,完全不用搞那种占RAM的无限循环:
方案1:深度睡眠+RTC定时(最省资源,强烈推荐)
这是长期无人值守场景的最优解——ESP8266进入深度睡眠时几乎不消耗资源,RAM完全释放,到设定时间自动唤醒重启,完美契合你的需求。
步骤逻辑:
- 同步网络时间(确保定时准确)
- 计算当前时间到目标重启时间的间隔
- 进入深度睡眠,到点自动重启
代码示例:
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
相关产品推荐
相关产品推荐

