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

如何解决Arduino Uno设置12分钟休眠时时长逐次增加1分钟的问题

问题根源

  1. millis()计数失效
    Arduino的millis()函数依赖TIMER0的中断实现计时,你休眠时调用LowPower.idle()的参数设置了TIMER0_OFF,休眠期间定时器关闭,millis()完全停止走时,相当于12分钟的休眠时长没有被计入时间统计。后续赋值startTime = millis() + eventInterval时每次都会少算休眠时长,误差累积就会出现每次休眠实际时长逐次增加的问题。
  2. 休眠循环参数错误
    你定义的const int time_interval = 2000和配套注释完全不符合实际逻辑:你每次循环休眠8秒,12分钟需要的循环次数为 12*60/8 = 90 次,按你现有参数6*time_interval算下来总休眠时长会达到96000秒,完全偏离需求。且循环条件用了i <= 次数会多执行一次休眠,进一步放大误差。
  3. 全局时间逻辑冲突
    你的完整工作周期为12分钟休眠+3分钟预热+5分钟采集=20分钟,但你定义的eventInterval仅为3分钟,和实际周期完全不匹配,逻辑本身存在矛盾。

修复方案

  • 先修正休眠循环参数,直接按实际需求计算循环次数,删除无用的time_interval变量:
const int SLEEP_CYCLES = 90; // 90次 * 8秒/次 = 720秒 = 12分钟
for(int i = 0; i < SLEEP_CYCLES; i++) { // 用<替代<=,避免多执行一次休眠
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,SPI_OFF, USART0_OFF, TWI_OFF);
}
  • 解决millis()计数不准的问题,二选一即可:
    • 若要保留低功耗特性,直接用你代码中已经接入的RTC模块做全局时间基准,RTC休眠时不会停止走时,精度远高于millis(),也不会有累积误差
    • 若要继续用millis()做周期判断,把LowPower.idle()的参数改为TIMER0_ON,休眠时不关闭TIMER0,millis()就能正常计数,代价是休眠功耗略有上升
  • 调整全局触发逻辑:你的流程本身就是固定顺序的“休眠→预热→采集→休眠”,完全可以删掉startTime和eventInterval相关的判断逻辑,按顺序执行即可,避免多余的时间判断引入错误。
  • 对计时精度要求高的话,直接用RTC的闹钟唤醒功能替代循环8秒凑时长的方案,完全避免累积误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:02