ESP32マイコンを内蔵したM5Stackで定期的に測定・記録等の処理を行い、バッテリー節約のためdeep sleepで待機の間眠らせておきたい場合は下記の様なスケッチを組む。
一つ注意点があり、USB駆動では問題ないのだが、バッテリー駆動の場合スリープ時間が約32秒を超えると起きれなくなってしまう。
https://github.com/m5stack/M5Stack/issues/34
ハードウェアに使われている IP5306 と言う電源制御ICが45mA以下の電流が32秒以上継続するとスタンバイに入ってしまう為らしい。このため、M5Stackでバッテリー駆動でディープスリープをする場合、必ず32秒以内に一度起きる必要がある。
#include <WiFi.h>
#include <M5Stack.h>
#include "esp_deep_sleep.h"
#define WAKE_INTERVAL 30 //スリープ時間 秒
void gosleep() {
Serial.println("Sleeping");
Serial.flush();
delay(100);
const uint32_t DEEP_SLEEP_uS = 1000 * 1000 * WAKE_INTERVAL; //n秒後に起動
esp_deep_sleep_enable_timer_wakeup(DEEP_SLEEP_uS);
esp_deep_sleep_start();
}
void setup()
{
Serial.begin(115200);
M5.begin();
delay(100);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
//なんらかの処理
gosleep();
}
void loop() {
}