本指南展示了如何使用Arduino IDE與ESP8266(NodeMCU)一起使用深度睡眠功能。我們將使用定時器喚醒來喚醒深度睡眠,並使用複位(RST)引腳來喚醒外部喚醒。
要將ESP8266置於深度睡眠模式,請使用 ESP.deepSleep(uS)並以微秒為參數傳遞睡眠時間。GPIO 16必須連接到復位(RST)引腳,ESP8266才能喚醒。
要將ESP8266置於深度睡眠模式並無限期使用 ESP.deepSleep(0)。當RST引腳接收到LOW信號時,ESP8266將被喚醒。
文章目錄標題
介紹深度睡眠模式
如果將ESP8266設定為深度睡眠模式,則可以降低功耗,讓電池續航時間更長。
讓ESP8266處於深度睡眠模式意味著可以減少一些在運行時會消耗更多功率的活動(例如Wi-Fi)。
睡眠類型
共有三種不同的睡眠模式:數據機睡眠(modem sleep),輕度睡眠(light sleep)和深度睡眠(deep sleep)。下表顯示了每種模式之間的差異(ESP8266數據表中的信息)。
項目 | modem sleep | light sleep | deep sleep |
Wi-Fi | 關 | 關 | 關 |
System clock | 上 | 關 | 關 |
RTC | 上 | 上 | 上 |
CPU | 上 | 待定 | 關 |
基板電流 | 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帶有定時器喚醒的深度睡眠
在上傳程式碼後,再將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
* Terry Lee
* 完整說明請參考 http://honeststore.com.tw
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// 等待序列初始化。
while(!Serial) { }
// 深度睡眠模式設定60秒,ESP8266自身喚醒,當GPIO 16(在Nodemcu板D0)連接到復位引腳時
Serial.println("我醒了, 但我將進入深度睡眠模式60秒");
ESP.deepSleep(60e6);
// 深睡眠模式直到復位引腳連接到LOW信號(例如按鈕或磁性簧片開關)
//Serial.println("我醒了, 但我將進入深度睡眠模式直到RESET引腳收到LOW信號");
//ESP.deepSleep(0);
}
void loop() {
}
在本範例中,我們在序列監視器中印出一條訊息:
Serial.println("我醒了, 但我將進入深度睡眠模式60秒");
之後,ESP8266進入睡眠狀態達60秒鐘。
ESP.deepSleep(60e6);
要使ESP8266處於深度睡眠狀態,請使用 ESP.deepsleep(uS) 並以毫秒為單位計算睡眠時間。
在這種情況下,60e6對應於60000000微秒,等於60秒。
上傳程式碼後,按RST按鈕開始運行代碼,然後將RST連接到GPIO16。ESP8266應該每60秒喚醒一次,並在序列監視器中顯示一條訊息,如下所示。
該範例僅在序列監視器中印出一條消息,但是在實際應用程序中,您將執行一項有用的任務,例如發出請求,發布感測器讀數等。
#2 ESP8266外部喚醒的深度睡眠
要測試此設置,請按以下原理圖所示,將按鈕連接到ESP8266開發板上。當您按下按鈕時,RST引腳變為低電平。
ESP8266外部喚醒草稿圖
然後,將以下程式碼上傳到ESP8266開發板。
/*
* ESP8266 Deep sleep mode example
* Terry Lee
* 完整說明請參考 http://honeststore.com.tw
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// 等待序列初始化。
while(!Serial) { }
// 深度睡眠模式設定60秒,ESP8266自身喚醒,當GPIO 16(在Nodemcu板D0)連接到復位引腳時
//Serial.println("我醒了, 但我將進入深度睡眠模式60秒");
//ESP.deepSleep(60e6);
// 深睡眠模式直到復位引腳連接到LOW信號(例如按鈕或磁性簧片開關)
Serial.println("我醒了, 但我將進入深度睡眠模式直到RESET引腳收到LOW信號");
ESP.deepSleep(0);
}
void loop() {
}
該程式碼可將ESP8266置於不確定的深度睡眠模式。為此,您只需將0作為參數傳遞給沉睡() 功能:
ESP.deepSleep(0);
僅當開發板復位時,ESP才會喚醒。在這種情況下,按下按鈕會將RST引腳拉至GND。
按下按鈕後,ESP8266會喚醒,執行已編程的任務,然後返回睡眠狀態,直到觸發新的重置事件為止。
總結
希望本指南對您有所幫助。謝謝閱讀!