Objetivos
- Poner a dormir el ESP32 del M5Stack Core en modo deep-sleep (esp_sleep) y despertarlo mediante un temporizador y/o un botón.
- Utilizar GPIO0 (botón BOOT trasero) como fuente de despertar EXT0, y GPIO35 (M-BUS) como EXT1 si es necesario.
- Distinguir entre deep-sleep (el ESP32 duerme, el IP5306 sigue proporcionando los voltajes) y M5.Power.powerOFF (corte total suave mediante el botón rojo).
- Medir el ciclo de vida de un registrador con batería de 110 mAh: medir, mostrar, dormir.
Material
- 1 M5Stack Core cargado (batería LiPo de 110 mAh, 150 mAh antes de 2020.3).
- Conocer los botones traseros: BOOT = GPIO0 (strapping + despertar posible), RESET.
- Opcional: botón externo en GPIO35 (M-BUS) para EXT1.
Código completo
#include <M5Unified.h>
#include <esp_sleep.h>
#define REVEIL_US (60ULL * 1000000ULL) // 60 s
#define PIN_EXT0 0 // bouton BOOT arriere
#define PIN_EXT1 35 // M-BUS, optionnel
void setup {
auto cfg = M5.config;
M5.begin(cfg);
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause;
M5.Display.setTextSize(2);
M5.Display.fillScreen(TFT_BLACK);
M5.Display.setCursor(5, 5);
switch (cause) {
case ESP_SLEEP_WAKEUP_TIMER: M5.Display.println("Reveil : minuteur"); break;
case ESP_SLEEP_WAKEUP_EXT0: M5.Display.println("Reveil : BOOT G0"); break;
case ESP_SLEEP_WAKEUP_EXT1: M5.Display.println("Reveil : G35"); break;
default: M5.Display.println("Demarrage normal");
}
// Pseudo-mesure : niveau de batterie
M5.Display.printf("Batterie : %d %%\n", M5.Power.getBatteryLevel);
vTaskDelay(1500 / portTICK_PERIOD_MS);
M5.Display.setBrightness(0); // eteint le retroéclairage
esp_sleep_enable_timer_wakeup(REVEIL_US);
esp_sleep_enable_ext0_wakeup((gpio_num_t)PIN_EXT0, 0); // G0 a l'etat bas
esp_sleep_enable_ext1_wakeup(1ULL << PIN_EXT1, ESP_EXT1_WAKEUP_ANY_HIGH);
esp_deep_sleep_start;
}
void loop { } // tout se passe dans setup
Verificación esperada
- En el primer arranque: « Demarrage normal », luego la pantalla se apaga; 60 segundos después la pantalla se enciende con « Reveil : minuteur ».
- En deep-sleep, una pulsación en BOOT (trasero) despierta inmediatamente con « Reveil : BOOT G0 ».
- Consumo fuertemente reducido en modo sueño (la pantalla y la CPU están apagadas) — a confirmar con un microamperímetro en serie con la batería.
Errores frecuentes
- Confundir deep-sleep y powerOFF: powerOFF corta el boost del IP5306, la tarjeta parece « brickada » hasta una pulsación en el botón rojo; deep-sleep mantiene el IP5306 activo.
- Elegir GPIO39/38/37 (botones frontales) para EXT0/EXT1: estos pines de solo entrada no son pines de despertar válidos; utilizar GPIO0 o los pines M-BUS.
- El despertar EXT0 que nunca se dispara: verificar el nivel esperado (BOOT conecta G0 a GND → nivel 0) y los estados de retención de los pines.
- Olvidar apagar la retroiluminación: es lo que más consume; setBrightness(0) antes de dormir.
- Apuntar a la autonomía teórica sobre 110 mAh: con la pantalla encendida y Wi-Fi, la autonomía real es corta; el deep-sleep cíclico es el único régimen de larga duración.
- No hay RTC en esta tarjeta: el temporizador deep-sleep es el único reloj de despertar fiable.