Objectifs
- Endormir l'ESP32 de l'M5Stack Core en deep-sleep (esp_sleep) et le réveiller par un minuteur et/ou un bouton.
- Utiliser GPIO0 (bouton BOOT arrière) comme source de réveil EXT0, et GPIO35 (M-BUS) comme EXT1 si besoin.
- Distinguer deep-sleep (l'ESP32 dort, l'IP5306 continue de fournir les tensions) et M5.Power.powerOFF (coupure soft totale via le bouton rouge).
- Mesurer le cycle de vie d'un enregistreur sur batterie 110 mAh : mesurer, afficher, dormir.
Matériel
- 1 M5Stack Core chargé (batterie LiPo 110 mAh, 150 mAh avant 2020.3).
- Connaître les boutons arrière : BOOT = GPIO0 (strapping + réveil possible), RESET.
- Optionnel : bouton externe sur GPIO35 (M-BUS) pour EXT1.
Code complet
#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'état 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
Vérification attendue
- Au premier démarrage : « Demarrage normal », puis l'écran s'éteint ; 60 s plus tard l'écran se rallume avec « Reveil : minuteur ».
- En deep-sleep, un appui sur BOOT (arrière) réveille immédiatement avec « Reveil : BOOT G0 ».
- Consommation fortement réduite en sommeil (l'écran et le CPU sont coupés) — à confirmer avec un micro-ammètre en série avec la batterie.
Erreurs fréquentes
- Confondre deep-sleep et powerOFF : powerOFF coupe le boost IP5306, la carte paraît « brickée » jusqu'à un appui sur le bouton rouge ; deep-sleep garde l'IP5306 actif.
- Choisir GPIO39/38/37 (boutons de façade) pour EXT0/EXT1 : ces broches entrée seule ne sont pas des broches de réveil valides ; utiliser GPIO0 ou les broches M-BUS.
- Réveil EXT0 qui ne part jamais : vérifier le niveau attendu (BOOT relie G0 au GND → niveau 0) et les états de retention des broches.
- Oublier d'éteindre le rétroéclairage : c'est lui qui consomme le plus ; setBrightness(0) avant de dormir.
- Viser l'autonomie théorique sur 110 mAh : avec écran allumé et Wi-Fi, l'autonomie réelle est courte ; le deep-sleep cyclique est le seul régime longue durée.
- Pas de RTC sur cette carte : le minuteur deep-sleep est la seule horloge de réveil fiable.