使用Arduino開發ESP32:DeepSleep和RTC Memory的使用
目的
ESP32在工作時功耗蠻大的,所以我們可以在不需要時進行休眠,這也是蠻常用的功能。
基礎說明
DeepSleep
使用DeepSleep主要分為兩步:
1、配置喚醒源(可以同時配置多個喚醒源);
2、啟動DeepSleep;
EPS32 DeepSleep的喚醒源有如下幾個:
```定時器;
```觸摸信號(touchpad);
```Ext(0):RTC IO 中某個指定 GPIO 滿足指定電平即喚醒;
```Ext(1):RTC IO 中某些指定 GPIO 同時滿足指定電平即喚醒;
```ULP 協處理器;
在啟動DeepSleep后ESP32只剩RTC相關模塊繼續工作,其它所有模塊全部關閉,所以我們需要根據需求手動處理一些事務,比如手動結束藍牙、wifi等工作
(esp_bluedroid_disable() esp_bt_controller_disable() esp_wifi_stop());
從DeepSleep喚醒后在Arduino core for the ESP32中對於用戶來說程序將重新從void setup(){}開始運行;
RTC Memory
ESP32在進入DeepSleep時內存中所有的數據將無法保持,如果我們需要將某些數據進行存儲的話使用RTC Memory是不錯的選擇。ESP32有快速和慢速兩片RTC內存區域,各8K大小。對於我們用戶引用來說用來存儲數據主要用到慢速的RTC內存。
使用RTC_DATA_ATTR標記的數據將被放置在RTC內存中,比如RTC_DATA_ATTR int data = 0;,在程序中可以通過變量名直接訪問。
使用示例
使用下面代碼進行測試:
RTC_DATA_ATTR int bootCount = 0; //將變量存放於RTC Memory
void setup()
{
Serial.begin(115200);
Serial.println();
bootCount++; //累加計數值
Serial.printf("這是第 %d 次復位n", bootCount);
switch(esp_sleep_get_wakeup_cause()) //獲取喚醒原因
{
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("通過定時器喚醒"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("通過觸摸喚醒"); break;
case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("通過EXT0喚醒"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("通過EXT1喚醒"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.println("通過ULP喚醒"); break;
default : Serial.println("並非從DeepSleep中喚醒"); break;
}
esp_sleep_enable_timer_wakeup(4000000); //設置定時器4秒喚醒
esp_deep_sleep_start(); //啟動DeepSleep
}
void loop()
{
}
部分方法說明
esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us)
設置通過定時器喚醒,輸入參數為微秒計數時間;
esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level)
設置通過外部喚醒,輸入參數為gpio口(如GPIO_NUM_35),電平(0=low 1=high);
可以使用的IO口為0,2,4,12-15,25-27,32-39;
void esp_deep_sleep_start()
啟動DeepSleep;
void esp_deep_sleep(uint64_t time_in_us)
相當於直接設置定時器喚醒並啟動DeepSleep;
esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause()
返回DeepSleep喚醒源,具體如下:
ESP_SLEEP_WAKEUP_UNDEFINED reset was not caused by exit from deep sleep
ESP_SLEEP_WAKEUP_EXT0
ESP_SLEEP_WAKEUP_EXT1
ESP_SLEEP_WAKEUP_TIMER
ESP_SLEEP_WAKEUP_TOUCHPAD
ESP_SLEEP_WAKEUP_ULP
ESP_SLEEP_WAKEUP_GPIO light sleep only
ESP_SLEEP_WAKEUP_UART light sleep only