bclose

ESP32 Deep Sleep

Objetivos

 

 

  • Arduino y los periféricos USB
  • MAX3421E y la gestión del USB
  • Un ejemplo de como leer un teclado desde el M5STACK.
 

 

Material requerido.

 

 Tienda EspañaTienda Mexico
modelo esp32 con menos pines    Un esp32

 

Ahorrando energía con el ESP32

 

Los ESP32 son unos SOC excepcionales que no nos cansamos de alabar, y que usamos largo y tendido en estas paginas y casi en cualquier proyecto que hago. Básicamente porque tenemos un procesador potente que además dispone de WIFI y Bluetooth integrado, además de varios convertidores Analógico a Digital y dos convertidores digitales a Analógico.

Si añadimos que es compatible con Arduino, pues tenemos un claro ganador y candidato a usarlo en cualquier proyecto que requiera comunicaciones y procesador potente. Pero siempre hablamos de sus ventajas y quizás es un buen momento para hablar de sus defectos,

Veamos, puestos a sacarle defectos podríamos considerar:

 
 
  • Pocos pines disponibles: Si lo comparamos con la familia de Arduinos UNO o MEGA. Puede parecer que los 32 que trae en las plataformas habituales son muchos, pero en cuanto empiezas a buscar, te encuentras que muchos son de uso interno y que no conviene usar si no quieres tener problemas rápidamente, lo que hace que el número de pines de verdad disponibles decrezca rápidamente.
  • Tiene varios canales de convertidor AD de 10 o 12 bits de precisión, lo que esta genial pero no son lineales. Esto quiere decir que no te puedes fiar mucho de el en las partes altas y bajas de la escala, y que si necesitas precisión tendrás que corregir las medidas con varios métodos disponibles.
  • Por último, el más grave: Consume muchísimo cuando activas la radio del WIFI o Bluetooth. Si, las radios consumen siempre, pero lo del ESP32 es impresionante, puede llegar a consumir hasta 250 mA cuando emite. Peor incluso, cuando apagas las radios el consumo puede ser alto, lo que hace que los proyectos a base de baterías sean muy problemáticos con él, si no entramos en los modos Sleep para recortar el consumo.    

Hoy me gustaía centrarme en este último aspecto, el de los consumos y como limitar daños y para eso vamos a hablar de que partes o bloques tenemos en el ESP32 y que podemos hacer para reducir consumos y luego entraremos en la parte del modo Sleep que duerme el procesador y reduce los consumos de forma notable.

Nos centraremos en ver como entrar en este mod de sueño profundo que como veréis es bastante sencillo y es algo que puedes usar sin problemas en tus proyectos no lo dudes.

 

Diagrama de bloques del ESP32

 

El ESP32 contiene internamente toda la electrónica del procesador las radios el reloj interno y unas cuantas cosas más. No quiero entrar en grandes profundidades porque la idea de todo esto es coger algunas nociones básicas, no hacer un estudio en profundidad que nos aburriría a todos, y a mí el primero, sin duda. Aquí os dejo un diagrama de bloques internos:

modelo de bloques

A grandes rasgos podemos hablar del bloque del procesador y memoria (En Rosa), el bloque de radio Bluetooth y WIFI (En Azul), la parte del reloj interno (Amarillo) y a la izquierda en gris las entradas y salidas.

De todo ello lo que más consume es, sin duda, las radios en operación y luego el propio procesador cuyo consumo depende bastante de la velocidad del reloj. EL ESP32 nos permite apagar selectivamente bloques para ahorrar energía.

¿Por qué queremos apagar bloques y ahorrar energía? Bueno, veamos. Si queremos hacer un registro de valores de, digamos unos sensores, lo normal es ir haciendo lecturas cada tanto tiempo. Pero la mayor parte del tiempo nuestro equipo no estará haciendo nada. Si embargo hacer nada, es algo que consume en un procesador por muchos motivos. En el caso de un ESP32 con la radio encendida, ese nada es según el manual, entre 80 y 260 mA.

nivel de corriente necesaria

Puede que 120 mA de promedio, no parezca mucho consumo, pero enseguida veras que las pilas se agotan a velocidad de vértigo y tu proyecto no va a aguantar ni un día con unas pilas normales. Si quieres que la cosa pueda mantenerse durante semanas o meses vas a tener que ahorrar energía, y solo hay una forma de hacerlo: Dormir tu procesador.

Hay varias formas de hacerlo. Puedes dormir unos bloques y mantener otros despiertos, pero en general en muchos de los proyectos en los que quieres despertarte cada pocos minutos y tomar una lectura, almacenarla o enviarla y volver a dormir, lo mas sencillo es dormir todo y a otra cosa.

En esta sesión veremos cómo colocar tu ESP32 en Deep sleep mode, que es como menos consume cuando no hace nada, lo que incluye apagar las radios y olvidarte de mantener la conexión WIFI. Podrás usarla al despertar, volviendo a conectarte, harás lo que tengas que hacer y vuelta a dormir hasta la próxima.

 

ESP32 Deep Sleep

 

