Conceptos básicos ESP8266 - Ahorro de Energía

Publicado por Loli Diéguez en

Para los proyectos alimentados con baterías, un dispositivo con bajo consumo de energía es imprescindible. Y el ESP8266 te puede ayudar con esto, usando DeepSleep.

Te cuento como usar el ESP8266 para un consumo mínimo de energía.

1. Elige la placa ESP8266 adecuada.

Quieres que tu placa ESP sea lo más ajustada posible en cuanto a consumo de energía. No hay mas componentes hambrientos de energía como el chip FTDI o los LED. 

Por ellos, este requisito de no usar LEDs o FTDI excluye la mayoría de los módulos como Wemos D1 mini o NodeMCU y solo deja los chips sencillos al estilo de ESP-03, ESP-04 y ESP12 en una placa portadora.

Sin embargo, el ESP12 es el más fácil, ya que el ESP-03 y el ESP-04, por ejemplo, no tienen el pin GPIO16 o RST roto en un conector lateral, sino en una almohadilla en el PCB. 

El ESP M2 y el ESP M3 también se pueden usar, ya que tienen gpio16 roto.
El ESP8266-01 sería perfecto después de quitar el LED, pero no tiene el pin DO / GPIO16 roto. Si quieres, puedes intentar soldar un cable en el pin GPIO16.

Plano donde soldar el cable en el pin GPIO16

 

2. Elige el regulador de voltaje correcto.

Si estás utilizando 2 pilas AA de 1,5 V (poco probable), puedes arreglártelas sin un regulador, pero si, por ejemplo, utiliza 3 NiCd-s de 1,2 V o un Lipo de 3,7 (que pueden subir hasta 4,2 voltios) , necesitarás un regulador. 

Los posibles candidatos serían:

Escribe Corriente de reposo Caída de voltaje Voltaje de entrada máximo Salida máxima Paquete
Torex XC6206 1uA 160 mV a 100 mA 6 voltios 200 mA SOT23-3, SOT89, USP-6B
Analog Devices LTC3525-3.3 7uA Step up convertidor 6 voltios 60 mA a 3,3 V desde una entrada de 1 V o 140 mA a 3,3 V desde una entrada de 1,8 V  
Holtek HT7333 4uA 90 mV a 40 mA 12V 250 mA SOT89, TO92
Holtek HT7833 4uA 360 mV a 500 mA 8,5 V 500 mA SOT89, TO92
ME6211 40uA 100 mV a 100 mA 6,5 V 300-500mA SOT23, SOT89
SPX3819M5 90uA 340 mV a plena carga 16 V 800 mA SOT23-5, SOIC8, DFN8
Microchip MCP1700 1.6uA 178 mV a 250 mA 6V 250 mA SOT23, SOT89, TO92
Microchip MCP1825 120uA 210 mV a 500 mA 6V 500 mA SOT23, SOT89, TO92
Microchip MCP1826 0,1-220uA 250 mV a 1000 mA 6,5 V 1000 mA SOT23, SOT89, TO92
LT-1763 30uA 300 mV 20V 500 mA S8
TPS783xx 500nA 130-175mV 6V 150 mA SOT5
TLF80511TFV33 38uA 100 mV a 100 mA 45V 400 mA PG-TO252-3
MCP1825S33 0.1uA 210 mV a 500 mA 6V 500 mA SOT223-5, DDPAK-5. TO220-5

 

El problema aquí es que muchos de los LDO que tienen una corriente de reposo muy baja, también tienen una corriente de salida que está al borde de lo que necesita el ESP8266 al inicio. 

El MCP1700 y el HT7333 se recomiendan a menudo, pero realmente están al borde de lo que necesita un ESP8266 en el uso actual de WiFi. Si la caída de 90 mV del HT7333 es importante para ti, considera agregar un capacitor robusto.

Honestamente, te aconsejaría contra el uso de cualquier regulador que dé menos de 300mA.

Aparentemente, es posible utilizar dos chips HT7333 en paralelo. El HT7833 parece una opción bastante buena . Por lo general, necesitas un elco de 1uF en la entrada y un elco de 2.2uF en la salida para ser estable. Por supuesto, un valor más alto es una buena idea.

