You are currently viewing ESP8266深度睡眠與Arduino IDE

ESP8266深度睡眠與Arduino IDE

本指南展示了如何使用Arduino IDE與ESP8266(NodeMCU)一起使用深度睡眠功能。我們將使用定時器喚醒來喚醒深度睡眠,並使用複位(RST)引腳來喚醒外部喚醒。

要將ESP8266置於深度睡眠模式,請使用 ESP.deepSleep(uS)並以微秒為參數傳遞睡眠時間。GPIO 16必須連接到復位(RST)引腳,ESP8266才能喚醒。

要將ESP8266置於深度睡眠模式並無限期使用 ESP.deepSleep(0)。當RST引腳接收到LOW信號時,ESP8266將被喚醒。

介紹深度睡眠模式 

如果您使用電池供電的ESP8266開發板製作了一個專案,或者只是將ESP8266 NodeMCU板連接到了移動電源。運行一段時間後,您會發現電池使用不了很長時間,特別是在使用Wi-Fi的情況下。

便攜式電源ESP8266 ESP32

如果將ESP8266設定為深度睡眠模式,則可以降低功耗,讓電池續航時間更長。

讓ESP8266處於深度睡眠模式意味著可以減少一些在運行時會消耗更多功率的活動(例如Wi-Fi)。

睡眠類型

共有三種不同的睡眠模式:數據機睡眠(modem sleep)輕度睡眠(light sleep)深度睡眠(deep sleep)。下表顯示了每種模式之間的差異(ESP8266數據表中的信息)。

項目modem sleeplight sleepdeep 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等的全功能開發板,則將無法實現低功耗狀態。

深度睡眠作業流程

借助深度睡眠,應用程序範例如下所示:

  1. ESP8266連接到Wi-Fi
  2. ESP8266執行任務(讀取感測器,發布MQTT消息等)
  3. 睡眠一段預定的時間
  4. ESP8266喚醒
  5. 一遍又一遍地重複該過程

喚醒方法

將ESP8266置於深度睡眠模式後,有多種喚醒方法:

  • #1定時器喚醒: ESP8266在預定義的時間段後自行喚醒
  • #2外部喚醒:按RST按鈕時ESP8266喚醒(ESP8266重新啟動)

對於低功耗項目,您可以考慮使用ESP32板,該板提供更多的深度睡眠模式和喚醒源。

#1 ESP8266帶有定時器喚醒的深度睡眠 

要使用ESP8266的定時器喚醒功能,您需要在NodeMCU板中將RST引腳連接到標有D0的GPIO 16 。參考下面的連接原理圖:

ESP8266 NodeMCU GPIO16到RST(深度睡眠)

在上傳程式碼後,再將RST引腳連接到GPIO 16。

如果您看一下NodeMCU的引腳排列,您會發現GPIO 16是一個特殊的引腳,它具有喚醒功能。

GPIO 16喚醒引腳ESP8266 NodeMCU

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,例如按下按鈕或簧片開關。您只需要將ESP8266置於深度睡眠模式不確定的時間,然後將RST引腳設置為LOW即可將其喚醒。

要測試此設置,請按以下原理圖所示,將按鈕連接到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會喚醒,執行已編程的任務,然後返回睡眠狀態,直到觸發新的重置事件為止。

總結 

現在,您知道如何使用 deepSleep() 功能,您的電池供電項目可以持續更長的時間。

希望本指南對您有所幫助。謝謝閱讀!

發佈留言