2022年4月21日木曜日

ESP32 DeepSleepメモ

ESP32を電池駆動したい場合、DeepSleepは必須の機能です。
DeepSleepを実行すると、メインのコアやWiFi、BLEなどのモジュールはすべて停止し、メインメモリの状態はリセットされますが、RTCモジュールのULP(UltraLowPowerCore)と、それに含まれるスローメモリは動作を続けます。
DeepSleepから復帰すると、リセットした時と同様setup()から再開します。

DeepSleepの使い方

esp_sleep_enable_timer_wakeup(DEEP_SLEEP_TIME_uSEC); 
esp_deep_sleep_start();   

これでDeepSleepに入ります。


復帰の条件を設定する

タイマーによる復帰以外にもIOピンの状態を監視して復帰させることができます。
esp_sleep_enable_touchpad_wakeup();
esp_deep_sleep_start(); 
または
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1);
esp_deep_sleep_start(); 


シンプルなDeepSleepのコード

3秒おきに何かしらの処理をしてDeepSleepさせる

#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 3
void setup() {
  Serial.begin(115200);
  // put your code here:
  Serial.println("Going to sleep now");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}
void loop() {
}

どの条件で復帰したかを知るには

どの条件でウェイクアップしたかを知るには、以下のコードを使います
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();

ESP_SLEEP_WAKEUP_EXT0 RTCのIOで復帰
ESP_SLEEP_WAKEUP_EXT1 RTCのCONTROLで復帰
ESP_SLEEP_WAKEUP_TIMER タイマーで復帰
ESP_SLEEP_WAKEUP_TOUCHPAD タッチパッドで復帰
ESP_SLEEP_WAKEUP_ULP ULPから復帰

タッチパッドで復帰した場合、どのタッチパッドが復帰させたのかを知ることができます
touch_pad_t touchPin;
touchPin = esp_sleep_get_touchpad_wakeup_status();
詳細はESP32のスケッチ例を参照
ファイル>スケッチ例>ESP32>DeepSleep>TouchWakeUp

パワーオンリセットの時とタイマーウェイクアップした時の処理を分けた例

#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 3

void setup() {
  Serial.begin(115200);
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  if (wakeup_reason == ESP_SLEEP_WAKEUP_TIMER) {
    Serial.println("Wakeup caused by timer");
    // put your code here
  } else {
    Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason);
    // put your code here
  }
  Serial.println("Going to sleep now");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  esp_deep_sleep_start();
}

void loop() {
}

ArduinoIDEのスケッチ例

 ArduinoIDEのスケッチ例に、タイマー復帰、GPIO復帰、タッチパッド復帰の例があります

ファイル>スケッチ例>ESP32>DeepSleep>TimerWakeUp
ファイル>スケッチ例>ESP32>DeepSleep>ExternalWakeUp
ファイル>スケッチ例>ESP32>DeepSleep>TouchWakeUp

その他の復帰条件

 EXT1 RTC_CNTL 複数のGPIOピンをトリガにしてウェイクアップします。
 ULP RTCに含まれるUltraLowPowerコプロセッサを使ってウェイクアップします。
ADCなどの数値をULPでゆっくり監視して、条件を満たしたらメインのプロセッサを起こすみたいな処理ができそうですが詳細は割愛します

参照

0 件のコメント:

コメントを投稿