Tutorial Deep Sleep con ESP32 y Arduino

Autor: Oscar Gonzalez

Tutorial Deep Sleep con ESP32 y Arduino

Tiempo de lectura: 4 minutos

Tutorial de cómo usar el modo Deep Sleep con ESp32 y Arduino

Tutorial Deep Sleep con ESP32 y Arduino

  • 0

0 Principiante

Introducción

Si estás aquí, probablemente quieras saber cómo poner tu microcontrolador ESP32 en Deep-Sleep. O quizás tu proyecto funciona con baterías y estás buscando la manera de alargar al máximo la autonomía.

Pues estás en el lugar ideal porque te voy a enseñar qué es el modo Deep Sleep, cómo utilizarlo y también algunos ejemplos. Verás que es muy sencillo, pero primero, empecemos por el principio.

¿Qué es el modo Deep Sleep?

El modo deep sleep es un estado de bajo consumo energético en el que se apaga casi todo el ESP32, resultando en un consumo de energía extremadamente bajo. En este modo, el ESP32 deja de ejecutar el programa y entra en un estado de suspensión. 

El ESP32 apaga la mayoría de los circuitos internos del microcontrolador, con excepción de algunos componentes esenciales como el reloj en tiempo real (Real-Time Clock o RTC) ya que lo usa para despertarse por ejemplo.

Según la documentación de Espressif, el ESP32 apaga todos sus circuitos internos, salvo estos:

  • RTC controller
  • ULP coprocessor
  • RTC FAST memory
  • RTC SLOW memory

Aunque se supone que ya lo hace por sí solo, antes de entrar en modo Deep Sleep, también se recomienda apagar primero el módulo Wifi y Bluetooth usando funciones como esp_bluedroid_disable(), esp_bt_controller_disable(), esp_wifi_stop()

¿Cómo funciona el Deep Sleep?

Cuando el ESP32 se encuentra en modo Deep Sleep, deja de ejecutar el programa y entra en un estado de suspensión. Para salir del modo Deep Sleep, el ESP32 puede ser despertado por diferentes fuentes denominadas "Wake Up Sources". Estas pueden ser un temporizador, una interrupción externa o un pin táctil.

Al salir del Deep Sleep, el programa vuelve a iniciarse desde el principio, eso quiere decir que se ejecuta de nuevo desde la función Setup() de Arduino. Como si acabaras de encender la placa por primera vez.

Tienes que tener en cuenta de que las variables que hayamos guardado en la memoria se borran. Es como reiniciar el ESP32, aunque luego te enseñaré como puedes guardar datos de forma permanente y que tu ESP32 no pierda el norte cuando se despierta y no parezca que tenga resaca después de una noche de fiesta.

¿Para qué se usa el Deep Sleep?

El modo de deep sleep es especialmente útil en aplicaciones alimentadas por batería o con alimentación limitada, como puede ser una alimentación solar, donde se necesita ahorrar la mayor cantidad de energía posible.

Eso es bastante obvio y este modo de reposo es extremadamente útil en estos casos.

Ahora que ya sabemos qué es, cómo funciona y para qué se usa el modo de deep sleep en el ESP32, te mostraré algunos ejemplos de código con Arduino.

Para eso veremos cómo hacerlo con un temporizador y con una interrupción.

Ejemplo 1: Deep Sleep con temporizador

Primero veamos un ejemplo de cómo usar Deep Sleep usando un temporizador para despertar el ESP32. Esto significa que podemos hacer que se duerma durante un periodo de tiempo y luego se despierte.

Si lanzamos el modo deep sleep, pero no indicamos cómo se va a despertar, sería como tener la bella durmiente ahí esperando hasta el infinito por su príncipe.

Este es uno de los casos más usados. Piensa que si su proyecto tiene una autonomía de 10 horas y duermes solo la mitad de ese tiempo, eso significa que tendrás al menos el doble de autonomía, en este caso 20 horas o más.

Vale realmente la pena utilizarlo, ya que con muy poco código puedes incrementar la autonomía de tu batería de forma considerable.

/*
 Ejemplo Deep Sleep con ESP32 y Arduino
*/
#define TIEMPO_DEP_SLEEP  5        /* Tiempo que el ESP32 estará en deep sleep (en segundos) */

