ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【ESP32】スリープモードについて

 前に作成した自作ゼルダエフェクトーンが電池の持ちがなさすぎたので、ESP32でのスリープモードについて調べました。


■スリープモードについて
 結論からとしては以下のプログラムで実装できます。

#include "esp_deep_sleep.h"

void setup() {
  Serial.begin(115200);
  Serial.println("start ESP32");
  Serial.println("config IO");
  
  // スリープのための諸々の設定(今回はGPIO0ピンを使う)
  esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_AUTO);
  gpio_pullup_en(GPIO_NUM_0);    // use pullup on GPIO
  gpio_pulldown_dis(GPIO_NUM_0); // not use pulldown on GPIO

  esp_deep_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0); // 指定したGPIOがLowの時に起動

  delay(5000);
  Serial.println("deep sleep start!");
  esp_deep_sleep_start(); // スリープモード実行
}

void loop() {
  
}

 このプログラムをESP32に書き込んでからシリアルモニタを立ち上げ、「deep sleep start!」が表示されたあとにスリープモードに入ります。

 今回はGPIO0ピンをLowにすると起動するように設定しているので、GPIO0をGNDに落とすと再び「start ESP32」や「deep sleep start!」が表示されます。またesp_deep_sleep_enable_ext0_wakeup関数の第二引数を1にすると、GPIO0がHighの時に起動するというようにできます。

 色々な関数で使われている「GPIO_NUM_0」という引数の意味は、ESP32のライブラリで使用されている定数で、GPIO_NUM_0〜GPIO_NUM_40まであります。gpio_num_tの型エラーが出た場合はこの定数を使用します。

 今回はGPIOピンからの起動を行いましたが、時間による起動もできるようです。(参考記事より)

 実際に測定はしてないのでわかりませんが、スリープモードだとかなりの節約ができるみたいです。常時駆動させるような場合はスリープモードが必須になると思うので、ご参考になれば。

(一日に二回も更新するなんて偉いぞ、自分)


・参考記事
ESP32 Deep Sleep のテスト (Hibernation mode) - ブログ/こばさんの wakwak 山歩き
pcbreflux: ESP32 Deep Sleep Example