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年。