sommeil-profond.ino
En sommeil profond, le SoC consomme quelques microampères : réveil par minute ou par appui, l'autonomie d'une pile tient des mois. RTC_NOINIT_ATTR garde le compteur de réveils entre deux remises à zéro.
Matériel requis
Une carte ESP32 classique (module ESP32-WROOM-32, double cœur Xtensa 240 MHz, Wi-Fi + Bluetooth) type DevKitC / DOIT V1, alimentée par micro-USB. Aucun pour tester ; bouton sur GPIO0 pour réveiller manuellement (attention : GPIO0 est aussi la broche bootloader).
Branchement
Bouton GPIO0 vers GND. En montage sur batterie, retirer le pont USB-Série qui consomme plus que le SoC endormi.
Fonctionnement
esp_sleep_enable_timer_wakeup arme l'horloge RTC, ext0 surveille un niveau ; esp_deep_sleep_start coupe tout le reste. Au réveil le programme repart de setup() — les variables RAM sont perdues, sauf les attributs RTC. Dans l'Arduino IDE, installez le paquet « esp32 » (Gestionnaire de cartes), choisissez « Dev Module », le port, puis Téléverser (maintenez BOOT si la détection échoue). GPIO34-39 sont entrées seules ; évitez GPIO6-11 et GPIO12.
Pour aller plus loin
Réveiller sur un capteur (ext1 sur plusieurs broches), ou endormir entre deux lectures DHT du sketch dédié.
sommeil-profond.ino
// Sommeil profond : reveil toutes les 30 s ou sur GPIO0 (LOW).
// Le compteur de reveils est conserve en RTC memory (tenu sous tension).
RTC_NOINIT_ATTR int reveils;
void setup() {
Serial.begin(115200);
delay(150); // laisser le pont USB-serial s'ouvrir
reveils++;
Serial.printf("\nReveil n°%d — mesure, puis dodo 30 s\n", reveils);
// (ici : lecture capteur, envoi radio, etc.)
Serial.printf("heap libre avant dodo : %u\n", ESP.getFreeHeap());
esp_sleep_enable_timer_wakeup(30ULL * 1000000); // 30 s
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0); // ou GPIO0 a LOW
Serial.println("Entree en sommeil profond...");
Serial.flush();
delay(10);
esp_deep_sleep_start();
}
void loop() {} // jamais atteint : le deep sleep reinitialise tout