sommeil-profond.ino
En sueño profundo el SoC consume unos microamperios: despertar por minuto o por pulsación, y una pila dura meses. RTC_NOINIT_ATTR conserva el contador de despertones entre reinicios.
Hardware necesario
Una placa ESP32-S2 (núcleo único Xtensa, Wi-Fi, USB-OTG nativo en GPIO19/20, 14 pads táctiles capacitivos) tipo DevKitC-1 o QT Py, alimentada por USB. Ninguno para probar; botón en GPIO0 para despertar a mano (ojo: GPIO0 es también el pin del bootloader).
Cableado
Botón GPIO0 a GND. En montaje a batería, retire el puente USB-Serie, que consume más que el SoC dormido.
Funcionamiento
esp_sleep_enable_timer_wakeup arma el reloj RTC, ext0 vigila un nivel; esp_deep_sleep_start apaga todo lo demás. Al despertar el programa reinicia en setup(); las variables RAM se pierden salvo los atributos RTC. En el Arduino IDE (paquete esp32), elija « ESP32S2 Dev Module »; el S2 se programa directamente por su USB nativo (doble reset en algunas placas para entrar al bootloader).
Para ir más lejos
Despierte con un sensor (ext1 en varios pines), o duerma entre dos lecturas DHT del sketch dedicado.
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