本教程展示了如何使用 Arduino IDE 将深度睡眠与 ESP8266 (NodeMCU) 结合使用。我们将介绍使用定时器唤醒的深度睡眠以及使用复位 (RST) 引脚进行外部唤醒的深度睡眠。
要将 ESP8266 置于深度睡眠模式,请使用ESP.deepSleep(uS)并作为参数传递睡眠时间(以微秒为单位)。GPIO 16 必须连接到复位 (RST) 引脚,以便 ESP8266 能够唤醒。
要将 ESP8266 无限期地置于深度睡眠模式,请使用ESP.deepSleep(0)。当 RST 引脚收到低电平信号时,ESP8266 将被唤醒。
目录
深度睡眠模式简介
如果您使用电池给 ESP8266 开发板供电制作了一个项目,或者您刚刚将 ESP8266 NodeMCU 开发板连接到移动电源。运行一段时间后,您会发现电池的续航时间并不长,特别是在使用 Wi-Fi 时。
如果您将 ESP8266 置于深度睡眠模式,则会降低功耗,并且电池的使用寿命会更长。
让 ESP8266 处于深度睡眠模式意味着减少运行时消耗更多电量的活动(例如 Wi-Fi),但只留下足够的活动来在发生有趣的事情时唤醒处理器。
睡眠类型
睡眠模式分为三种不同类型:调制解调器睡眠(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 作为独立芯片时的功耗。如果您使用的是开发板,它们具有消耗更多电流的无源组件。
它们都有不同的目的,应该在不同的应用程序中使用。
在本文中,我们将介绍深度睡眠模式。除了实时时钟 (RTC) 之外,一切始终处于关闭状态,这是 ESP8266 跟踪时间的方式。
这是最省电的选项,ESP 芯片仅消耗约 20uA 的电流。但是,如果使用内置编程器、LED等的全功能开发板,则无法实现如此低功耗的状态。
深度睡眠代码
对于深度睡眠,示例程序如下所示:
- ESP8266 连接 Wi-Fi
- ESP8266 执行任务(读取传感器、发布 MQTT 消息等)
- 休眠预定的时间段
- ESP8266 唤醒
- 这个过程一遍又一遍地重复
唤醒源
将 ESP8266 置于深度睡眠模式后,有不同的方法可以唤醒它:
- #1 定时器唤醒: ESP8266 在预定义的时间段后自行唤醒
- #2 外部唤醒:按下 RST 按钮唤醒 ESP8266(ESP8266 重新启动)
对于低功耗项目,您可以考虑使用 ESP32 板,它提供更多深度睡眠模式和唤醒源。
#1 ESP8266 深度睡眠与定时器唤醒
要使用 ESP8266 的定时器唤醒,您需要将 RST 引脚连接到NodeMCU 板中标记为 D0 的 GPIO 16 。只需遵循下一个示意图:
仅在上传代码后将 RST 引脚连接到 GPIO 16。
如果您查看 NodeMCU 引脚排列,您会发现 GPIO 16 是一个特殊引脚,并且具有 WAKE 功能。
当 ESP8266 运行时,ESP8266 的 RST 引脚始终为高电平。然而,当 RST 引脚收到低电平信号时,它会重新启动微控制器。
如果您使用ESP8266设置深度睡眠定时器,一旦定时器结束,GPIO 16就会发送低信号。这意味着,当连接到RST引脚时,GPIO 16可以在设置的时间段后唤醒ESP8266。
ESP8266 NodeMCU 定时器唤醒示例程序
安装 Arduino IDE 的 ESP8266 环境后,转到“工具”并选择“ NodeMCU(ESP-12E Module) ”。以下是您需要上传到 ESP 的代码:
在此示例中,我们在串行监视器中打印一条消息:
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
之后,ESP8266 进入睡眠状态 30 秒。
ESP.deepSleep(30e6);
要将 ESP8266 置于深度睡眠状态,您可以使用ESP.deepsleep(uS)并将睡眠时间(以微秒为单位)作为参数传递。
在这种情况下,30e6 对应于 30000000 微秒,等于 30 秒。
上传代码后,按 RST 按钮开始运行代码,然后将 RST 连接到 GPIO 16。ESP8266 应每 30 秒唤醒一次,并在串行监视器中打印一条消息,如下所示。
此示例只是在串行监视器中打印一条消息,但在现实世界的应用程序中,您将执行一项有用的任务,例如发出请求、发布传感器读数等。
ESP-01定时器唤醒电路
如果您想使用ESP-01电路板进行类似的设置,则需要焊接一根导线,如下所示。那个微小的引脚是GPIO 16,它需要连接到RST引脚。
然而,引脚非常小,以至于很难将这样的电线焊接到 ESP-01 上的 GPIO 16…因此,对于这种唤醒模式,您应该使用 NodeMCU 板或裸露的 ESP12-E芯片。
#2 ESP8266 深度睡眠与外部唤醒
您也可以通过外部唤醒来唤醒ESP8266,如按下按钮或簧片开关。您只需将ESP8266无限期地置于深度睡眠模式,然后将RST引脚设置为低电平即可唤醒它。
要测试此设置,请将按钮连接到ESP8266板,如下图所示。当你按下按钮时,RST引脚就会变低。
如果您使用的是 ESP-01,请按照下图进行操作。
ESP8266 外部唤醒示例程序
然后,将以下代码上传到您的 ESP8266 开发板。
/*
* ESP8266 Deep sleep mode example
*
* Complete Project Details https://www.qutaojiao.com
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
//Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
//ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
ESP.deepSleep(0);
}
void loop() {
}
此代码将 ESP8266 无限期地置于深度睡眠模式。为此,您只需将 0 作为参数传递给沉睡()功能:
ESP.deepSleep(0);
只有当电路板被重置时,ESP 才会被唤醒。在这种情况下,按下按钮即可将 RST 引脚拉至 GND。
当您按下按钮时,ESP8266 会唤醒,执行编程任务并返回睡眠状态,直到触发新的重置事件。
测量电流
当开发板处于深度睡眠模式时,用万用表测量电流消耗,看看它消耗了多少电量。
以下是放置万用表探头的方法。
当 ESP-01 处于深度睡眠模式时,仅使用 0.3mA,即大约 300uA。
请记住,在正常使用 Wi-Fi 期间,ESP8266 可能消耗 50mA 至 170mA 的电流。
总结
现在您已经知道如何使用deepSleep()功能,您的电池供电项目可以持续更长时间。
学习学习
学习学习
感谢!
感谢分享!
esp d1 mini试试
大佬流弊,学习
学习
睡眠唤醒之后,就不执行接下去的函数了
正好学习一下
66
666