El ME6211 se usa en la mini placa Wemos D1 (lo que no significa que sea la mejor opción para baja caída). Lo mismo ocurre con el SPX3819M5 en Lolin NodeMCU.

3. Elige la conexión a Internet correcta

A menudo elegimos una conexión DHCP por defecto. Por lo general, una conexión DHCP tarda más en establecerse que una conexión IP estática. Por lo tanto, es mejor optar por lo último. Con el ESP es simplemente una cuestión de proporcionar los siguientes detalles (fíjate, los IPnrs son solo un ejemplo).

// IP estatica
IPAddress  ip ( 192 ,  168 , 1 , 35 ); //
IPAddress dns (192.168.1.1);
Puerta de  enlace IPAddress ( 192 ,  168 ,  1 ,  1 );  // 
Subred de dirección IP  ( 255 , 255 , 255 , 0 ); // este es bastante estándar    
y luego hacemos la conexión con
WiFi.config (ip, dns, puerta de enlace, subred);
WiFi.begin (WLAN_SSID, WLAN_PASSWD);

Esto no es lo único que podemos hacer al establecer la conexión. Podemos intentar sortear algunas rarezas que muestra el ESP8266 al conectarse a la red WiFi: el ESP8266 mantiene la información de conexión de red para que parpadee y luego la vuelve a leer la próxima vez que inicie la función WiFi. Hace esto cada vez, y toma al menos 1.2 segundos. El chip hace esto incluso cuando pasa información de conexión a WiFi.begin (), como:

WiFi.begin( WLAN_SSID, WLAN_PASSWD );

Esto realmente cargará la información de conexión desde la memoria flash, la ignorará y usará los valores que especifique en su lugar, se conectará al WiFi y finalmente volverá a escribir sus valores en la memoria flash.

Podemos desactivar eso con el comando WiFi.persistent( false )

Sin embargo, podemos hacer más para ahorrar tiempo. 

El comando Wifi.begin (SSID, PASSWORD) busca la red adecuada entre las anunciadas. Es posible proporcionar un número de canal WiFi y un BSSID al comando WiFi.begin () que elimina la necesidad de escanear.

El ESP no conoce el número de canal o BSSID, por lo que debemos leer esa información de la primera conexión, almacenarla y enviarla en la siguiente conexión. Para esto, necesitamos reemplazar Wifi.begin (); declaración con un fragmento de código que recupera y administra la información necesaria. Afortunadamente, existe tal código disponible.

Comenzamos definiendo una estructura:

Una estructura alias. struct es una forma de agrupar variables, posiblemente de diferentes tipos. Se pueden tener varias instancias de una estructura declarada. Las variables dentro de una estructura se denominan miembros.

Definimos la siguiente estructura:

struct { uint32_t crc32 ; // 4 bytes canal uint8_t ; // 1 byte, 5 en total uint8_t ap_mac [ 6 ]; // 6 bytes, 11 en total uint8_t padding ; // 1 byte, 12 en total } rtcData ;

Haremos una suma de comprobación CRC para ver si los datos que usamos se corrompieron. Usamos 1 bte para el canal y 6 bytes para la información del punto de acceso.

Agregamos un byte superfluo para llegar a un múltiplo de 4. ( aquí hay más información sobre el almacenamiento de datos en la memoria rtc ).

Luego, al conectarnos, hacemos algunas comprobaciones:
  • ¿Son correctos los datos de CRC? Si no es así, realiza una conexión normal.
  • Si después de 100 intentos no funciona, reseteamos el WiFi y vamos a hacer una conexión normal.
  • Si después de 600 intentos todavía no hay conexión, ponemos el ESP8266 en reposo y lo intentamos más tarde de nuevo.

Necesitamos una rutina para hacer la verificación CRC, pero eso se hace fácilmente. Una vez que realizamos la conexión WiFi, podemos conectarnos a donde necesitamos ir, por ejemplo: un broker MQTT o hacer una solicitud HTTP.

4. Asegúrate de no conectarte a WiFi antes de que sea necesario.

Sin embargo, es importante establecer la conexión en el momento adecuado. No querrás desperdiciar energía en tu señal de 2,4 GHz cuando todavía estás leyendo sensores. Tal como está, el ESP8266 ya tiene su radio encendida por defecto.

Entonces, lo primero que debemos hacer al despertarnos es apagar la radio.

Lo hacemos así:

void setup () {  // deshabilita WiFi, procedente de DeepSleep, ya que no lo necesitamos de inmediato WiFi . modo ( WIFI_OFF ); WiFi . forceSleepBegin (); retraso ( 1 );

Dejamos que el programa haga lo que tiene que hacer, como leer sensores, y solo entonces comenzamos a pensar en hacer la conexión WiFi. 

Por supuesto, primero debemos encender el módem / radio y lo hacemos con:

// Vuelve a encender la radio
WiFi.forceSleepWake ();
retraso (1);

Esto nos lleva casi al final de lo que tenemos que hacer, en cuanto al software:

  1. Apagamos la radio
  2. Leemos los sensores
  3. Encendemos la radio
  4. Intentamos hacer una conexión rápida y, si es necesario, una conexión regular
  5. Luego nos conectamos a donde queremos ir (Thingspeak, MQTTbroker, lo que sea)
  6. Y finalmente es el momento de poner el ESP8266 en DeepSleep.

5. Poner el ESP8266 en DeepSleep.

La forma más simple de un programa DeepSleep es hacer las cosas que necesitas hacer (leer los sensores y hacer conexiones) y luego llamar a la funcion para poner la placa a dormir. 

Sin embargo, podemos hacer mas. ¿Recuerdas que dije que el despertar la radio está encendida por defecto? Bueno, podemos darle al ESP8266 una instrucción de activación para que sepa qué hacer cuando se despierta. Ya podemos decirle al ESP8266 que NO debe encender la radio por defecto. 

Esto lo hacemos de la siguiente manera:

ESP.deepSleep(SLEEPTIME)

ESP.deepSleep(SLEEPTIME, WAKE_RF_DISABLED);

Sé que en un paso anterior comenzamos apagando la radio y ese paso ya no sería necesario una vez que usamos la instrucción de activación, pero lo dejé de todos modos, solo para asegurarme, como ilustración. Sin embargo, puede optar por omitirlo.

A decir verdad, hay un código un poco más basico. Por ejemplo, no es realmente necesario apagar el WiFi inmediatamente antes de DeepSleep.

Ahora solo queda una cosa: ¿Cuánto tiempo dejaremos en reposo el ESP8266?

Eso, por supuesto, es una decisión muy personal, pero veamos cuánto tiempo podemos poner el ESP a dormir.

El DeepSleep máximo utilizado puede ser un máximo de 71 minutos. Eso fue simplemente porque el parametro system_deep_sleep se definió como un entero de 32 bits sin signo. El valor máximo de un entero sin signo de 32 bits es 0xFFFFFFFF, es decir, 71 min.

Desde el núcleo 2.4.1, es un entero sin signo de 64 bytes. Esto equivale a 5,124,095,576 horas o aproximadamente medio millón de años. Nadie quiere esperar tanto tiempo, así que Expressif parece haber limitado eso a unas 3,5 horas.

Este número limitado se define en el parámetro ESP.deepSleep (Max). Entonces, cuando definí mi llamada de DeepSleep como ESP.deepSleep(ESP.deepSleepMax(),WAKE_RF_DISABLED );,

 

Vas a encontrar un programa DeepSleep como el explicado aquí. Lo único que necesitas agregar además de tus credenciales web es algún código para leer tus sensores y algún código para enviar tus datos a donde deseas almacenarlos (por ejemplo, Thingspeak o tu propio servidor web).

6. Piensa en tus sensores

Tus sensores también usan energía, incluso cuando tu ESP8266 está durmiendo. 

Quizás hay un sensor que hace lo mismo que otro sensor, pero usa menos energía. Considera alimentar los sensores desde un pin gpio que cambie a BAJO cuando el sensor no se use. 

Ten en cuenta que algunos sensores necesitan un tiempo de calentamiento o asentamiento. Si lo hace, asegúrate de que tu sensor no consuma más de lo que un pin ESP8266 puede entregar (12 mA).

Un 'sensor' muy popular en proyectos alimentados por batería es la medición del voltaje de la batería. Como el ADC del ESP8266 solo sube a 1 voltio, es necesaria alguna forma de divisor de voltaje de resistencia. Esto significa un consumo constante de la batería, por lo que es mejor elegir valores altos para el divisor.

Si usas un divisor de 420k, estaría consumiendo constantemente 10uA con una batería llena. Puede que no parezca mucho, pero también es lo que usa todo tu ESP8266 en el DeepSleep. 

Si no utilizas un regulador de potencia, por ejemplo, cuando utilizas 2 baterías de 1,5 voltios, es mejor utilizar la medición interna de Vcc. 

Haz esto con:

ADC_MODE(ADC_VCC);
float vccVolt = ESP.getVcc()/1024.0F;

Otra posibilidad es apagar el divisor de voltaje con un p-FET. La idea es poner corriente al divisor de voltaje solo cuando sea necesario. Podemos hacer eso con un circuito como este:

Circuito 

A través de un “HIGH” en la entrada del circuito, el BC547 conducirá y bajará la compuerta del p-FET. El P-FET se abrirá y permitirá que haya voltaje en el divisor de voltaje. Después de la medición, la entrada debe colocarse en “LOW”, lo que bloqueará cualquier corriente que pase a través del divisor de voltaje.

Tal como está, el (3.3-0.6) /1000=2.4mA, SÓLO cuando el pasador está HIGH. Es posible aumentar la resistencia base: la corriente que pasa por el colector será aproximadamente 3.3 / 10.000 = 33uA. con un hFE de aproximadamente 100, la corriente a través de la base solo necesitaría ser 0.33uA, por lo que lo más probable es que una resistencia de base de 68k aún esté bien. 

El FET debe ser de un tipo con un RDSon bajo y un Vgs de alrededor de -2-3 Voltios (recuerde que el Vgs (th) es cuando el Fet comienza a conducir, aún sin alcanzar la máxima potencia). 

Los valores elegidos para las resistencias son bastante "seguros". Sin embargo, también consumirán energía. Es posible utilizar un valor más alto. Haz que el 10k sea 100k y podrías hacer que el 1k sea incluso 1Mohm, siempre que el transistor tenga un hFE decente.

La desventaja de usar una resistencia de compuerta de 100k es que el tiempo de apagado toma un poco más de tiempo. Un P-FET adecuado podría ser el NDX2301 , eso es un montaje en superficie. Tiene un Vgs de 1,8 voltios. Ni siquiera necesitarás el controlador de transistor frente a él.

Gráfico

Otra posibilidad es dar a los sensores su propio regulador de voltaje, que puede ser apagado por el ESP8266. 

El SPX3819 puede ser adecuado. Conecta un pin GPIO al pin ENABLE del regulador. Un HIGH (<= 0.25V) lo encenderá, un LOW lo apagará. Asegúrate de que el regulador de voltaje tenga una corriente de reposo más baja que los periféricos que está cambiando con él (el SPX3819 tiene una corriente de reposo de 90uA, una entrada máxima de 16V, una caída de voltaje de 340mV y una corriente máxima de 800mA). 

Algo similar se puede hacer con el ME6211 (corriente de reposo 40uA).

Grafico SPX3819

La conmutación del lado alto también se puede obtener mediante un transistor PNP, así:

2N3906

De acuerdo con alguna documentación de expressif más antigua, el estado de los pines gpio se mantiene en DeepSleep pero solo puede manejar 2uA. Sin embargo, no está claro en la versión actualizada , diciendo que el estado de los pines en DeepSleep ya no está definido (tabla 1-1), aunque luego parece contradecirse (página 5/9).

Cuando lo medí. Siempre encontré el mismo estado de mis pines durante el DeepSleep, independientemente de si estaban ALTO o BAJO antes del DeepSleep. El estado era el siguiente:

  • D0 0V
  • D1 0V
  • D2 0V
  • D3 1V68
  • D4 3v3
  • D5 3v3
  • D6 3v3
  • D7 3v3
  • D8 3v3

Por supuesto, de algunos pines esto es de esperar (D0, D3, D8) pero esperaba que D8 (GPIO15) fuera LOW. Sin embargo, los resultados nos enseñan que si deseas alimentar un sensor con conmutación HighSide a través de un transistor p-FET o PNP, será mejor que uses los pines D4-D7 para cerrarlo durante el DeepSleep.

Algunos sensores, como el BME280 , se pueden programar para dormir entre mediciones. Para el BME280, este es el 'Modo forzado' si luego tiene una lectura de 1 / min (Bosch lo llama el 'estado de monitoreo del clima'), el consumo de energía es 0.16uA. El uso del modo forzado también es una buena manera de prevenir o limitar el calentamiento interno del chip, que daría lecturas sesgadas.

Un ADC como el PCF8591 tiene un uso de corriente relativamente bajo en 'standbye' como Vin, igual a Vss o Vdd, lo que no es posible in situ.

El DHT11 tiene una corriente de funcionamiento: 0.3mA (medición) y 60uA (en espera), ya que 60uA todavía es bastante alto, cortar la alimentación sería mejor. En ese caso, sin embargo, el DHT11 necesita un período de calentamiento de 1 segundo. 

El HTU21D es una mejor opción con una corriente de suspensión de 0.14uA.

7. ¿Necesitas enviar tus valores?

En lugar de enviar cada medición cuando se realiza, puedes optar por almacenar los resultados en la memoria RTC / SPIFFS y enviarlos solo una vez al día, o puedes decidir que si un nuevo resultado de medición está dentro del 5% de la lectura anterior, no es necesario enviarlo. Si estás cansado del desgaste de la RAM, puedes agregar algo de FRAM, por ejemplo, el MB85RS64V (8k, Corriente de operación 1.5 mA. Corriente de espera 10 μA) o MB85RC256V (32K, Corriente de operación 200μA. Corriente de espera 27uA).

8. Elige sabiamente tus baterías.

Una vez que llegue a los niveles de uA, la autodescarga de las baterías se convierte en un factor competitivo importante.

Nick Gammon afirma la siguiente autodescarga para varias baterías:

Escribe Capacidad mAH Descarga% / mes Autodescarga (uA)
CR1212 (3 V) 18 1 0,250
CR1620 (3 V) 68 1 0,950
CR2032 (3 V) 210 1 3
NiCD AAA (1,2 V) 350 20 98
NiMH AAA (1,2 V) 900 30 375
NiCd AA (1,2 V) 1000 20 270
AAA alcalina (1,5 V) 1250 2 35
NiMH AA (1,2 V) 2400 30 1000
AA alcalino (1,5 V) 2890 2 80
Iones de litio (3,7 V) 4400 10 600

 

Vale la pena considerar el LiFePO 4 ya que su voltaje máximo es de 3.6 voltios y su voltaje nominal de 3.2 voltios con una curva de descarga muy plana. Se podría optar por usarlos sin un regulador de voltaje.

Reducción adicional de energía

La documentación de Expressif menciona otras 8 formas de reducir la energía en el capítulo 4.5.

Conexión de D0 / GPIO16 a RST

Para que funcione el pulso de activación, es necesario conectar D0 a RST. El inconveniente de esto, es que debes eliminar ese enlace cuando desees actualizar el ESP8266. 

Algunas personas aconsejan conectar los pines a través de una resistencia. Sin embargo, eso tiene resultados mixtos. Una mejor manera es usar un diodo Skottky , por ejemplo, un 1N5819 , con el cátodo en el pin gpio16 / D0 y el ánodo en el pin RST.

 

Ahora ya sabes todo lo necesario para montar tu propio sensor con un consumo de energía mínimo.

 

SI QUIERES MAS ARTICULOS SIGUE POR AQUI

 


Compartir esta publicación



← Publicación más antigua Publicación más reciente →