ESP8266-Arduino编程实例-深度休眠与唤醒

深度休眠与唤醒

1、ESP8266休眠模式介绍

在嵌入式系统中,功耗是一个绕不开的问题。不同的单片机、嵌入式设备一般会提供电源管理,即功耗管理。ESP8266提供了三个不同的功耗模式,即休眠模式。分别是:Modem Sleep(调制解调器睡眠), Light Sleep(轻度休眠)Deep Sleep(深度休眠)。每种不同的休眠模式对应不同的功耗及工作状态。不同休眠模式区别如下(ESP8266数据手册):

Item Modem-sleep Light-sleep Deep-sleep
Wi-Fi OFF OFF OFF
System clock ON OFF OFF
RTC ON ON ON
CPU ON Pending OFF
Substrate current 15 mA 0.4 mA ~20 uA
Average current (DTIM = 1) 16.2 mA 1.8 mA
Average current (DTIM = 3) 15.4 mA 0.9 mA
Average current (DTIM = 10) 15.2 mA 0.55 mA

注:表中功耗指的是 ESP8266 作为独立芯片。 如果使用的是开发板,则它们具有使用更多电流的无源组件。

从上表可以知道,当ESP8266进入深度休眠模式时,除了RTC外,几乎所有设备都停止工作,基板电流达到20uA。但是,如果使用带有内置编程器、LED 等的全功能开发板,将无法实现如此低功耗的状态。

在了解了ESP8266的休眠模式之后,那么如何编写带有休眠模式的应用程序呢?一般流程如下:

  1. ESP8266连接WiFi
  2. ESP8266执行任务,如,读取传感器,上报数据等
  3. 休眠一段预定义的时间
  4. 唤醒ESP8266
  5. 不断重复1~4过程

ESP8266有如下唤醒方式:

  1. 定时器唤醒:ESP8266 在预定义的时间段后自行唤醒
  2. 外部唤醒:按下 RST 按钮唤醒 ESP8266(ESP8266 重启)

本文将介绍如何使用定时器唤醒深度睡眠的ESP8266和使用复位 (RST) 引脚进行外部唤醒深度睡眠的ESP8266。

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • 开关一个
  • 220欧姆电阻一个
  • 杜邦线若干
  • 数据线一条

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、通过定时器唤醒

在ESP8266 NodeMCU的 ESP8266-Arduino编程实例-认识ESP8266中,我们知道,D0接口具有唤醒功能:

在这里插入图片描述

因此,要通过 ESP8266 使用定时器唤醒,需要将 RST 引脚连接到 NodeMCU 板上标记为 D0(GPIO 16)。 接线图如下:

在这里插入图片描述

注意,请在上传代码完成之后,再连接D0与RST。

ESP8266 运行时,ESP8266 的 RST 引脚始终为高电平。 但是,当 RST 引脚接收到 LOW 信号时,它会重新启动微控制器。

如果使用 ESP8266 设置深度睡眠定时器,一旦定时器结束,GPIO 16 会发送一个 LOW 信号。 这意味着D0(GPIO16) 连接到 RST 引脚时,可以在设定的时间后唤醒 ESP8266。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int count = 1;
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);

// 等待串口初始化
while(!Serial) { }

Serial.println("Device will go to deep sleep for 30s");

// TODO:执行任务
for(int i = 1;i <= 10;i++){
Serial.print(count);
Serial.print(',');
count++;
delay(1000);
}
// 进入深度休眠30S
ESP.deepSleep(30e6);
}

void loop() {
}

示例的代码如何工作?

setup中,当串口等设备初始化后,任务执行完成后,进入深度休眠30s

1
2
ESP.deepSleep(30e6);

ESP.deepsleep(uS) 函数以睡眠时间作为参数传递(以微秒为单位)。

注意:调用ESP.deepSleep完成后,ESP.deepSleep()函数后面的代码将不会再执行。

5、外部唤醒

还可以通过外部唤醒来唤醒 ESP8266,例如按下按钮或簧片开关。 只需将 ESP8266 无限期地置于深度睡眠模式,然后将 RST 引脚设置为低电平即可将其唤醒。连接电路如下:

在这里插入图片描述

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int count = 1;
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);

// 等待串口初始化
while(!Serial) { }

Serial.println("Device will go to deep sleep for 30s");

// TODO:执行任务
for(int i = 1;i <= 10;i++){
Serial.print(count);
Serial.print(',');
count++;
delay(1000);
}
// 进入无限深度休眠
ESP.deepSleep(0);
}

void loop() {
}

外部唤醒与定时器唤醒的区别是,ESP.deepSleep函数传递参数。外部唤醒时,只需传递0即可,即ESP8266进入无限深度休眠;当传递具体大于0的数值时,ESP8266进入指定时间休眠。

文章来源: https://iotsmart.blog.csdn.net/article/details/126026824