本指南展示了如何使用Arduino IDE与ESP8266(NodeMCU)一起使用深度睡眠。我们将使用定时器唤醒来唤醒深度睡眠,并使用复位(RST)引脚来唤醒外部唤醒。
引入深度睡眠模式
如果您使用电池供电的ESP8266板制作了一个项目,或者只是将ESP8266 NodeMCU板连接到了移动电源。运行一段时间后,您会发现电池使用不了很长时间,特别是在使用Wi-Fi的情况下。
如果将ESP8266置于深度睡眠模式,则可以降低功耗,并且电池续航时间更长。
使ESP8266处于深度睡眠模式意味着可以减少那些在运行时会消耗更多功率的活动(例如Wi-Fi),但是在发生有趣的事情时仅留有足够的活动来唤醒处理器。
睡眠类型
共有三种不同的睡眠模式:调制解调器睡眠,轻度睡眠和深度睡眠。下表显示了每种模式之间的差异(ESP8266数据表中的信息)。
项目调制解调器睡眠浅睡眠沉睡
无线上网关 关 关
系统时钟上 关 关
实时时钟上 上 上
中央处理器上 待定 关
基板电流15毫安 0.4毫安 约20 uA
平均电流(DTIM = 1)16.2毫安 1.8毫安 –
平均电流(DTIM = 3)15.4毫安 0.9毫安 –
平均电流(DTIM = 10)15.2毫安 0.55毫安 –
它们都有不同的用途,应在不同的应用程序中使用。
在本文中,我们将介绍深度睡眠模式。除了实时时钟(RTC),ESP8266会一直跟踪时间,一切都总是关闭。
这是最省电的选择,ESP芯片仅消耗约20uA的电流。但是,如果您使用带有内置编程器,LED等的全功能开发板,则将无法实现低功耗状态。
深度睡眠素描
借助深度睡眠,示例应用程序如下所示:ESP8266连接到Wi-Fi
ESP8266执行任务(读取传感器,发布MQTT消息等)
睡眠一段预定的时间
ESP8266唤醒
一遍又一遍地重复该过程
唤醒源
将ESP8266置于深度睡眠模式后,可以通过多种方法唤醒它:#1定时器唤醒: ESP8266在预定义的时间段后自行唤醒
#2外部唤醒:按RST按钮时ESP8266唤醒(ESP8266重新启动)
对于低功耗项目,您可以考虑使用ESP32板,该板提供更多的深度睡眠模式和唤醒源。
#1 ESP8266带有定时器唤醒的深度睡眠
要使用ESP8266的定时器唤醒功能,您需要在NodeMCU板中将RST引脚连接到标有D0的GPIO 16 。只需遵循下一个原理图:
仅在上传代码后,才将RST引脚连接到GPIO 16。
如果您看一下NodeMCU引脚排列,您会发现GPIO 16是一个特殊的引脚,并且具有唤醒功能。
//------------------------------------------------------------------------------------------------------
ESP8266运行时,ESP8266的RST引脚始终为高电平。但是,当RST引脚接收到LOW信号时,它将重新启动微控制器。
如果您使用ESP8266设置了深度睡眠计时器,则计时器结束后,GPIO 16将发送LOW信号。这意味着,GPIO 16连接到RST引脚后,可以在设定的时间后唤醒ESP8266。
ESP8266 NodeMCU定时器唤醒草图
安装了适用于Arduino IDE的ESP8266插件(如何在Arduino IDE中安装ESP8266板),转到“ 工具”,然后选择“ NodeMCU(ESP-12E Module) ”。这是您需要上传到ESP的代码:
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.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() {
}
在此示例中,我们在串行监视器中打印一条消息:
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连接到GPIO16。ESP8266应该每30秒唤醒一次,并在串行监视器中显示一条消息,如下所示。
该示例仅在串行监视器中打印一条消息,但是在实际应用程序中,您将执行有用的任务,例如发出请求,发布传感器读数等。
ESP-01定时器唤醒电路
如果要使用ESP-01板进行类似的设置,则需要如下所示焊接导线。这个微小的引脚是GPIO 16,需要连接到RST引脚。
但是,引脚是如此之细,以至于很难像ESP-01上的GPIO 16那样焊接导线。因此,对于这种唤醒模式,您应该使用NodeMCU板或裸露的ESP12-E芯片。
///-----------------------------------------------------------------------------------------//
#2 ESP8266外部唤醒的深度睡眠
您也可以通过外部唤醒来唤醒ESP8266,例如按下按钮或簧片开关。您只需要将ESP8266置于深度睡眠模式不确定的时间,然后将RST引脚设置为LOW即可将其唤醒。
要测试此设置,请按以下原理图所示,将按钮连接到ESP8266开发板上。当您按下按钮时,RST引脚变为低电平。
如果您使用的是 ESP-01,请改用下图。
ESP8266外部唤醒草图
然后,将以下代码上传到ESP8266开发板。
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.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作为参数传递给deepSleep()函数:
ESP.deepSleep(0);
仅当某些东西使电路板复位时,ESP才会唤醒。在这种情况下,按下按钮会将RST引脚拉至GND。
按下按钮后,ESP8266会唤醒,执行已编程的任务,然后返回睡眠状态,直到触发新的重置事件为止。
测量电流
当评估板处于深度睡眠模式时,请用万用表测量电流消耗,以查看消耗了多少功率。
这是放置万用表探针的方法。
当ESP-01处于深度睡眠模式时,它仅使用0.3mA电流(约300uA)。
请记住,在Wi-Fi正常使用期间,ESP8266可能消耗50mA至170mA的电流。
包起来
现在您知道如何使用deepSleep()函数,电池供电的项目可以持续更长时间。
原文章地址:https://randomnerdtutorials.com/esp8266-deep-sleep-with-arduino-ide/