ESP32には「電源オンによる起動」や「ディープスリープからの復帰」など、いくつかの起動理由がありますが、この起動理由を知りたい機会がありました。
具体的な目的は、一定時間間隔でディープスリープから復帰してデータ測定するIoTデバイスにおいて、その再起動が通常処理(ディープスリープからの復帰)によるものか、それとも何らかの別の理由によって強制リセットがかかったものかを知りたいというものです。
調べたところ、「esp_reset_reason()」という関数を使えば所望の処理が行えるようなので、早速試してみました。
デバイスは、スイッチサイエンスの「ESPr Developer 32」を使いました。
リンク
リンク
以下のスケッチを「ESPr Developer 32」に書き込みます。
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println("");
esp_reset_reason_t reason = esp_reset_reason();
switch (reason) {
case ESP_RST_UNKNOWN: Serial.println("Reset reason can not be determined"); break;
case ESP_RST_POWERON: Serial.println("Reset due to power-on event"); break;
case ESP_RST_EXT: Serial.println("Reset by external pin (not applicable for ESP32)"); break;
case ESP_RST_SW: Serial.println("Software reset via esp_restart"); break;
case ESP_RST_PANIC: Serial.println("Software reset due to exception/panic"); break;
case ESP_RST_INT_WDT: Serial.println("Reset (software or hardware) due to interrupt watchdog"); break;
case ESP_RST_TASK_WDT: Serial.println("Reset due to task watchdog"); break;
case ESP_RST_WDT: Serial.println("Reset due to other watchdogs"); break;
case ESP_RST_DEEPSLEEP: Serial.println("Reset after exiting deep sleep mode"); break;
case ESP_RST_BROWNOUT: Serial.println("Brownout reset (software or hardware)"); break;
case ESP_RST_SDIO: Serial.println("Reset over SDIO"); break;
default: break;
}
esp_sleep_enable_timer_wakeup(60*1000*1000);
esp_deep_sleep_start();
}
void loop() {}
シリアルモニタを観測すると、以下のとおり表示されました。
Reset due to power-on event ←スケッチ書き込み直後に表示
:
Reset after exiting deep sleep mode ←60秒のディープスリープからの復帰後に表示
:
Reset due to other watchdogs ←デバイスの「RESET」ボタンを押した時に表示
所望の情報を取得することができました。
今後IoTデバイスを開発する際には、測定データだけでなく、この起動理由も保存するようにして、デバイスの動作状況確認に役立てたいと思います。
リンク