esp32-light-sleep

Cómo usar el modo Light Sleep en un ESP32

El modo Light Sleep es uno de los modos de bajo consumo de energía disponibles en el ESP32, similar a un modo de “suspensión” de un ordenador.

En este modo, el ESP32 consume menos de 1mA (por ejemplo, 800mA en el ESP32 y 240uA en el ESP32-S3)

En este modo, la CPU, la RAM y los periféricos digitales se desconectan del reloj y se reduce su voltaje. Al estar desconectados del reloj dejan de funcionar, pero siguen encendidos y activos.

Cuando el ESP32 se encuentra en Light Sleep, deja de ejecutar el programa y entra en un estado de suspensión. Para salir del modo Light Sleep, los WakeUp Source disponibles son:

  • Timer
  • GPIO Wakeup
  • UART Wakeup
  • WIFI Wakeup
  • Touchpad
  • ULP Coprocessor Wakeup
  • External Wakeup (Ext0 y Ext1)

Al salir Light Sleep, el programa continua la ejecución desde el mismo punto donde estuviera. Cualquier información o variable que se hubiera guardado en la memoria se mantienen.

Uso del modo Light Sleep en el IDE de Arduino

Las funciones necesarias para usar el modo Light Sleep están definidos en el fichero “esp_sleep.h”. Esta biblioteca contiene las funciones y macros necesarios para configurar y controlar el modo Light Sleep del ESP32.

Con esto, es muy sencillo emplear el modo Light Sleep del ESP32 en el entorno de Arduino. En primer lugar, definimos un WakeUp Source con las funciones que vimos en Qué son los modos sleep en el ESP32.

A continuación, entrar en el modo Light Sleep es tan sencillo como usar la función esp_light_sleep_start

/**
 * @brief Enter light sleep with the configured wakeup options
 */
esp_err_t esp_light_sleep_start(void);

Ejemplos de código

Uso del modo Light Sleep

Veamos un ejemplo completo de cómo utilizar el modo Light Sleep para hacer que el ESP32 entre en sueño profundo durante 10 segundos y luego se despierte:

void setup() 
{
    Serial.begin(115200);
    delay(5000);
}

int counter = 0;

void loop() {
  Serial.println(counter);
  counter ++;

  esp_sleep_enable_timer_wakeup(2 * 1000000); //light sleep durante 2 segundos
  esp_light_sleep_start();  
}