Estación Meteorológica con Arduino Paso a Paso
¡Bienvenido a la página web de WexterHome! Cómo has visto en el título, hoy voy a crear una estación meteorológica con Arduino paso a paso. Para ello, voy a utilizar un sensor de temperatura y humedad como el DHT11 o el DHT22. Además añadiré una pantalla LCD 16×02 para poder visualizar estos datos.
Vamos a crear una primera versión de la estación meteorológica muy sencilla y después le haré algunas mejoras. Al final del post te daré algunas ideas con las que puedes mejorarla y añadirle nuevas funciones que yo mismo desarrollaré en un futuro.
Materiales - DHT11 o DHT22, pantalla LCD...
La primera versión de la estación meteorológica simplemente va a medir la temperatura y la humedad y va a mostrar estos valores en una pantalla LCD de 16×02. Además de dicha pantalla, los únicos materiales que voy a utilizar son bastante baratos y fáciles de conseguir.
Éstos son, un sensor de temperatura y humedad, que puede ser el modelo DHT11 o DHT22. El DHT22 es un poquito más caro pero tiene unos rangos de trabajo más grandes y una mayor precisión. Puedes ver las características técnicas de cada uno aquí: DHT11 y DHT22 datasheet.
Aparte de este sensor también necesitas una resistencia de 10 kΩ, otra de 220 Ω, un Arduino, que en mi caso estoy utilizando un Arduino Uno, y una placa protoboard y cables para hacer las conexiones.

Esquema eléctrico de la estación meteorológica
En la imagen de abajo puedes ver como conectar tanto la pantalla LCD como el sensor de temperatura y humedad. El potenciómetro sirve para ajustar el brillo de la pantalla. La resistencia que se utiliza en el sensor DHT11 o DHT22 está conectada entre el pin de alimentación y el pin de señal del sensor.

Cómo programar la estación meteorólogica con Arduino paso a paso
Lo primero que hago es incluir las librerías que necesito. «LiquidCrystal.h» es la librería de la pantalla LCD y «DHT.h» la del sensor de temperatura y humedad. A continuación defino el modelo de mi sensor de temperatura, que en este caso estoy utilizando el DHT22. Si tu tienes el DHT11 simplemente sustituye el 22 por el 11.
Justo abajo creo dos objetos, uno del sensor de temperatura y otro de la pantalla, para poder utilizar sus métodos. En la variable «DHTPin» guardo el número del pin digital al que tengo conectado el sensor DHT22.
La función «void setup()» es muy sencilla. Simplemente inicializo la pantalla con «lcd.begin()», indicándole el número de columnas y filas, y el sensor de temperatura y humedad con «dht.begin()». Esta función no necesita parámetros.
La función principal, «void loop()», también es muy sencilla. Lo primero que hago es medir la temperatura y la humedad con las funciones «dht.readHumidity()» y «dht.readTemperature()». A continuación compruebo si los valores recibidos son igual a NaN o no. Si es así, significa que ha habido un error. En este caso borro todo el texto escrito en la pantalla LCD y escribo la frase «DHT Error».
Si no hay ningún error, muestro los valores de temperatura y humedad en la pantalla LCD. Al final del código utilizo un «delay()» de 10 segundos. Si tu quieres medir la temperatura y la humedad cada más o menos tiempo, simplemente sustituye el 10.000 por el tiempo que quieras. Recuerda que se representa en milisegundos.
#include <LiquidCrystal.h> #include <DHT.h> #define DHTTYPE DHT22 // DHT 22 const int DHTPin = 6; DHT dht(DHTPin, DHTTYPE); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ lcd.begin(16, 2); // Inicia un LCD 16x02 (columnas,fila) dht.begin(); // Inicia el sensor de temp y humedad } void loop(){ float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("DHT Error"); delay(10000); return; } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(t); lcd.setCursor(0, 1); lcd.print("Humedad: "); lcd.print(h); lcd.print("%"); delay(10000); }
Estación meteorológica inalámbrica con Arduino
La primera mejora que me gustaría hacerle a la central meteorológica es añadirle unas baterías. De esta forma podría utilizarla en aquellas zonas donde no hay un enchufe cercano, como por ejemplo en el jardín.
Para que las baterías duren mucho más tiempo, y no tener que recargarlas cada dos por tres, voy a utilizar el modo sleep o modo sueño de Arduino. Si no sabes que es esto, te dejo aquí un vídeo donde lo explico: Modo Sleep en Arduino.
El programa es exactamente igual que el anterior, excepto que he sustituido el «delay» por la función «LowPower.powerDown()». Esta función apaga varios componentes internos de Arduino, como por ejemplo el ADC, durante 8 segundos. El tiempo se especifica en el primer parámetro de la función. 8 segundos es el máximo.
Además, he metido esta función dentro de un bucle for de 30 iteraciones. Por lo tanto, la función «LowPower.powerDown()» se ejecuta 30 veces por cada vuelta de la función «void loop». Si multiplicas 30 por 8, da un total de 240 segundos, lo que es igual a 4 minutos.
De esta manera consigo medir la temperatura y la humedad cada 4 minutos, que es más que suficiente, y ahorrar mucha energía, haciendo que las baterías duren más. Si quieres ampliar o disminuir los 4 minutos simplemente cambia el número de repeticiones del bucle for.
#include <LowPower.h> #include <LiquidCrystal.h> #include <DHT.h> #define DHTTYPE DHT22 // DHT 22 const int DHTPin = 6; DHT dht(DHTPin, DHTTYPE); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ Serial.begin(9600); lcd.begin(16, 2); // Inicia un LCD 16x02 (columnas,fila) dht.begin(); // Inicia el sensor de temp y humedad } void loop(){ float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("DHT Error"); delay(10000); return; } lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(t); lcd.setCursor(0, 1); lcd.print("Humedad: "); lcd.print(h); lcd.print("%"); //Modo Sleep durante 4 minutos for(int i=0; i<30; i++){ LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); } }
Otras ideas
Por hoy ya no voy a añadirle más funciones o componentes a la estación meteorológica, pero tengo algunas ideas que posiblemente desarrolle más adelante.
Una de ellas sería crear una PCB para realizar las conexiones. De esta manera quedaría bastante más profesional. También podría sustituir el Arduino Uno por una ESP8266 para conectar la central a la nube e incluirla en mi sistema domótico. Y por último le haré una cajita impresa en 3D para protegerla del agua y el polvo.