Como dormir el ESP32 (deep-sleep)

Dormir nuestro controlador esp32 es la forma más fácil de ahorro de energía que podemos implementar en nuestros sensores de IOT.

En mucho desarrollos con arduino o con similares, como el esp32, por ejemplo. La mayoría de las veces no hace falta que esté constantemente enviando datos o procesándolos. Y si además nuestro dispositivo es autónomo la variable de ahorro de energía cobra mayor importancia.

En los sistemas basados en ESP32 tenemos una forma fácil y sencilla de que nuestro dispositivo IOT pueda ahorrar energía. Para ello solo tenemos que añadir el código para indicarle que pase a modo «durmiente» y conectar la salida D0 al pin de reset. 

El comando que necesitamos para dormir el ESP32 es el siguiente.

ESP.deepSleep(tiempo_milisegundos, modo reinicio)

Modos de uso para dormir el ESP32

Los modos que podemos usar son:

  • modem-sleep: este modo de ahorro permite desactivar la conexión WiFi de tipo Station , establecida con un punto de acceso (router), cuando no sea necesario su uso y volver a activarla cuando se necesite.. El consumo típico en este modo es de 15mA.
  • light-sleep: este modo de ahorro permite mantener la conexión WiFi de tipo Station, pero reduce el consumo de energía en los momentos en los que no hay envío de información.. El consumo típico pasa a ser de unos 0,5 mA.
  • deep-sleep: es el modo que genera mayor ahorro, pero a costa de dejar la placa en suspenso. La única parte de la placa que funciona durante este modo es reloj en tiempo real (Real Time Clock o RTC) para poder reiniciarla cuando haya finalizado el tiempo de reposo. El consumo típico pasa a ser de unos 10 uA.

Además de dispones de los siguientes modos de reinicio.

  • WAKE_RF_DEFAULT: Calibración de señal de radio si es necesario
  • WAKE_RFCAL: Calibración de señal de radio siempre
  • WAKE_NO_RFCAL: Sin calibración de la señal de radio
  • WAKE_RF_DISABLED: Deshabilita la señal de radio después del reencendido

El modo en el que más ahorro de energía conseguiremos es en el modo WAKE_RF_DEFAULT, ya que este modo es el que desactiva todos los sistemas no esenciales del ESP32.

En el siguiente enlace, podemos obtener más información de estos modos de uso y reinicio:

http://arduinoamuete.blogspot.com/2017/01/modo-deep-sleep-en-esp8266.html

La otra condición que tenemos que establecer, es el de conectar el pin D0 con el pin de reset. Ya que una vez que transcurra el tiempo que hemos indicado, este enviara una señal por el pin D0 para activar el reinicio del dispositivo.

ESP32 Deep Sleep

Puente entre D0 y reset para el reinicio

Código de ejemplo

Para la gestión podemos usar el siguiente ejemplo:

// Deep sleep mode

if (millis() >= (time_sleep + start_time)) {

    // Deep sleep mode, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin

    Serial.print("I'm awake, but I'm going into deep sleep mode for ");

    Serial.print(SLEEP_TIME);

    Serial.println(" seconds");

    ESP.deepSleep(SLEEP_TIME * SECONDS, WAKE_RF_DEFAULT);

}

else

{

    Serial.println("I'm alive");

    delay(500);

}

 

Con esto conseguiremos que nuestro sensores autónomos tenga una mayor autonomía.