使用Arduino開發ESP32:DeepSleep和RTC Memory的使用


使用Arduino開發ESP32:DeepSleep和RTC Memory的使用

2019-07-31 14:27

目的

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM