GPIO¶
外部IOからの入力トリガーにて復帰します。設定できるIOは複数だけで、プルアップも利用可能です。 このモードはライトスリープでのみ利用できます。
サンプルスケッチ[GitHub]¶
int bootCount = 0; // ライトスリープは通常の変数で良い
void setup() {
// シリアル初期化
Serial.begin(115200);
// シリアル初期化待ち
delay(1000);
// GPIO37(M5StickCのHOMEボタン)かGPIO39(M5StickCの右ボタン)がLOWになったら起動
pinMode(GPIO_NUM_37, INPUT);
pinMode(GPIO_NUM_39, INPUT);
gpio_wakeup_enable(GPIO_NUM_37, GPIO_INTR_LOW_LEVEL);
gpio_wakeup_enable(GPIO_NUM_39, GPIO_INTR_LOW_LEVEL);
// GPIOをウェイクアップソースとして有効にする
esp_sleep_enable_gpio_wakeup();
}
void loop() {
// 起動回数カウントアップ
bootCount++;
Serial.printf("起動回数: %d ", bootCount);
// 起動方法取得
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason){
case ESP_SLEEP_WAKEUP_EXT0 : Serial.printf("外部割り込み(RTC_IO)で起動\n"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.printf("外部割り込み(RTC_CNTL)で起動 IO=%llX\n", esp_sleep_get_ext1_wakeup_status()); break;
case ESP_SLEEP_WAKEUP_TIMER : Serial.printf("タイマー割り込みで起動\n"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.printf("タッチ割り込みで起動\n"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.printf("ULPプログラムで起動\n"); break;
case ESP_SLEEP_WAKEUP_GPIO : Serial.printf("ライトスリープからGPIO割り込みで起動\n"); break;
case ESP_SLEEP_WAKEUP_UART : Serial.printf("ライトスリープからUART割り込みで起動\n"); break;
default : Serial.printf("スリープ以外からの起動\n"); break;
}
// シリアルをすべて出力する
Serial.flush();
// ライトスリープ
esp_light_sleep_start();
}