¿Por qué es importante el consumo de energía del ESP8266?
El consumo de energía del ESP8266 está entre 15µA y 400mA dependiendo de los diferentes casos de uso.
En estado inactivo con WiFi alimentado, el NodeMCU V2 tiene un consumo de corriente de aproximadamente 70 mA. Con un voltaje de funcionamiento de 3,3 V, un NodeMCU V2 necesita la siguiente potencia en estado inactivo:
W = U * I = 3,3 V * 70 mA = 231 mW
Por lo tanto, el consumo de energía anual para un NodeMCU es: E = W * 365 * 24 = 2.024 kWh
Vivo en Alemania, donde los costes por kWh rondan los 0,34 dólares. Si quiero construir una estación meteorológica con un NodeMCU, tengo costos de electricidad de más de $ 0.7 por año, lo que es casi nada. Entonces, ¿por qué es relevante el consumo de energía cuando los costos son menos de $ 1 por año?
Si desea construir una estación meteorológica al aire libre y hacer funcionar todo el sistema con una batería, debe preocuparse por el consumo de energía. Si compra una batería de litio de 1000 mAh (voltaje de funcionamiento: 3,7 V), ¿cuánto tiempo pasará antes de que necesite cambiar la batería?
T = 1000 mAh / 70 mA = 14,3 h
Por tanto, es necesario cambiar la batería todos los días. No tiene sentido. Además, es solo la teoría de que puede usar toda la energía de la batería. Hay tres influencias principales que reducirán la vida útil teórica de su sistema.
- El ESP8266 necesita una tensión de alimentación mínima de 2,5 V
Durante la descarga, la tensión de alimentación de la batería bajará de 3,7 V a 0 V. Si el voltaje de suministro cae por debajo de 2,5 V, el ESP8266 se apagará y no se volverá a encender. Necesita recargar la batería. Por lo tanto, si la especificación técnica de su batería es de 1000 mAh, nunca utilizará los 1000 mAh completos.
La siguiente imagen muestra la curva de descarga de una batería. Dependiendo de la batería al inicio, vemos una caída gradual de voltaje seguida de una tendencia casi constante en el voltaje. Si se utiliza aproximadamente del 70% al 80% de la capacidad, el voltaje cae significativamente y caerá por debajo del voltaje de funcionamiento del ESP8266.
- El sistema no siempre permanecerá en modo de espera. Deberá ejecutar una tarea de vez en cuando, tal vez cuando la tarjeta necesite enviar datos a un servidor. Por lo tanto, habrá intervalos de tiempo cortos, donde el consumo de energía será alto.
- Cada batería tiene un envejecimiento calendario basado en los productos químicos en la celda y las temperaturas alrededor de la batería, lo que reduce la capacidad utilizable de la batería con el tiempo.
Opciones para extender el tiempo entre la carga de la batería
Tiene dos opciones para extender el tiempo de carga de la batería.
- Compre una batería de mayor capacidad.
- Reduzca el consumo de energía del microcontrolador ESP8266.
1) Suponga que compra una batería de 6000 mAh en lugar de 1000 mAh. Compré una batería de este tipo para mi propia estación meteorológica al aire libre. Extenderá la vida útil del sistema en un factor de 6. Por lo tanto, deberá cambiar la batería cada 89 horas o 3,6 días. Creo que ambos estamos de acuerdo en que el problema de la energía externa no está resuelto. Necesitamos reducir el consumo de energía del ESP8266.
2) Profundicemos en el consumo de energía del ESP8266. El ESP8266 tiene varios modos de espera y soluciones de energía relacionados con estos modos. En total, hay tres modos de suspensión diferentes. La fuente de la siguiente tabla es Manual del productor de ESP8266 Espressif.
RTC: reloj en tiempo real
DTIM: mensaje de indicación de tráfico de entrega
Sueño por módem | Sueño ligero | Sueño profundo | |
---|---|---|---|
Wi-Fi | OFF | OFF | OFF |
Reloj del sistema | ON | OFF | OFF |
RTC | ON | ON | ON |
CPU | ON | Pending | OFF |
Corriente de sustrato | 15 mA | 0,4 mA | 20 µA |
Corriente media DTIM = 1 | 16,2 mA | 1,8 mA | |
Corriente media DTIM = 2 | 15,4 mA | 0,9 mA | |
Corriente media DTIM = 3 | 15,2 mA | 0,55 mA |
Recuerde que estos son valores tomados directamente de la hoja de datos y que no sabemos en qué condiciones se miden estos valores bajos. Así que creé mi propio experimento para comparar los diferentes modos de ahorro de energía. El NodeMCU se alimentó con un voltaje constante de 9V y el WeMos D1 Mini en 6.5V. Los valores absolutos se agregan y, por lo tanto, no tienen una unidad real. Sobre la base de estos valores agregados, se calcula el porcentaje de reducción en el consumo de energía.
Si no desea entrar en detalles, la siguiente tabla muestra los resultados generales para el ESP8266 NodeMCU y el WeMos D1 Mini.
ESP8266 NodeMCU | ESP8266 WeMos D1 Mini | |
---|---|---|
Referencia | 39,58 | 37,81 |
Modem-Sleep | 35,61 (-10,02%) | 27,10 (-28,32%) |
Sueño profundo | 22,03 (-44,34%) | 13,69 (-63,80%) |
El siguiente artículo explica en detalle los diferentes modos de ahorro de energía, así como cómo se implementó y realizó el experimento.
Experimento para medir la influencia de los modos de potencia.
La siguiente tabla le brinda una descripción general de todos los componentes y partes que utilicé para este tutorial.
ESP8266 NodeMCU | Amazon | AliExpress |
ESP8266 WeMos D1 Mini | Amazon | AliExpress |
En este tutorial, también quiero medir el consumo de corriente que se puede ahorrar usando diferentes modos de energía. Entonces creé dos experiencias:
- Mida el consumo de corriente detallado de una iteración en un programa de muestra para obtener una indicación de los pasos en el código del programa que están provocando un alto consumo de corriente.
- Mida el consumo de corriente promedio de varias iteraciones del ejemplo para reducir la influencia de valores atípicos en la medición.
Para este experimento, no solo quiero conocer la influencia de los diferentes modos de energía, sino también la diferencia en el consumo de energía entre ESP8266 NodeMCU y ESP8266 WeMos D1 Mini. Por lo tanto, hice todas las medidas para los dos microcontroladores.
La siguiente imagen muestra el cableado de NodeMCU y WeMos D1 Mini.
Si está utilizando el modo de hibernación, debe conectar D0 con RST en el ESP8266 NodeMCU y también en el ESP8266 WeMos D1 Mini.
En el lado izquierdo de la imagen fritzing, ve el cableado entre el microcontrolador bajo prueba y el módulo del sensor de temperatura y humedad DHT22. El microcontrolador está conectado a través de comunicación UART con un NodeMCU que está conectado a través de USB a la PC para registrar mediciones y obtener energía estable, independientemente del circuito bajo prueba.
Para medir el consumo de corriente, utilizo el sensor de corriente y voltaje INA219, que describo en detalle en el tutorial INA219. El ESP8266 NodeMCU en el lado derecho de la imagen está conectado al INA219 a través de I2C. El INA219 está conectado en serie al microcontrolador bajo prueba y a una fuente de alimentación externa ajustada a 9V para el ESP8266 NodeMCU y a 6.5V para el ESP8266 WeMos D1 Mini.
Modos de alimentación ESP8266 Scripts Arduino
Puede descargar todos los scripts al final de este tutorial con el botón de descarga. La siguiente tabla muestra todos los scripts que están en la carpeta de descarga y cómo combinar los dos scripts que necesita para cada experimento.
Medición del consumo de corriente de la ESP8266 NodeMCU o WeMos D1 Mini durante múltiples ciclos | Medición del consumo de corriente de la ESP8266 NodeMCU o WeMos D1 Mini durante un ciclo en detalle | ||
---|---|---|---|
Medir el consumo de corriente del ESP8266 NodeMCU o WeMos D1 Mini durante un ciclo en detalle | Medir_Corriente_Media | Medir_Corriente_Detalle | |
OR | Experimento de referencia | Referencia_consumidor | Detalles_referencia_consumidor |
O | Influencia del sueño del módem | Sueño_del_módem_del_consumidor | Detalle_del_módem_del_consumidor |
OR | Influencia del sueño profundo | Sueño_profundo | Detalle_del_consumidor |
El primer script que necesita es el script de medición NodeMCU. Este script es el programa Measure_Current_Average si desea medir el consumo de corriente promedio durante varios ciclos del experimento, o Measure_Current_Detail para medir solo en el ciclo del experimento, pero por lo tanto en detalle.
Luego, este script de medición se combina con solo uno de los siguientes tres scripts para NodeMCU o WeMos D1 Mini.
- Experimento de referencia sin usar modos de potencia.
- Influencia de la suspensión del módem para utilizar el modo de energía de la suspensión del módem.
- Influencia del sueño profundo para medir el consumo de energía en el modo de sueño profundo.
Para el programa de ejemplo, estoy usando un script que mide la temperatura y la humedad de un sensor DHT22 cada 10 segundos y envía la medición a través de MQTT a una Raspberry Pi. Si está interesado en el script de ejemplo, escribí un tutorial completo para esto. Ejemplo de MQTT. Por supuesto, puede usar cualquier otro script para comparar la influencia de los modos de energía en el consumo de corriente.
Medida de referencia para ESP8266
La primera medida se realiza sin utilizar un modo de potencia y por tanto la referencia de las siguientes medidas. La siguiente imagen muestra un ciclo de la medición de referencia. El eje y de todas las imágenes no tiene una unidad porque se escala varias veces y, por lo tanto, una unidad no tiene sentido. Pero para comparar la influencia de diferentes modos de potencia, no se necesita ninguna unidad.
Verá que, en general, el WeMos D1 Mini tiene un consumo de corriente más bajo durante un ciclo porque en el estado inactivo hay una brecha entre el NodeMCU y el WeMos. También hay dos momentos diferentes en un ciclo de programa en los que el consumo de corriente alcanza su punto máximo. La primera vez es cuando el microcontrolador configura la conexión WiFi con la Raspberry Pi. Una vez establecida la conexión, el microcontrolador lee los valores del sensor, donde no se necesita alta corriente. Sin embargo, cuando la temperatura y la humedad se envían a través de MQTT a la Raspberry Pi, el consumo de energía aumenta por segunda vez.
Después de la vista detallada de un ciclo, la siguiente imagen muestra el comportamiento de la corriente en 65 ciclos. Cada medida es la suma de la corriente de un ciclo.
La demanda actual de los dos microcontroladores está entre 30 y 50 con algunos valores atípicos. En la imagen que vemos, en la mayoría de los casos el consumo actual del NodeMCU es mayor que el del WeMos D1 Mini. Pero también es posible que WeMos tenga un mayor consumo de energía. Por lo tanto, calculé la corriente promedio por ciclo para los dos microcontroladores con el siguiente resultado:
- Consumo de corriente promedio de NodeMCU: 39.58
- Consumo de corriente medio del WeMos D1 Mini: 37,81
Después de establecer nuestra línea de base, pasamos a los diferentes modos de ahorro de energía del ESP8266. Para el modo módem y el sueño profundo, calculé el consumo de energía promedio y detallado para comparar los diferentes resultados.
Módem-sueño
El ESP8266 accede automáticamente al modo de espera del módem. Además, el disparador de despertador se configura automáticamente. Por lo tanto, no es necesario configurar una interfaz.
Si desea configurar el NodeMCU en Modem-sleep, debe configurar la conexión WiFi a través del modo STA (modo de estación). El modo STA se utiliza para conectar el ESP8266 a una red WiFi establecida por un punto de acceso como un enrutador.
#include "ESP8266WiFi.h" #include "WiFiClient.h" void setup() { Serial.begin(115200); } void loop() { WiFi.mode( WIFI_OFF ); WiFi.forceSleepBegin(); Serial.println("WiFi is down"); delay(20000); WiFi.forceSleepWake(); delay(1); // Bring up the WiFi connection WiFi.mode(WIFI_STA); WiFi.begin("XXX", "XXX"); // Wait until the connection has been confirmed before continuing while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Debugging - Output the IP Address of the ESP8266 Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); delay(2000); }
En el modo de suspensión del módem, el ESP8266 permanece conectado al Wi-Fi actual a través del mecanismo de baliza DTIM.
El mecanismo de la etiqueta DTIM
Las balizas son transmisiones emitidas por el maestro de la red. La transmisión de una baliza es periódica y normalmente se establece en múltiplos de unidades de transmisión (TU). La terminología para la transmisión de balizas es el intervalo de mapa de indicación de tráfico de entrega (DTIM). Este intervalo es un múltiplo del intervalo de transmisión de la baliza base.
Por ejemplo: si el intervalo de transmisión de la baliza base es 100 ms y el intervalo DTIM es 2, entonces cada segunda baliza es una baliza DTIM. Cada baliza tiene un contador regresivo (Beacon DTIM cnt) en cada transmisión de baliza. Mientras el contador está contando hasta cero, el ESP8266 está en modo de espera del módem. Si el contador tiene un valor de 0, es la etiqueta DTIM y el ESP8266 activa el WiFi para recibir datos.
El intervalo DTIM también puede ser superior a 2. Cuanto mayor sea el intervalo DTIM, más tiempo permanece el ESO8266 en modo de espera del módem y ahorra energía.
Medición de corriente en espera del módem
Una vez que sepamos cómo funciona la función de energía en espera del módem, queremos saber cómo el modo de ahorro de energía influye en el consumo de corriente en el experimento. La siguiente imagen muestra los detalles de una ejecución en el experimento MQTT.
En comparación con la medición de la línea de base, vemos que también hay picos de corriente de hasta casi 200, porque la función de espera del módem no puede influir en el consumo de energía requerido para conectar el microcontrolador a la red WiFi o para transferir datos del sensor a través de MQTT a la Raspberry Pi.
Pero lo que vemos es que cuando se envían los datos, el WiFi del microcontrolador se apaga y por tanto el consumo de corriente se reduce en 75 en la medida de referencia a 25.
El hecho de que el consumo total de energía se reduce también es claramente visible en la siguiente imagen, que muestra la medición de varios ciclos para la función de reposo del módem frente a la medición de referencia.
Si comparamos el consumo de corriente del ESP8266 NodeMCU con el del WeMos D1 Mini, vemos que el WeMos consume menos energía en el modo de espera de módem con un promedio de 27,10 a 35,61 para el NodeMCU. Por lo tanto, si queremos maximizar la vida útil de una experiencia con batería, vemos una influencia positiva al usar el modo de suspensión del módem.
Sueño ligero
El modo de suspensión ligero es bastante similar al modo de suspensión del módem. Las únicas dos diferencias son:
- Potencias del reloj del sistema ESP8266
- El procesador interno está suspendido
Por lo tanto, la tarjeta no responderá a señales e interrupciones de otras interfaces de hardware. El ESP8266 necesita reactivarse desde un GPIO externo. El proceso de activación tarda menos de 3 ms. La interfaz para reactivar el ESP8266 por GPIO es: void gpio_pin_wakeup_enable (uint32 i, GPIO_INT_TYPE intr_state);- uint32 i: número de serie de E / S de la función de activación.
- GPIO_INT_TYPE intr_state: el modo de activación de activación: GPIO_PIN_INTR_LOLEVEL o GPIO_PIN_INTR_HILEVEL
Estas dos diferencias dan como resultado una fuerte caída en el consumo de 15 mA a 0,4 mA.
GPIO16 no se puede utilizar como línea de activación porque GPIO16 está reservado como línea de activación para el modo de suspensión profunda.
El siguiente ejemplo conectará y desconectará NodeMCU a WiFi local y establecerá el modo de suspensión en suspensión ligera.
void setup() { Serial.begin(115200); } void loop() { // Disable light sleep wifi_set_sleep_type(NONE_SLEEP_T); delay(2000); // Enable light sleep wifi_set_sleep_type(LIGHT_SLEEP_T); delay(2000); }
Sueño profundo
Si desea utilizar una fuente de alimentación externa y ahorrar la mayor cantidad de energía posible, elija el modo de suspensión profunda. El consumo de energía del ESP8266 se reduce en teoría a 20µA * 3.3V = 66µW. Su banco de energía con 1000 mAh durará mucho más.
T = 1000mAh / 20µA = 50,000h = 2083 días = 5.7 años (tenga en cuenta que esta vida útil no se puede utilizar debido a las tres influencias principales que reducirán la vida útil teórica de su sistema)
A diferencia de los otros dos modos, el sistema no puede entrar automáticamente en hibernación. Los usuarios pueden llamar a la función de la interfaz system_deep_sleep para habilitar inmediatamente el sueño profundo. En esto modo, el chip apagará la conectividad Wi-Fi y la conexión de datos; sólo el módulo RTC sigue funcionando, responsable de las activaciones periódicas.
Para activar la hibernación, todo lo que tiene que hacer es usar la siguiente línea de código: ESP.deepSleep (uint32 time_in_us); donde establece una hora en la que el ESP8266 se despertará del modo de suspensión profunda. La duración máxima del sueño profundo es 4.294.967.295 µs, o aproximadamente 71 minutos.
Después del tiempo establecido, el ESP8266 se despertará mediante un pulso de reinicio desde el pin D0 (GPIO16), que se define como la línea de activación. Por lo tanto, debe conectar físicamente D0 con RST.
Las siguientes dos imágenes muestran cómo conectar el pin D0 con RST para activar el microcontrolador ESP8266 NodeMCU y WeMos D1 Mini después de la fase de sueño profundo.
Medición de la corriente de sueño profundo
Debido a que, en teoría, el modo de suspensión profunda del ESP8266 es el modo en el que el microcontrolador tiene el menor consumo de energía, queremos saber qué tan bajo es el consumo de energía en comparación con el ejemplo de referencia.
La siguiente imagen muestra nuevamente un ciclo de la experiencia en detalle. Al igual que en el modo de espera del módem, el consumo de energía, cuando el microcontrolador establece la conexión WiFi y envía las medidas, no se reduce, pero cuando el ESP8266 entra en modo de hibernación, el consumo de corriente cae a valores aún más bajos en comparación con el módem. Dormir más.
Cuando comparamos varias ejecuciones del experimento, vemos el mismo resultado.
¿Cuánto reduce el sueño profundo el consumo de corriente?
El modo de hibernación reduce el consumo de energía del ESP8266 en un 44% para el NodeMCU y un 64% para el WeMos D1 Mini en comparación con el uso del modo sin energía. Por lo tanto, si tiene un proyecto que depende de la duración de la batería, usar el modo de suspensión profunda es esencial.
Lo importante es que en el experimento, el microcontrolador entra en modo de suspensión solo durante 10 segundos, luego continúa la función de bucle con el siguiente ciclo. En un proyecto de Word real, por ejemplo, una estación meteorológica al aire libre, el tiempo de reposo sería de varios minutos, no de segundos. Por lo tanto, la influencia del modo de sueño profundo sería aún mayor, lo que resultaría en un consumo de corriente mucho menor.
El segundo hecho importante en la imagen de arriba es que, nuevamente, el WeMos consume casi la mitad de energía en el modo de suspensión profunda en comparación con el NodeMCU. En mi opinión, está claro que WeMos usa menos energía porque todo el microcontrolador es más pequeño con menos partes que requieren energía.
Conclusión
En este artículo, aprendió cómo extender la vida de su proyecto alimentado por batería con el modo de hibernación. Si está planeando hacer un proyecto con batería, le recomendaría un WeMos D1 Mini en combinación con el modo de ahorro de energía de espera profunda. La siguiente imagen muestra el consumo de corriente de varios ciclos para todos los modos de potencia probados y la medición de referencia.
Con el siguiente botón puedes descargar los scripts de Arduino que utilizo para los diferentes experimentos. Cuando haces clic en el botón, descargas todos los archivos en una carpeta zip.
Haga clic aquí para descargar todos los archivos para la experiencia de los modos de energía
Espero que hayas disfrutado de la lectura y uses el modo de sueño profundo en tu proyecto actual o próximo. ¿Ha utilizado alguna vez una fuente de alimentación externa para alguno de sus proyectos? ¿Cuál es su próximo proyecto y utilizará el modo de suspensión profunda? Házmelo saber y escribe en los comentarios.
Además, si tiene alguna pregunta sobre los modos de ahorro de energía, use la sección de comentarios a continuación para hacer su pregunta. Les responderé lo antes posible.