Objetivos
Material requerido.
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:
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:
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.
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.[one-fourth] [/one-fourth][three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»] [three-fourth last][margin value=»5″ /][fancy-ul style=»rounded-tick»]
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:
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.
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:
Aquí os dejo el programa para que lo descarguéis completo