虽然大部分时候都不关注功耗,不过偶尔要做些项目,需要考虑续航什么的。今天这个项目就需要用纽扣电池给ESP8266供电。。。所以查了些资料,顺便记下来。
硬件
普通的纽扣电池的输出电流只有几个mA,是不够8266启动的所以,需要用一些特殊的方法。可以看这个视频,简单说来就是要用LIR2450这种可充电的纽扣电池+并一个超大的电容,他用的是1F的钽电容。
软件
ESP8266有几种低功耗模式
我这里需要极度省电,所以用了deep sleep深度睡眠,其实他就是全关了,只留了定时器可以在设定好的时间在GPIO16上产生一个低电平信号,所以如果你需要睡眠后指定一个事件唤醒的话,需要把GPIO16和RST连起来,然后系统就起来了。
不过这里有一个参数WakeMode,可以选择唤醒后射频的状态。因为我这次其实根本不需要wifi,所以就设成4了。
另外有一个问题就是,其实是按下了reset这个按钮,这就产生了一个问题就是他其实是从setup()的第一句开始运行的,所以如果你需要区分他到底唤醒的原因是什么,是断电重新上电了,还是睡眠唤醒的,还是程序崩溃了重启了,如果不特殊处理的话因为都是从setup开始的所以是分不出来的。这里可以用这个来区分
另外还有一个问题就是所有的变量的值就全没了,所有模块的的begin()和init()也全要重做。有一种特殊的做法是把数据存储到RTC中,这块网上几乎搜不太到资料,有一种做法在RTCUserMemory.ino
这里提到的,可以用ESP.rtcUserMemoryWrite
存最多512个byte到RTC里面,然后用ESP.rtcUserMemoryRead
读取,这样在deep sleep的时候变量就不会被重置。
uint32_t wakeUpCnt = 0;
void setup(){
if (ESP.rtcUserMemoryRead(0, (uint32_t *)&wakeUpCnt, sizeof(wakeUpCnt)))
{
wakeUpCnt = wakeUpCnt + 1;
}
Serial.print("wakeUpCnt = ");
Serial.println(wakeUpCnt);
ESP.rtcUserMemoryWrite(0, (uint32_t *)&wakeUpCnt, sizeof(wakeUpCnt));
ESP.deepSleepInstant(0, RF_DISABLED);
}
然后我测试的时候好像如果把GPIO16和rst连起来好像就没法通过串口烧写了,不知道是不是设下GPIO16的输出输出模式什么的是可以的,如果不行的话量产可能还是个问题。。。
不过全做完了效果还是挺明显的,我的电流检测模块甚至检测不到电流。。。并且功能和低功耗优化前完全一样。。。
优化前优化后
网友评论