🛠 Deep sleep à quelques microampères sur batterie
Objetivos
Diseñar una configuración alimentada por batería: poner el ESP32-S2 en modo de sueño profundo (consumo del orden de microamperios), despertarlo mediante un temporizador y un botón en un pin RTC, y medir el consumo. El S2 es un Xtensa LX7 de un solo núcleo a 240 MHz, muy adecuado para el funcionamiento periódico de bajo consumo.
Material
- Placa ESP32-S2 (los reguladores de las placas DevKit añaden corriente de reposo: para alcanzar el orden de µA, utilice una placa desnuda o desconecte el regulador USB)
- Pack de pilas o batería LiPo de 3,7 V
- 1 botón pulsador en GPIO1, 1 LED en GPIO2 + 330 Ω
- Multímetro en modo de medición de corriente
Código completo
// Deep sleep ESP32-S2 : reveil 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" : "premiere mise sous tension");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); // temoin bref de reveil
delay(300);
digitalWrite(LED_PIN, LOW);
// Fenetre de 5 s apres 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); // reveil 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
Verificación esperada
En cada despertar (temporizador de 30 s o pulsación del botón), el LED parpadea brevemente y la consola indica la causa. Entre dos despertares, el multímetro en serie debe mostrar un consumo muy bajo (µA en placa desnuda, mA en DevKit debido al regulador y a los LED). El reloj millis vuelve a cero en cada ciclo: el sueño profundo apaga el núcleo.
Errores frecuentes
- Conectar el despertar en GPIO0, 45 o 46: son pines de strap, su nivel al arrancar puede bloquear el arranque; prefiera GPIO1-14.
- Usar GPIO33-37: en muchas placas S2 estos pines están ocupados por la flash/PSRAM y no salen a los conectores.
- Esperar el puerto USB durante el sueño: el USB nativo (GPIO19/20) está desconectado, el regrabado requiere un reset + pulsación de Boot; mantenga una ventana de arranque.
- Olvidar que el sueño profundo borra la RAM: todo estado debe guardarse en memoria RTC o en flash antes de entrar en sueño.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino