🛠 Deep sleep et réveil RTC sur GPIO0
Objetivos
Dormir el ESP32-C3 en modo deep sleep y despertarlo mediante un botón gracias a un pin del dominio RTC. El C3 baja típicamente a unos pocos microamperios en deep sleep — aún por debajo del umbral de 150 µA del ESP32 clásico — y se despierta en menos de un segundo. Aprenderás ext0_wakeup, el dominio RTC y la lectura de la causa del despertar.
Material
- 1 placa ESP32-C3
- 1 botón entre GPIO0 y GND
- Opcional: microamperímetro
Código completo
#include <driver/rtc_io.h>
const uint8_t REVEIL = 0; // GPIO0 = broche du domaine RTC
void setup {
Serial.begin(115200);
delay(500);
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause;
if (cause == ESP_SLEEP_WAKEUP_EXT0)
Serial.println(F("Reveille par le bouton !"));
else
Serial.println(F("Demarrage sur reset ou power-on"));
rtc_gpio_init(GPIO_NUM_0);
rtc_gpio_pullup_en(GPIO_NUM_0); // bouton actif a l'etat bas
rtc_gpio_hold_en(GPIO_NUM_0);
esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0); // reveil si niveau BAS
Serial.println(F("Deep sleep... appuyez sur GPIO0"));
Serial.flush;
esp_deep_sleep_start;
}
void loop {} // setup est rejoue a chaque reveil
Verificación esperada
Después del mensaje « Deep sleep… », la placa se queda en silencio; una pulsación del botón conectado a GPIO0 hacia GND la despierta y la consola muestra « ¡Despertado por el botón! ». El amperímetro indica un consumo del orden del microamperio durante el sueño.
Errores frecuentes
- Solicitar el despertar en un pin fuera del dominio RTC: ext0 solo acepta GPIO0 a GPIO5 en el C3; más allá, se necesita ext1 con varios pines.
- Olvidar rtc_gpio_pullup_en: el pin queda flotante, el despertar se dispara solo o nunca.
- Esperar que loop se ejecute después del despertar: en deep sleep, el chip reinicia desde cero, todo ocurre en setup.
- Comparar con los 150 µA del ESP32 clásico sin medir tu placa: el regulador, el LED y el puente USB añaden su propio consumo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino