前に作成した自作ゼルダエフェクトーンが電池の持ちがなさすぎたので、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