ESP8266 的低功耗方案与睡眠模式

Spoony 54.7m2021-05-162567 次点击
![459dc1e555bd194f9c24ce1d412350ca.png](https://ppmm.org/images/2021/05/16/459dc1e555bd194f9c24ce1d412350ca.png)

在某些时候我们设计的产品可能不具备持久供电的环境,那通常会采用锂电池、干电池一类的轻便型的非持久性电源。当遇到这种情况时,产品的续航能力可能就会成用户评估产品的一个重要指标,加大电池容量当然是最为直接的方案,但是这也意味着提高产品的生产成本。那增加产品续航能力的另一个方案就是原自产品自身——降低不必要的能源消耗。

ESP8266有一个非常实用的低功耗运行模式 - 睡眠模式。

ESP8266系列产品的睡眠模式共有以下几种可选:

## No-sleep
打开芯片所有的功能使所有功能处理长期持久的工作状态,此时芯片的功耗将处于最大状态。显然,这并不是一种推荐的用法,除非ESP8266芯片要处理长时间的实时性任务(此场景在真实的产品应用中并不多见)。

## Modem-sleep
Modem-sleep是ESP8266的默认睡眠方式且仅工作于Station模式(即中继器模式 AP),而且只有连接到路由器后才会生效。

当ESP8266以AP方式连接到路由器且运行于Modem-sleep模式时,它会在两次DTIM Beacon间隔内关闭WIFI电路以达到省电效果,在下次Beacon到来前自动唤醒。睡眠时间由路由器的DTIM Beacon时间决定。睡眠的同时ESP8266可以保持与路由器的WI-FI连接,并通路由器接受来自手机或者服务器的交互信息。

> 一般路由器的DTIM Beacon间隔为100ms~1,000ms

## Light-sleep
Light-sleep的工作模式与Modem-sleep相似,而不同的是除了关闭WI-FI模块电路以外,在该模下还会关闭时间并暂停内部CPU,从而达到比Modem-sleep模式更低的功耗。

Light-sleep模式可用于需要保持与路由器的连接,可以实时响应路由器发来的数据的场合。并且在未接收到命令时,CPU可以处于空闲状态。比如WI-FI开关的应用,大数据时间CPU是空闲的,直到收到控制命令,CPU才需要进行GPIO的操作。

## Deep-sleep
Deep-sleep则是最狠的一种省电模式了,但此模式下ESP8266将会关闭除GPIO状态外的所有的电路,此时ESP8266几乎就处于假死状态,其电流的消耗仅仅为20uA!

而事实上ESP8266并不会持续地维持这种深度睡眠状态,而是在一个指定间隔内关闭所有其它电路,当达到指定时间间隔后ESP8266将会自动重新启动一次,这个最大时间间隔为 4,294,967,295 µs 约合71分钟,其实也真的算得上睡得够久了。但这种模式非常适合于那种对时间间隔要求很长的场合,例如最长见的温度湿度检测,河水水位检测等。

要启用Deep-sleep模式不能单单通过固件控制而需要进行跳线,具体办法就是将D0(GPIO16)与RST脚相连。只要RST脚处于低电平状态时就会引发ESP8266重启,而Deep-sleep的真正实现方法就是在固件所指定的时间间隔内向GPIO16输出低电平引发芯片的重启,以达到唤醒的效果。

![eff711093027031ee1915280e7e1e5f8.png](https://ppmm.org/images/2021/05/16/eff711093027031ee1915280e7e1e5f8.png)

以下是在固件内引发Deep-sleep的代码:
```
void setup() {‌‌
Serial.begin(115200);
Serial.setTimeout(2000);

// Wait for serial to initialize.
while(!Serial) {‌‌ }

Serial.println("I'm awake.");

Serial.println("Going into deep sleep for 20 seconds");

// 一但遇到以下方法ESP就会进入deepSleep状态
ESP.deepSleep(20e6); // 20e6 is 20 microseconds
}

void loop() {‌‌
}
```

下表为三种模式的具体对比:
![7bf0b00aa04fa30612d32983b3b9e0dc.png](https://ppmm.org/images/2021/05/16/7bf0b00aa04fa30612d32983b3b9e0dc.png)

作者:梁睿坤
链接:https://www.jianshu.com/p/8533e5a52890
来源:简书
收藏 ♥ 感谢
tezr 60cm 2021-06-18  ♥ 1
我用充电宝连接ESP8266,通常是3天电用光(4000mAh),所以希望它能低功耗。
不过目前都不理想。
因为低电流状态下(比如用充电宝连接),如果使用睡眠模式,那么就直接导致系统无法唤醒。
不知道博主是否有好的方案?
我的情形是这样的:
ESP8266由充电宝供电,不需要Wi-Fi, 只连接薄膜按键模块和SG90舵机,ESP只需在按键按下的时候工作。
问题:如果不使用睡眠模式,那么耗电大。 如果使用睡眠模式(light或deep),那么基本上是开机工作几分钟后就会进入"假死",无法接收按键的输入。
不知道@Spoony 大神有好的解决方法吗?
Spoony 小组长 2021-06-19 
睡眠模式我的理解是适用于 ESP8266 自动唤醒。
这种需要通过外部按键唤醒不太合适,因为睡眠模式下已经不会接收按键事件了。

关闭 wifi 功能会降低功耗。

WiFiOn();
delay(5000);
WiFiOff();
delay(5000);
tezr 60cm 2021-06-24 
@Spoony 谢谢。 我在使用睡眠模式之前,就是关闭wifi的,如果没有关闭wifi的话,那么耗电更快,大概1天半就用完电了。

登录注册 后可回复。




› 相关内容关注微信公众号