Estación meteorológica WIFI. Arduino + ESP8266-01 + ThingsPeak.com | Hardware
Índice
- Estación meteorológica WIFI |Introducción
- ⇒ Estación meteorológica WIFI | Hardware
- Estación meteorológica WIFI | Módulo ESP8266-01
- Estación meteorológica WIFI | Software
En esta entrada vamos a analizar todos lo componentes hardware necesarios para construir y programa una estación meteorología autónoma con Arduino + ESP8266-01 + ThingsPeak.com utilizando una batería y una placa solar. Como sabéis, el objetivo es que el sistema sea capaz de estar en funcionamiento todos los días del año de forma autónoma, enviando datos una vez cada 5 minutos. El sistema hará registros de la temperatura, humedad, presión atmosférica y tensión de batería y enviará esta información vía WIFI para publicarlos en la plataforma ThingSpeak.com periódicamente para su visualización desde nuestro PC o teléfono móvil. También utilizaremos un pequeño display OLED para visualizar las variables cuando lo necesitemos. ¡Adelante! 🙂
Material necesario
Componente | Cantidad | Comprar |
Arduino Nano | 1 | Comprar en Amazon |
Barómetro BMP280 | 1 | Comprar en Amazon |
Sensor humedad + temp. DHT11 | 1 | Comprar en Amazon |
ESP8266-01 WIFI | 1 | Comprar en Amazon |
Pantalla OLED 0.96′ | 1 | Comprar en Amazon |
Placa solar | 1 | Comprar en Amazon |
Batería 3.7V 3000mAh | 1 | Comprar en Amazon |
Cargador de baterías TP4056 | 1 | Comprar en Amazon |
DC-DC step up 5V | 1 | Comprar en Amazon |
Mosfet NDP6020P | 2 | Comprar en Amazon |
Transistor 2N3904 | 2 | Comprar en Amazon |
Regulador LM1117-3.3V 0.8A | 1 | Comprar en Amazon |
Diodo 1N5817 | 2 | Comprar en Amazon |
Kir resistencias | 1 | Comprar en Amazon |
Cabezal hembra 2.54mm | 1 | Comprar en Amazon |
Botón manual | 1 | Comprar en Amazon |
Switch manual | 2 | Comprar en Amazon |
Placa de soldadura | 1 | Comprar en Amazon |
Caja IP65 | 1 | Comprar en Amazon |
Montaje hardware componentes principales
La siguiente imagen muestra el esquema de montaje de los componentes que utilizaremos en el estación meteorológica. El esquema se puede dividir en dos partes principales:
- Electrónica de potencia: se compone de todos los componentes encargados de alimentar la electrónica de control. La luz solar es transformada en energía eléctrica por la placa solar, que es almacenada en la batería de 3.7V de forma controlada por el cargador TP4056. El convertidor DC-DC eleva la tensión de batería a 5V constantes (la tensión de la batería oscila entre 4.2V y 3V en función de su nivel de carga).
- Electrónica de control: esta electrónica es la encargada de hacer lecturas ambientales mediante los sensores que incorpora el equipo, y subirlas a la red. Se compone de la placa Arduino, los sensores, el módulo WIFI ESP8266-01, y de toda la electrónica de control.
Ademas de esto, el equipo cuenta con un sistema de protección de batería como veremos mas adelante. Para ello utilizaremos un MOSFET y un transistor.
Los dos interruptores S1 y S2 que veis en linea discontinua sirven para alimentar diferentes partes de equipo de forma independiente, como veréis mas adelante, nos ahorran mucho trabajo.
Montaje hardware ESP8266-01
El módulo ESP8266-01 es un módulo WIFI permite conectarnos a nuestra red inalámbrica domestica y subir datos a la red.
Antes de nada es importante saber que el módulo ESP8266-01 es un módulo programable al que vamos a cargar software utilizando el IDE de Arduino. Afortunadamente, este módulo entiende el lenguaje de Arduino, por lo que cargaremos software utilizando el mismo lenguaje de programación y el propio IDE de Arduino. Para este proyecto, será necesario cargar un software a la placa Arduino, para leer los sensores, gestionar los MOSFET, leer la tensión de batería, enviar los datos… pero también cargaremos un software al módulo ESP8266-01, donde este ‘escuchará’ a la placa Arduino, y una vez recibidos las variables de los sensores, los publicará en la web ThingSpeak.com.
La labor del software que cargaremos en el módulo WIFI será la siguiente:
- Recibir las lecturas que envía la placa Arduino a través de sus pines D10 y D11 (SoftwareSerial.h)
- Subir estas variables a la web ThingSpeak.com
La conexión del módulo ESP8266-01 con la placa Arduino es algo mas compleja, ya que el cableado necesario para cargar software y el necesario para ejecutarlo es algo diferente. Ademas de esto, para cargar software al módulo WIFI utilizaremos los pines RX y TX de la placa Arduino, mientras que en funcionamiento normal, para enviar las lecturas de los sensores desde la placa Arduino al módulo WIFI utilizaremos la librería SoftwareSerial.h y los pines D10 y D11. Lo veremos en detalle en la entrada dedica a este módulo.
Por lo tanto, para cargar software al módulo ESP8266-01 utilizaremos los pines TX y RX de la placa Arduino, y el mismo lenguaje y entorno de programación que en Arduino:
Pero en funcionamiento normal, una vez cargado el software al módulo WIFI, utilizaremos los pines D10 y D11 como canal serie (librería SoftwareSerial.h) para comunicar la placa Arduino con el módulo WIFI y recibir por parte de este las lecturas de los sensores que haya que subir a ThingsPeak.com:
Como veis, la necesidad de modificar el conexionado para cargar software y para ejecutarlo hace que haya que buscar una solución fácil para hacer el intercambio de forma sencilla. La solución que he escogido para poder cargar software de forma sencilla es la siguiente. No soldaremos el módulo WIFI directamente a la placa de soldadura, lo conectaremos a través de un conector 4×2 hembra como el de la imagen, de forma que podamos conectar/desconectar el módulo de forma simple. Ademas de esto, utilizaremos otro conector 4×1 hembra donde sacaremos las siguientes cuatro señales: RX, TX, GND, +3.3V de la salida del regulador necesarias para la carga de software. Con estos dos simple conectores, ahorraremos mucho tiempo y dolores de cabeza mas adelante:
De esta forma, cuando conectemos el módulo al conector 4×2 para su funcionamiento normal, este quedará conectado a los pines D10 y D11, mientras que si queremos cargar software, lo podremos hacer de forma sencilla desconectando el módulo y utilizando las señales del conector 4×1 y cable macho hembra.
Calcular el consumo del sistema
A continuación, vamos a calcular cuanta corriente consumirá todo el sistema para poder dimensionar y seleccionar la batería y la placa solar de forma correcta, de forma que el sistema esté en funcionamiento todos los días del año de forma autónoma. Para ello, hay que revisar el datasheet de cada componente y anotar el consumo de funcionamiento que tiene cada uno:
- Arduino Nano: 15mA en modo normal. 5mA en modo bajo consumo. ¡90uA en modo ultra-bajo consumo!
- BMP280: 1mA pico. En funcionamiento normal no llega a 12uA.
- DHT11: 2.5mA.
- OLED 0.96: 10mA máximo. Solo se activará cuando presionemos el botón.
- WIFI ESP8266-01: pico de 250mA. 100mA durante la transmisión. 80mA solo alimentándolo. 80uA en modo ‘Deed Sleep’ (requiere una pequeña modificación en el hardware).
La placa Arduino consume unos 15mA de forma continua cuando está encendido (simplemente conectándolo). Tened en cuenta que la placa Arduino únicamente trabaja durante unos pocos segundos cada 5 minutos. El resto del tiempo el sistema no hará nada, de ahí la importancia de reducir el consumo durante estos periodos de tiempo.
Como veremos en la entrada dedicada a la parte software de la estación meteorológica, para reducir este consumo lo máximo posible entre muestra y muestra utilizaremos la librería LowPower.h, reduciendo el consumo entre muestras de 15mA a 5mA. Si ademas aplicamos unas pequeñas modificaciones hardware, ¡el consumo cae hasta los 90uA!
Otro componente energéticamente muy exigente es el módulo WIFI ESP8266-01. Para ello, me he decantado por utilizar un MOSFET de desconexión como el de la imagen, que permite conectar/desconectar el módulo con una salida digital, reduciendo el consumo a 0mA de forma sencilla. Además de desconectar el módulo, también he utilizado el mismo MOSFET para desconectar la batería del sistema y evitar que se descargue a niveles que podrían dañar el componente.
El consumo total de energía durante una hora quedaría de la siguiente forma. Para simplificar las cosas, tomaremos los valores de consumo en régimen permanente, olvidándonos por el momento de los consumos pico, ya que estos solo se dan en el instante inicial y en intervalos muy cortos:
- Cuando está activo: 15mA (Placa Arduino) + 80mA (WIFI) + 2.6mA (sensores) + 2mA (OLED): 100mA aprox.
- Cuando está inactivo: 5mA (Placa Arduino) + 0A (WIFI) + 15uA (Sensores) + 2mA (OLED): 8mA aprox.
Con la configuración actual, el sistema hace una lectura y publica los datos en ThingSpeak.com cada 5 minutos. El proceso de leer los sensores, conectarse a la red WIFI y publicar las lecturas de los sensores lleva aproximadamente 10 segundos. Por lo tanto, el sistema estará activo durante 120s cada hora, y 3480 segundos inactivo, de ahí la importancia de reducir al máximo el consumo de corriente en estos periodos.
El consumo medio de energía durante una hora será de 100mA*120s/3600s + 8mA*3480s/3600s = 11mAh. Por seguridad, vamos a aplicar un factor de x1.5 a este cálculo de energía, obteniendo un resultado de 17mAh de consumo medio. Con este dato, podremos calcular la duración de la batería.
Selección de la batería y la placa solar
Una vez calculado el consumo aproximado de todo el sistema durante un día, que será de aproximadamente 17mAh, es hora de seleccionar la batería y la placa solar. Cuando hablamos de baterías, es muy común que aparezcan los términos mA (miliamperio) y mAh (miliamperios hora).
mA es la corriente que entrega la batería de forma instantánea. Si conectamos una resistencia de 100Ω a una batería de 3.7V, extraeremos 37mA de la batería de forma constante hasta retirar la resistencia del circuito.
El término mAh en cambio hace referencia a la energía consumida. Se calcula haciendo la integral del consumo de corriente (mA) en el tiempo. Por lo tanto, con un consumo constante de 17mA, la energía consumida será de 17mA*1h= 17mAh en una hora y de 34mAh en dos horas.El funcionamiento de una batería es bastante simple de entender. Una batería de 4000mAh puede entregar 4000mA durante una hora ininterrumpidamente. Si en vez de 4000mA extraemos 8000mA de esa batería, la duración de la carga será de la mitad, de media hora. Si extraemos 16000mA la batería durará cuatro veces menos, 15 minutos. Así sucesivamente. Aun así, hay que tener cuidado con la cantidad de corriente que se extrae de una batería ya que todas cuentan con un límite de corriente de descarga que si es superada la batería podría resultar dañada o incluso explotar. De todas formas, como hemos visto en el apartado de consumos de corriente, con un consumo de 17mA al día y una batería de 4000mA no habrá ningún problema en este aspecto ya que la carga que extraeremos de forma instantánea es varias veces menor que la capacidad nominal de la batería.
Como seguridad, vamos a seleccionar una batería que nos dé la garantía de que, aun teniendo una época de 5 día consecutivos sin sol, la batería podrá seguir en funcionamiento unos 5 días sin ser cargada. Aun así, tened en cuenta que para que la placa solar siempre generará algo de energía, aunque el día esté nublado.
Con un consumo de 17mAh y si queremos una duración de unos 5 días, necesitamos una capacidad aproximada de 17mAh*24h*5dias = 2040mAh. Cuidado al seleccionar la batería. Si la compráis en páginas como ebay o aliexpress, sabed que la mayoría son falsas y que rara llegan a los niveles de mAh que prometen en la etiqueta. Si queréis comprar una batería fiable, recurrid a paginas especializadas como RS o Farnell.
En cuanto a la placa solar, seleccionaremos una de 6V y 3W (500mA), que debería ser suficiente para mantener la batería cargada.
Diodo y cargador de baterías TP4056
El cargador de baterías que he seleccionado es el TP4056. Además de cargar la batería de forma segura y controlada, cuenta con un sistema de protección de sobretensión, que detiene la carga en cuanto la tensión de batería alcanza los 4.2V. Ofrece una corriente de carga de hasta 1 amperio.
El diodo se utiliza para proteger la placa solar de posibles corrientes de retorno.
DC-DC elevador | De 3.7V a 5V
La función de este DC-DC es elevar la tensión de batería, que puede oscilar entre 3.2V y 4.2V, a 5V constantes. Puede entregar hasta 1A de salida y el fabricante promete una eficiencia de hasta el 92% (mucho me parece). Lo utilizaremos para garantizar una tensión de entrada constante y regulada de 5V para alimentar la electrónica.
Protección ante descarga completa de la batería
Un error muy común a la hora de trabajar con baterías es suponer que una batería completamente descargada tendrá una tensión de 0V. Error y mucho cuidado. Una batería a 0V no está descargada, está muerta y hay que tirarla.
Para trabajar con seguridad y alargar la vida útil de la batería, hay que evitar que la tensión caiga por debajo de un umbral de seguridad, que para una batería de 3.7V es de aproximadamente 3V.
Si por cualquier razón la placa solar deja de generar energía o esta energía no llega hasta la batería, hay que evitar que el sistema siga descargándola poco a poco, haciendo que la tensión descienda hasta los 0V y dejando la batería inservible. Para ello utilizaremos un MOSFET (tipo-p) y un transistor como se muestra a continuación:
El funcionamiento del circuito es muy simple. Si la caída de tensión de Gate (G) respecto a Source (S) es de 0V o cercana a 0V, el MOSFET permanece abierto. Si la caída de tensión es superior a un umbral determinado, el MOSFET se cierra.
En el dibujo de la izquierda en cambio, al estar la señal D6 en esta HIGH, el transistor se cierra, poniendo el Gate (G) del MOSFET a tierra. La caída de tensión entre Souce (S), que permanece a 5V, y de Gate (G), que acabamos de unirla a tierra, es de -5V (la puerta G está 5V por debajo de S, lo que da una diferencia de -5V entre ambas), por lo que el MOSFET se cierra, alimentando la electrónica.
En cambio, como veis en el dibujo de la derecha, al estar el transistor 2N3904 abierto (señal D6 en estado LOW), la resistencia de 50k queda flotante, actuando como resistencia pull-up. Así, la caída en bornas de esta resistencia, y por tanto, la caída entre Gate (G) y Source (S) es de 0V, permaneciendo el MOSFET abierto.
La primera cosa que hace el control es poner la salida D6 en estado HIGH, manteniendo el circuito cerrado y el sistema alimentado. Cuando se detecte que la tensión de batería ha caído por debajo del umbral que hayamos escogido (3.2V en mi caso), la salida D6 pasará a estado LOW, abriendo el transistor y con ello el MOSFET, dejando al circuito sin alimentación y haciendo que todo se apague. De esta forma nos aseguramos de que la batería no se va a descargar hasta los 0V, dejándola inservible.
¿La pregunta que os estaréis haciendo es… como encendemos manualmente el circuito para poder activar la salida D6 y alimentar el circuito? Para eso tenemos el interruptor manual S2 (de lineas discontinuas), que se ve en el diagrama principal. Simplemente cerramos el interruptor durante uno o dos segundos, los suficientes para alimentar la placa Arduino y que esta active la salida D6. Acordaos de volver a abrir el interruptor una vez encendido.
Cando se detecte que la tensión de batería a caído por debajo del umbral fijado, el control pondrá a salida D6 en estado LOW, haciendo que el transistor inferior se habrá, dejando la puerta del MOSFET flotante. La resistencia de 50k actúa como resistencia pull-up fijando la tensión de la puerta a 5V. En este caso, la caída de tensión GS será de 5V-5V = 0V, por lo que el MOSFET se abrirá, apagando la electrónica y protegiendo la batería.
Rutina visualización de variables en OLED 0.96’
Como veis en el esquema, he incluido un botón al pin D2 que utilizaremos para activar una interrupción hardware que sacará al sistema del modo ‘bajo consumo’ y activará una rutina donde visualizaremos las principales variables que estamos leyendo en a pantalla durante 6 segundos. Una vez transcurrido este tiempo, el sistema volverá a entrar en modo bajo consumo. Pulsando el botón no se activa el módulo WIFI ni se transmiten los datos, simplemente se hace una lectura y se visualizar en la pantalla.
Fijaos en que el OLED que compréis admite comunicación por I2C, facilitará mucho las cosas. El consumo del sistema con la pantalla encendida es de aproximadamente 26mA.
Sensores
No me voy a extender mucho con los sensores ya que el objetivo de esta serie no es profundizar en el funcionamiento de estos, de hecho, he utilizado librerías para trabajar con ellos de forma rápida. Hablaremos de ellos más en profundidad en la entrada dedicada a la parte software. Simplemente hay que comentar que hemos utilizado dos sensores:
1) Sensor de humedad DHT11
Sensor de humedad y temperatura. Ofrece lecturas bastante poco precisas, con una resolución de temperatura de 1ºC y un 5% en la humedad. Para este caso es suficiente.
Consume 2.5mA aproximadamente y se alimenta a 5V, por lo que he decidido utilizar la salida digital D7 de la propia placa Arduino para alimentarlo, de forma que solo alimentaremos el sensor cuando sea necesario. De esta forma se puede conectar/desconectar fácilmente cuando no vaya a usarse.
2) Barómetro BMP280
Sensor barométrico y de temperatura de alta precisión. Su consumo es despreciable, por lo que se alimenta directamente de la salida +3.3V de la placa Arduino.
Variables a visualizar:
- Temperatura BMP280
- Temperatura DTH11
- Humedad DHT11
- Presión atmosférica BMP280
- Tensión de batería
Siguiente entrada:
- Estación meteorológica WIFI |Introducción
- Estación meteorológica WIFI | Hardware
- ⇒ Estación meteorológica WIFI | Módulo ESP8266-01
- Estación meteorológica WIFI | Software
Estación meteorológica con PCB
También os puede interesar esta otra estación meteorológica, algo más compleja al estar diseñada con PCB de fabricación profesional.
Buenas, estoy con este proyecto de la estación meteorológica, y la primera duda que me surge es sobre el elevador de tensión. En tu esquema veo que los 5 voltios que alimentan al circuito se cogen de la IN del elevador. Y la batería se conecta a la salida, es decir, a los pines donde está soldado el conector USB.
¿Eso se hace así por alguna razón?
Un saludo
Muy buenas Manuel,
Tiene toda la razón, la imagen no está bien. El IN tiene que venir de la batería. Lo corregiré cuento antes.
Un saludo
Buenas, muchas gracias por contestar, nada, no creo que sea demasiado confuso pero para un novatillo como yo si que me planteó la duda.
Pues decirte que ya lo monté en placa de pruebas y genial, funciona perfecto, tan sólo le tuve que meter un wdt_reset() más porque no le daba tiempo a coger todas la medidas pero por lo demás genial.
Ahora tengo que soldarlo en placa a ver que tal se me da, ahí ya va a estar la cosa más complicada porque no tengo nada de experiencia.
Muchas gracias por tu trabajo, un gran manual!
Saludos!
Gracias por tu comentario! 🙂 me alegro de que te haya ido bien.