Arduino 超级省电之休眠模式用1节18650电池工作17年

       Arduino的外围元件模块非常丰富,自己想做个温度报警器,却发现电池供电撑不了几天,于是乎就折腾了一段时间,终于将待机时间延长到了俺退休后^-^,现将过程共享给大家。
       首先我们要知道电池供电待机时间的计算公式。通常电池都会标明容量为毫安时(mAH)。7号电池容量为1.5V700mAH左右. 而18650电池可以轻松做到3.7V3500mAH。假如我们选择1节18650 3500mAH的电池来供Arduino工作,最长可以待机多久呢?假设Arduino的平均工作电流为30mA,那么3500/30=117小时=4.88天,显然离我们的目标17年差太远。那么如果要实现17年待机的目标,则电流需控制在 3500/17年/365天/24小时=0.0235mA=23.5uA(为简化计算,本文均不考虑电池自放电、电压变化和温度影响)。
       好了,有了目标,就想办法把待机电流控制在23.5uA吧!

       1.首选8Mhz主频的Arduino板子,因为绝大多数单片机程序对于8M主频跑起来都是绰绰有余的了,但8M功耗相比16M却能大幅度降低,大家可以亲自用分频代码测试在不同工作频率下的功耗。
        2.首选2.7V~5.5V 供电的板子。因为18650电池电压范围为2.7~4.2V,三节7号电池在3V~4.8V,要想把电池的电量使用完,单片机必须能在最低2.7V的电压下稳定工作。
        3.精简外围电路,主要是USB转TTL电路,5V转3.3VLDEO电路等。
        结合以上三点,建议直接使用CC Nano Pro 开发板,某宝有售。此款板子正是具有TYPE-C接口的pro Mini 8MHz 328P芯片的开发板,更重要的是其专门设计了个外围电路断开焊点,上传程序后断开焊点即可断开LDO和USB电路。如图


     这个板子非常不错,由于采用了最新的328PB增强版芯片,居然有2个硬件串口,2个SPI接口,如上图;而且A6\A7可以双向输入输出,且可以启用内部上拉,数字引脚编号为25、26,如pinMode(25, OUTPUT); 等同于 pinMode(A6, OUTPUT);。

4.剩下就是代码优化了,直接上代码,思路就是让Arduino开机进入 SLEEP_MODE_PWR_DOWN 休眠模式,实测此时电流顺利降低到了23uA。当然啥事不做也不行啊,开启看门狗中断,每秒钟唤醒一次,执行看门狗计数。唤醒后会进入loop循环,然后在循环中判断已经过了多少秒,根据需要执行自己需要的功能操作。

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#define LED_PIN (13)

void OFFACDDC() {//关闭ACD和ADC
  ACSR |=_BV(ACD);
  ADCSRA=0;
  }

void ONACDDC() {//开启ACD和ADC
  ACSR &= ~_BV(ACIE);   
  ACSR &= ~_BV(ACD);   
  ADCSRA |= _BV(ADEN);   
  ADCSRA |= _BV(ADIF); 
  }

volatile int f_wdt = 1; //看门狗计数

ISR(WDT_vect) { //看门狗唤醒执行函数
  f_wdt++;
}

void enterSleep(void) { //进入睡眠状态
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  power_all_enable();
}
void setup() {
   pinMode(LED_PIN , OUTPUT);
  digitalWrite(LED_PIN , LOW);
  OFFACDDC();
  
  /*** 设置看门狗 ***/
  MCUSR &= ~(1 << WDRF); /* 清除复位标志. */
   WDTCSR |= (1 << WDCE) | (1 << WDE);
  //* 设置新的看门狗超时时间 
  WDTCSR = 1<<WDP1 | 1<<WDP2;// 每1秒看门狗超时1次,也就能执行一次唤醒后函数 ISR
   WDTCSR |= _BV(WDIE);  /*  设置为定时中断而不是复位  */
}

void loop() {
  if (f_wdt >= 5) { //唤醒后是会运行loop的,这时候检查唤醒达到5次了,也就5秒了,闪烁一下
     ONACDDC();//开启ADC,这样模拟输入IO口才可以恢复使用
    digitalWrite(LED_PIN, HIGH);
    delay(20);
    digitalWrite(LED_PIN, LOW);
    f_wdt = 0;
     OFFACDDC();
  }
  enterSleep();//继续休眠
}

    5.实际应用中,对于一些简单低功耗的传感器如LM35,可以直接用数字IO口接其VCC引脚,这样就可以实现唤醒后用IO口控制LM35供电,工作完毕休眠前又断开其供电了。如果是WIFI模块等耗电较大的,可以外接个小功率固态继电器,如211EH,也能实现唤醒才供电的要求。另外功耗降下来了,其实还可以外加个5V小太阳能电池板(串几个二极管,确保电流不倒灌且最强光线下不超过电池最高充电电压),配合可充电电池,实现无限续航。

     开发板店家资料里面有最新的详细例程,可以开启中断唤醒和看门狗唤醒可选,当只开启中断唤醒的时候,功耗居然低至1uA以下了,我的万用表都测不出来了!店家最新资料使用看门狗定时唤醒3.3V下功耗也降低到3.5uA左右了。

      PS:3节7号电池串联,在3.5uA电流下理论可以工作700/0.0035/24/365= 22.8年。

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lihaMIMI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值