🛠 Deep sleep à quelques microampères sur batterie
Objectifs
Concevoir un montage sur batterie : endormir l'ESP32-S2 en deep sleep (consommation de l'ordre du microampère), le réveiller par minuteur et par bouton sur broche RTC, et mesurer la consommation. Le S2 est un Xtensa LX7 mono-cœur 240 MHz très adapté au fonctionnement périodique basse consommation.
Matériel
- Carte ESP32-S2 (les régulateurs des cartes DevKit ajoutent du courant de veille : pour viser le µA, utilisez une carte nue ou débranchez le régulateur USB)
- Pack de piles ou LiPo 3,7 V
- 1 bouton poussoir sur GPIO1, 1 LED sur GPIO2 + 330 Ω
- Multimètre en mesure de courant
Code complet
// Deep sleep ESP32-S2 : réveil toutes les 30 s ou sur bouton GPIO1
#include <esp_sleep.h>
const uint8_t BTN_REVEIL = 1; // broche RTC valide pour EXT0
const uint8_t LED_PIN = 2;
const uint64_t PERIODE_US = 30ULL * 1000000ULL;
void setup {
Serial.begin(115200);
delay(300); // fenetre pour ouvrir le moniteur
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause;
Serial.printf("Reveil : %s\n",
cause == ESP_SLEEP_WAKEUP_TIMER ? "minuteur" :
cause == ESP_SLEEP_WAKEUP_EXT0 ? "bouton" : "première mise sous tension");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); // temoin bref de réveil
delay(300);
digitalWrite(LED_PIN, LOW);
// Fenetre de 5 s après reset pour permettre le reflash USB
// (l'USB natif GPIO19/20 est inactif pendant le deep sleep)
unsigned long t0 = millis;
while (millis - t0 < 5000) {
if (Serial) break;
delay(100);
}
esp_sleep_enable_ext0_wakeup((gpio_num_t)BTN_REVEIL, 0); // réveil sur LOW
esp_sleep_enable_timer_wakeup(PERIODE_US);
Serial.println("Endormissement profond...");
delay(10);
esp_deep_sleep_start; // ne revient jamais ici
}
void loop {} // inatteignable
Vérification attendue
À chaque réveil (minuteur de 30 s ou appui sur le bouton), la LED clignote brièvement et la console indique la cause. Entre deux réveils, le multimètre en série doit afficher une consommation très basse (µA sur carte nue, mA sur DevKit à cause du régulateur et des LED). L'horloge millis repart de zéro à chaque cycle : le deep sleep coupe le cœur.
Erreurs fréquentes
- Câbler le réveil sur GPIO0, 45 ou 46 : ce sont des broches de strapping, leur niveau au démarrage peut bloquer le boot ; préférez GPIO1-14.
- Utiliser GPIO33-37 : sur de nombreuses cartes S2 ces broches sont consommées par la flash/PSRAM et ne sortent pas sur les connecteurs.
- Attendre le port USB pendant le sommeil : l'USB natif (GPIO19/20) est coupé, le reflash exige un reset + appui sur Boot ; gardez une fenêtre de démarrage.
- Oublier que le deep sleep efface la RAM : tout état doit être sauvegardé en RTC memory ou en flash avant d'entrer en sommeil.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino