美文网首页
ESP8266 低功耗调试小记

ESP8266 低功耗调试小记

作者: 剑山 | 来源:发表于2021-07-17 23:18 被阅读0次

    虽然大部分时候都不关注功耗,不过偶尔要做些项目,需要考虑续航什么的。今天这个项目就需要用纽扣电池给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的输出输出模式什么的是可以的,如果不行的话量产可能还是个问题。。。


    不过全做完了效果还是挺明显的,我的电流检测模块甚至检测不到电流。。。并且功能和低功耗优化前完全一样。。。

    优化前
    优化后

    相关文章

      网友评论

          本文标题:ESP8266 低功耗调试小记

          本文链接:https://www.haomeiwen.com/subject/yuygpltx.html