El modo Deep Sleep es el que mejor ahorro de energía nos permite hacer, y es porque apaga casi todo el procesador… y la clave está en ese casi. Apagamos el procesador, la memoria principal y los periféricos, pero vamos a mantener vivos el RTC (Real Time Controller) el reloj y sus periféricos asociados junto con su memoria RAM asociada y el ULP (Ultra Low Power Processor)

Durante el Sleep Mode, solo el ULP permanece despierto y gestiona el reloj y el control de las causas que pueden provocar el despertar, disparándolo cuando se cumplen las condiciones prefijadas.

Una curiosidad de esto es que la memoria principal está apagada, lo que significa que perderá cualquier contenido o variables que tuvierais allí. Cuando arranque será un arranque en blanco exactamente igual que cuando enciendes tu procesador y ejecutará el setup() porque ha perdido todo todo.

 
 
  • Aunque la memoria RAM del RTC sigue funcional y eso nos puede permitir guardar algunos datos allí, más adelante veremos cómo. (Pero sin abusar) .  

Para entrar en este modo profundo basta una única instrucción, que no veremos ahora mismo para evitar que por error la uses (Que os conozco) , ya que antes hay que fijar las condiciones que despertarán a tu ESP32. Para sacar a tu procesador ESP32 del sueño profundo tienes tres formas:

 
  • Un temporizador
  • Un touch Pad
  • Una interrupción externa (ext0 – ext1)    

Por lo que dicen por ahí se pueden mezclar las condiciones del despertar, pero asegúrate de poner al menos una y que se pueda cumplir porque si no tendrás un problema. Y aunque parezca una gansada, tienes que definir la condición del despertar antes que la instrucción de mandarlo a dormir.

Hoy nos vamos a centrar, en hacer un pequeño programa que despierte a nuestro procesador cada tanto tiempo, prefijado de antemano y ya tendremos tiempo de ver el resto.

 

Programando un despertar periódico en el ESP32

 

Bueno, vas a ver que es muy sencillo (Mucho mas de lo que piensas). Lo primero es que basta con pasarle un numero en µs (micro segundos) indicando el tiempo a cabo del cual quieres que despiertes. Como lo normal es que quieras hacerlo cada, digamos minuto, el numero que sale en microsegundos es difícil de contar a ojo por lo que bueno usar un factor de conversión:

#define uS_TO_S_FACTOR 1000000  //Conversion factor for micro seconds to seconds
Ahora podemos establecer el periodo de tiempo que nos interesa en segundos (Y entenderlo)
#define TIME_TO_SLEEP  10        //En segundos

Supón ahora que quiero saber cuántas veces se ha iniciado nuestro equipo. Bastaría con usar una variable que llevara la cuenta, pero hemos insistido en que se apaga todo menos el RTC… y su memoria, por lo que podemos guardas cositas allí, sin mas que darle instrucciones al compilador:

RTC_DATA_ATTR int bootCount = 0;

Como ves es un entero normal pero lleva un atributo por delante que instruye al procesador para que guarde esa variable en la memoria del Reloj. Con esto ya podemos empezar a escribir nuestro programa. Vamos a mandar a dormir nuestro ESP32 a Deep Sleep Mode pero definimos una variable que guarda el numero de despertares que hemos tenido.

 
  • Hay que tener cuidado aquí, no cometer el error de pensar que la memoria del RTC es no volátil, y que puedes usarla como una forma de no grabar en la memoria interna no volátil del tipo FLASH.
  • La memoria del RTC es memoria RAM volátil, aunque permanece alimentada en el proceso de sueño. Pero si reseteas el mico o lo apagas, el contenido se pierde en la nada y no se puede recuperar.
  • Si quieres hacer cosas como guardar registros de lecturas o similares, que necesitas conservar, tienes que usar la memoria FLASH, e incluso puedes hacer un pequeño disco interno con ella. 

Ya podemos ir al setup:

Serial.begin(115200);
delay(1000) ;       //damos tiempo al Serial Monitor
++bootCount ;                   // Incrementar el bootCount
Serial.println("Boot number: " + String(bootCount)) ;  /Imprimir el valor

Es interesante destacar que como ya dijimos, el arranque es como un reinicio y por tanto se ejecuta el setup() en cada reinicio del modo Sleep Mode, y simplemente mandamos imprimir el valor como curiosidad de la variable almacenada en la memoria RAM del RTC.

Tenemos ahora que fijar el plazo de recuperación, antes de llamar a la función que dormirá el micro:

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("El  ESP32 despierta cada: " + String(TIME_TO_SLEEP) + " Seconds");

Fíjate en la primera línea, que simplemente fija cada cuando queremos despertar el ESP32, en micro segundos. Y ya solo queda hacer en tu programa todo lo que quieras (Como leer tus sensores o valores) y dar la orden de dormir:

esp_deep_sleep_start();

Y eso es todo, no ha sido para tanto, ¿No?, El tema de dormir a tu ESP32 es de lo más fácil y es salgo que puedes usar enseguida en tus problemas si necesitas ahorrar baterías. Esta es la muestra de lo que veríamos en la consola:

mensaje al salir del deep sleep mode

Aquí os dejo el programa para que lo descarguéis completo

Contenido solo disponible para suscriptores. ¡Accede al contenido!