void setup(){
  esp_sleep_enable_timer_wakeup(TIEMPO_DEP_SLEEP * 1000000  ); // El parámetro es en microsegundos. Así que multiplicamos los segundos por 1000000.

 // Haz aquí lo que tengas que hacer
// *** Codigo ***

// Volvemos a dormir
  esp_deep_sleep_start();
}

void loop(){
  // Esto nunca se va a ejecutar
}

Ejemplo 2: Deep Sleep con interrupción externa

En este ejemplo, el ESP32 entrará en modo deep sleep y se despertará cuando el GPIO 33 reciba un nivel alto.

Piensa que puede ser una señal que se genere de forma externa o un simple pulsador. Mientras no se active la señal de interrupción, el ESP32 permanecerá en modo Deep Sleep de forma permanente.

Fíjate que es probable que necesites sabes cuantas veces has despertado el ESP32 de ese modo y recuerda que no puedes almacenar eso en una variable, ya que como te he indicado arriba, esa información se pierde.

Para eso, existe el indicador RTC_DATA_ATTR para decirte al ESP32 que debe guardar ese dato incluso si entra en modo Deep Sleep. Es tan sencillo de utilizar como ponerlo delante de la declaración de la variable que quieras guardar.

RTC_DATA_ATTR int mi_variable = 0

En este ejemplo de abajo, veremos como vamos a usar la variable contador para contar el número de veces que se inicia el ESP32. Cada vez que arranque de nuevo, inicializa el puerto serial, mostrará el valor de la variable y volverá a dormir hasta que ocurra de nuevo la interrupción externa.

/*
 Ejemplo Deep Sleep con ESP32 y Arduino usando interrupción externa
*/
#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 en hexadecimal (pin 33)

RTC_DATA_ATTR int contador = 0;

void setup(){
  Serial.begin(115200);
  while (!Serial) { } // Esperamos un poco mientras se inicializa el puerto serial

  contador = contador   1 ;
  Serial.println("Contador: "   String(contador));

  esp_sleep_enable_ext0_wakeup(BUTTON_PIN_BITMASK, 1); // 1 = Alto, 0 = Bajo

  Serial.println("Me voy a domir");
  delay(1000);
  esp_deep_sleep_start();

}

void loop(){
  // Aquí no pongas nada, porque nunca se llegará a ejecutar.
}

Si quieres ver más en detalle toda la información de Espressif sobre Deep Sleep, puedes verlo en su web aquí.

Como puedes ver, es muy sencillo utilizar este modo y ofrece muchos beneficios, especialmente si tu proyecto funciona con baterías.

Además, existen muchas placas que funcionan con ESP32 y dejo algunos ejemplos aquí abajo por si te pueden interesar:

Arduino Nano ESP32 (con pines)

Arduino Nano ESP32 (con pines)

Arduino Nano con ESP32-S3 con conectividad Wifi y Bluetooth 5.0 con el soporte para MicroPython

19,95€

Comprar


Adafruit ESP32-S3 Feather

Adafruit ESP32-S3 Feather

Potente ESP32 Wifi/Bluetooth LE dual core 240 MHz con 4 MB flash, 2 MB PSRAM y con cargador de batería LiPo integrado

20,50€

Comprar


M5Stack ATOM ESP32-S3

M5Stack ATOM ESP32-S3

ATOM-S3 ESP32 con pantalla LCD IPS muy compacto y de ultra bajo consumo ideal para proyectos de IoT

19,95€

Comprar


M5Stack ESP32 Core S3 IoT Dev Kit

M5Stack ESP32 Core S3 IoT Dev Kit

Completo sistema de desarrollo ESP32 Core S3 de M5Stack con cámara, micrófono, pantalla LCD ¡y mucho más!

63,00€

Comprar


LilyGo T5 Pantalla E-Paper 4.7 pulgadas con ESP32-S3

LilyGo T5 Pantalla E-Paper 4.7 pulgadas con ESP32-S3

Una pantalla de tinta electrónica de 4.7 pulgadas con un poderoso ESP32-S3 ideal para tus proyectos IoT más ambiciosos

56,90€

Comprar


NodeMCU ESP32 Wroom WIFI + Bluetooth

NodeMCU ESP32 Wroom WIFI + Bluetooth

Potente placa basada en ESP32 WROOM con conectividad Wifi + Bluetooth

6,50€

Comprar