步驟1:簡介
ESP32具有以下功能:省電模式,稱為“深度睡眠”。在這種模式下,CPU,大多數RAM和所有數字時鐘外圍設備都將關閉。芯片上唯一仍可連接的部分是RTC控制器,RTC外設(包括ULP協處理器)和RTC存儲器。
我們有幾種方法可以在睡眠時喚醒ESP32。進入深度睡眠模式之前,可以隨時設置喚醒源。
步驟2:喚醒ESP32的方法
有五種喚醒ESP32的方法:
?計時器
?外部喚醒(ext0)
?外部喚醒(ext1)
?ULP協處理器喚醒
?觸摸板
步驟3:計時器
RTC控制器具有內置的計時器,在預定的時間段后,可用于激活芯片。時間以微秒精度指定。
esp_deep_sleep_enable_timer_wakeup( uint64_t time_in_us )
time_in_us》是以微秒為單位的時間
步驟4:外部喚醒(ext0)
當RTC GPIO之一進入預定義的邏輯級別時,RTC IO模塊包含觸發警報的邏輯。 RTC IO是RTC外設電源域的一部分,因此,如果請求此激活源,則在深度睡眠期間RTC外設將保持活動狀態。
esp_deep_sleep_enable_ext0_wakeup( gpio_num_t gpio_num , int level)
gpio_num》使用的GPIO編號作為激活源。只能使用RTC功能的GPIO:0,2,4,12-15,25-27,32-39。
level》輸入級別將觸發警報(0 = LOW,1 =高)
步驟5:外部喚醒(ext1)
RTC控制器包含使用多個RTC GPIO觸發鬧鐘的邏輯。
esp_deep_sleep_enable_ext1_wakeup(uint64_t mask, esp_ext1_wakeup_mode_t mode)
mask》會導致激活的GPIO編號的位掩碼。此位圖中只能使用啟用RTC的GPIO:0,2,4,12-15,25-27,32-39。
mode》選擇用于確定激活條件的邏輯功能:
?ESP_EXT1_WAKEUP_ALL_LOW:在所有選定的GPIO都為LOW時喚醒
?ESP_EXT1_WAKEUP_ANY_HIGH:在任何選定的GPIO為HIGH時喚醒
步驟6 :ULP協處理器喚醒
當芯片處于深度睡眠狀態時,ULP協處理器可以運行,并且可以用于搜索傳感器,監視ADC或電容式觸摸傳感器的值,并在特定事件發生時激活芯片
ULP協處理器是RTC外圍設備電源域的一部分,并運行存儲在慢速存儲器RTC中的程序。因此,如果請求此激活模式,則在深度睡眠期間將激活RTC外設和RTC慢速存儲器。
步驟7:觸摸板
RTC控制器包含使用電容式觸摸傳感器觸發警報的邏輯。但是,觸針的定義不同。我們必須對每個所需的引腳使用觸摸中斷。
設置中斷后,我們啟用喚醒模式以使用傳感器。
//Configure Touchpad as wakeup source
esp_sleep_enable_touchpad_wakeup();
步驟8:進入深度睡眠模式
設置喚醒模式后,只需一個命令即可將ESP32置于深度睡眠模式(花費2.5μA或更小)。我在這里強調,這筆費用來自ESP芯片,而不是印版,因為后者花費更多。
esp_deep_sleep_start();
從該命令開始,ESP32進入睡眠狀態,并且不執行下一行重要說明:必須在執行上述命令之前進行所有喚醒設置。
步驟9:以下是一些重要信息
下面的調用返回ESP32喚醒的原因。
1:EXT0 2:EXT1 3:計時器4:TOUCHPAD 5:ULP
esp_sleep_get_wakeup_cause();
如果通過觸摸板設置喚醒功能,我們可以通過命令恢復觸摸發生的GPIO
esp_sleep_get_touchpad_wakeup_status();
每次ESP32喚醒時,
它將再次循環進行設置。因此,所有未在RTC內存中定義的變量都將返回其原始狀態。
要即使在入睡后仍將變量保留在內存中,請在以下示例中使用變量聲明:
//RTC_DATA_ATTR aloca a variável na memória RTC
RTC_DATA_ATTR int bootCount = 0;
第10步:演示
視頻根據圖像顯示了程序的工作。
步驟11:WiFi NodeMCU-32S ESP-WROOM-32
步驟12:組裝
步驟13:程序
我們現在將創建一個程序,在其中將ESP32配置為進入深度睡眠模式。這將以三種不同的方式喚醒:一種用于外部喚醒(ext0),一種用于定時器,另一種用于觸摸板。它們不能一起工作,因此我們將使用一個變量作為計數器,表示ESP32引導Boot的次數以配置喚醒方式。
步驟14:需要使用庫
要控制OLED顯示,我們需要一個外部庫。為此,我們將下載U8g2庫。
在Arduino IDE中,轉到“草圖”菜單》》“包括庫” 》》“管理庫。..”。
第15步:庫和變量
我們包括了用于控制OLED顯示的庫,以及顯示控制器實例的構造函數。另外,我們在RTC內存中分配變量。我們設置觸摸接受的靈敏度,毫秒轉換因子(以秒為單位)以及ESP32進入睡眠模式的時間(以秒為單位)。
#include //biblioteca para controle do display oled
//construtor da instancia do controlador do display
//SDA = 21 e SCL = 22
U8X8_SSD1306_128X64_NONAME_SW_I2C display(SCL, SDA, U8X8_PIN_NONE);
//RTC_DATA_ATTR aloca a variável na memoria RTC
RTC_DATA_ATTR int bootCount = 0;
//sensibilidade para aceita??o do toque
#define Threshold 40
//fator de convers?o de microsegundos para segundos
#define uS_TO_S_FACTOR 1000000
//tempo que o ESP32 ficará em modo sleep (em segundos)
#define TIME_TO_SLEEP 3
步驟16:設置
在安裝程序中,我們增加啟動發生的次數。我們調用該函數來打印Boot主題。如果引導編號為PAR,則將ESP32設置為通過(EXT0)按鈕喚醒。如果是3的倍數,我們將ESP32設置為在設置的時間后喚醒。否則,我們將設置電容式觸摸引腳來喚醒ESP32。最后,我們將觸摸板設置為喚醒源,并強制ESP32進入睡眠模式。
void setup() {
Serial.begin(115200);
delay(1000);
//incrementa o numero de vezes que o BOOT ocorreu
++bootCount;
configureDisplay();
//chama a fun??o para imprimir o motivo do BOOT
print_wakeup_reason();
//se o numero de boot for PAR configuramos o ESP32 para despertar através do bot?o (EXT0)
if(bootCount % 2 == 0) {
esp_sleep_enable_ext0_wakeup(GPIO_NUM_39,1); //1 = High, 0 = Low
}
//se for multiplo de 3 configuramos o ESP32 para despertar depois de um tempo definido
else if(bootCount % 3 == 0) {
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}
//caso contrario configuramos os pinos de touch capacitivo para despertar o ESP32
else {
//Setup interrupt on Touch Pad 5 (GPIO12)
touchAttachInterrupt(T5, callback, Threshold);
//Configure Touchpad as wakeup source
esp_sleep_enable_touchpad_wakeup();
}
Serial.println(“entrando em modo sleep“);
esp_deep_sleep_start(); //for?a o ESP32 entrar em modo SLEEP
}
步驟17:循環,回調和ConfigureDisplay
在循環中,我們無事可做。然后,如果發生中斷,我們有事可做時,我們將繼續中斷回調。關于configureDisplay,我們初始化顯示并配置一些參數。我們在屏幕上打印引導發生的次數。
//nada a se fazer no loop
void loop() {
}
//callback das interrup??es
void callback(){
//caso queira fazer algo ao ocorrer a interrup??o
}
void configureDisplay()
{
//inicializa o display e configura alguns parametros
display.begin();
display.setPowerSave(0); //modo powerSave (0-Off ? 1-On)
display.setFont(u8x8_font_torussansbold8_u); //fonte utilizada
//imprime no display os numero de vezes que aconteceu o BOOT
display.drawString(0,0, ”BOOT NUM:“);
display.drawString(0,2,String(bootCount).c_str());
display.drawString(0,4, ”MOTIVO:“);
}
步驟18:Print_wakeup_reason(知道喚醒的原因)
這里,我們具有打印ESP32喚醒原因的功能。
//fun??o para imprimir a causa do ESP32 despertar
void print_wakeup_reason( ){
esp_sleep_wakeup_cause_t wakeup_reason;
String reason = ”“;
wakeup_reason = esp_sleep_get_wakeup_cause(); //recupera a causa do despertar
switch(wakeup_reason)
{
case 1 :reason = ”EXT0 RTC_IO BTN“; break;
case 2 :reason = ”EXT1 RTC_CNTL“; break;
case 3 :reason = ”TIMER“; break;
case 4 :reason = ”TOUCHPAD“; break;
case 5 :reason = ”ULP PROGRAM“; break;
default :reason = ”NO DS CAUSE“; break;
}
Serial.println(reason);
display.clearLine(6); //apaga a linha 6 do display
display.drawString(0,6, reason.c_str()); //imprime a causa do despertar no display
//se despertou por TOUCHPAD, ent?o vamos verificar em qual dos pinos ocorreu
if(wakeup_reason == 4) {
print_wakeup_touchpad(); //verifica o pino e imprime no display
}
}
步驟19:Print_wakeup_touchpad(知道GPIO觸摸)
現在,在此步驟中,我們具有打印被觸摸的圖釘的功能。我們恢復了喚醒ESP32的GPIO并將其打印在顯示屏上。
//fun??o para imprimir o pino que foi tocado
void print_wakeup_touchpad() {
touch_pad_t touchPin;
touchPin = esp_sleep_get_touchpad_wakeup_status(); //recupera o GPIO que despertou o ESP32
String GPIO = ”“;
switch(touchPin)
{
case 0 : GPIO = ”4“; break;
case 1 : GPIO = ”0“; break;
case 2 : GPIO = ”2“; break;
case 3 : GPIO = ”15“; break;
case 4 : GPIO = ”13“; break;
case 5 : GPIO = ”12“; break;
case 6 : GPIO = ”14“; break;
case 7 : GPIO = ”27“; break;
case 8 : GPIO = ”33“; break;
case 9 : GPIO = ”32“; break;
default : Serial.println(”Wakeup not by touchpad“); break;
}
Serial.println(”GPIO: “+GPIO);
display.clearLine(7);//apaga a linha 7 do display
display.drawString(0,7, ”GPIO: “);
display.drawString(6,7, GPIO.c_str()); //imprime o GPIO
}
-
ESP32
+關注
關注
21文章
1012瀏覽量
18984
發布評論請先 登錄
零知開源——ESP32語音交互系統(AI小智)開發教程

ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術規格書
【AI技術支持】ESP32-C3-MINI-1U模組睡眠模式下喚醒死機問題

簡述三種esp32的開發方式是什么
esp32和esp8266代碼共用嗎
esp8266和esp32區別是什么
esp32用什么軟件編程
ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么區別?ESP32-WROOM-32 后綴字母代表的意思是?

ESP32能取代STM32嗎?哪個更好?

評論