Saltar al contenido

Pequeña estación meteorológica con Arduino

Hacía mucho tiempo que quería introducirme en el mundo de Arduino, pero no encontraba el momento para hacerlo. Aprovechando las vacaciones de verano, hace dos semanas compré un kit con, además de la placa Arduino Uno, los sensores y demás elementos necesarios para construir un proyecto sencillo, una pequeña estación meteorológica. Aquí voy a compartir todos los detalles de cómo lo hice.

El kit Arduino

El kit que compré es para construir la estación Céfiro, un proyecto del Grupo de Innovación Educativa que desde el Gobierno de Canarias se fomenta para su construcción en talleres y aulas de diferentes centros educativos de las islas. Más información sobre Céfiro, aquí. El caso es que, cuando busqué información en internet para empezar a montar desde cero este proyecto, porque en la caja no venía ningún tipo de manual, me encontré con que algunos sensores no eran los mismos que se especificaba en el contenido de la caja. También encontré, que siguiendo las instrucciones publicadas aquí, no conseguía hacer funcionar todo (programas que no compilaban bien, creo que también problemas con algunas librerías…). Total, que empecé a buscar información en otros sitios de internet, incluidas las web de los fabricantes de los sensores.

Mi proyecto, al menos de momento, es más sencillo que Céfiro, porque decidí no usar el sensor de humedad del suelo ni el detector de lluvia (voy a tener la estación siempre dentro de casa). Quiero ampliarlo con sensores de calidad del aire, pero de momento lo que registro es temperatura, humedad relativa y presión. Para ser un primer proyecto no está del todo mal.

Los ingredientes para la «receta» son los siguientes (doy enlaces que he visto a buen precio, para que puedas comprarlos desde aquí):

Las conexiones que hice son las siguiente. Perdón si el esquema no es claro. Es el primero que hago:

Programa para Arduino

Y el código, hecho bastante a base de corta-pega de códigos encontrados en la red. Siento no poder citar aquí las fuentes porque cometí el error de no guardarlas, pero las buscaré y las incluiré.

#include «DHT.h»
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <SFE_BMP180.h>

#define DHTPIN 2 // what pin we’re connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)

#define I2C_ADDR 0x3F // <<—– Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

int n = 1;
int maxHum = 60;
int maxTemp = 40;
SFE_BMP180 pressure;
#define ALTITUDE 543.0 // Tu altitud en metros
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup()
{
lcd.begin (16,2); // <<—– Mi LCD es de 16×2, pero aqui puedes modificar

Serial.begin(9600);

lcd.print(«Leyendo sensores»);
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
// Initialize the sensor (it is important to get calibration values stored on the device).

if (pressure.begin())
Serial.println(«BMP180 init success»);
else
{
// Oops, something went wrong, this is usually a connection problem,
// see the comments at the top of this sketch for the proper connections.

Serial.println(«BMP180 init fail\n\n»);
while(1); // Pause forever.
}
}
void loop() {
char status;
double T,P,p0,a;

DHT dht(DHTPIN, DHTTYPE);
// Wait a few seconds between measurements.
delay(2000); //

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds ‘old’ (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();

/// Sensor de presion
// Loop here getting pressure readings every 10 seconds.

// If you want sea-level-compensated pressure, as used in weather reports,
// you will need to know the altitude at which your measurements are taken.
// We’re using a constant called ALTITUDE in this sketch:

Serial.println();
Serial.print(«provided altitude: «);
Serial.print(ALTITUDE,0);
Serial.print(» meters, «);
Serial.print(ALTITUDE*3.28084,0);
Serial.println(» feet»);

// If you want to measure altitude, and not pressure, you will instead need
// to provide a known baseline pressure. This is shown at the end of the sketch.

// You must first get a temperature measurement to perform a pressure reading.

// Start a temperature measurement:
// If request is successful, the number of ms to wait is returned.
// If request is unsuccessful, 0 is returned.

status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);

// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.
// Function returns 1 if successful, 0 if failure.

status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
Serial.print(«temperature: «);
Serial.print(T,2);
Serial.print(» deg C, «);
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(» deg F»);

// Start a pressure measurement:
// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
// If request is successful, the number of ms to wait is returned.
// If request is unsuccessful, 0 is returned.




status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);

// Retrieve the completed pressure measurement:
// Note that the measurement is stored in the variable P.
// Note also that the function requires the previous temperature measurement (T).
// (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
// Function returns 1 if successful, 0 if failure.

status = pressure.getPressure(P,T);
if (status != 0)
{
// Print out the measurement:
Serial.print(«absolute pressure: «);
Serial.print(P,2);
Serial.print(» mb, «);
Serial.print(P*0.0295333727,2);
Serial.println(» inHg»);

// The pressure sensor returns abolute pressure, which varies with altitude.
// To remove the effects of altitude, use the sealevel function and your current altitude.
// This number is commonly used in weather reports.
// Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
// Result: p0 = sea-level compensated pressure in mb

p0 = pressure.sealevel(P,ALTITUDE); // we’re at 1655 meters (Boulder, CO)
Serial.print(«relative (sea-level) pressure: «);
Serial.print(p0,2);
Serial.print(» mb, «);
Serial.print(p0*0.0295333727,2);
Serial.println(» inHg»);

// On the other hand, if you want to determine your altitude from the pressure reading,
// use the altitude function along with a baseline pressure (sea-level or other).
// Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
// Result: a = altitude in m.

a = pressure.altitude(P,p0);
Serial.print(«computed altitude: «);
Serial.print(a,0);
Serial.print(» meters, «);
Serial.print(a*3.28084,0);
Serial.println(» feet»);
}
else Serial.println(«error retrieving pressure measurement\n»);
}
else Serial.println(«error starting pressure measurement\n»);
}
else Serial.println(«error retrieving temperature measurement\n»);
}
else Serial.println(«error starting temperature measurement\n»);

delay(5000); // Pause for 5 seconds.
///////

// Escribo en la pantalla LCD
// Switch on the backlight
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
///////////////////////////////////////////////////
lcd.clear();//Elimina todos los simbolos del LCD
lcd.setCursor(0,0);//
lcd.print(«Humedad relativa «);
lcd.setCursor(5,1);
lcd.print(h);//Escribe la humedad
lcd.print(» %»);
delay (2500);
///////////////////////////////////////////////////
lcd.clear();
lcd.setCursor(3,0);
lcd.print(«Temperatura «);
lcd.setCursor(6,1);
lcd.print(t);//Escribe la temperatura
lcd.print(» C»);
delay (2500);
///////////////////////////////////////////////////
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Presion «);
lcd.setCursor(0,1);
lcd.print(P);// Escribe la presion
lcd.print(» mb»);
delay (2500);

/////////////////////////////
lcd.clear();
lcd.setCursor(1,0);
lcd.print(«Estacion meteo»);
lcd.setCursor(2,1);
lcd.print(«Silvia Alonso»);
delay (2500);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println(«Failed to read from DHT sensor!»);
return;
}

Serial.print(«Humidity: «);
Serial.print(h);
Serial.print(» %\t»);
Serial.print(«Temperature: «);
Serial.print(t);
Serial.println(» ºC «);
}

Como ves, al principio del código hay unas librerías (las que están detrás de la instrucción #include) que debes instalar. Eso se hace desde el propio programa entorno donde programas el Arduino. Trata de tener las últimas versiones de las librerías.

Con este programa tendrás dos tipos de salidas. Por un lado, las que aparecen en la pantalla LCD (temperatura y humedad medidas por el sensor DHT-22 y presión medida por el sensor BMP-180). Por otro lado, si en el entorno de programación vas al monitor del sistema, verás información extra, como por ejemplo la temperatura y humedad proporcionadas por el BMP-180, la presión en Hg, o tu altitud en pies. En código hay una línea en la que tienes que especificar a qué altitud se encuentra tu estación. También puedes modificar otras cosas, como el texto que yo puse para identificar a la estación, donde aparece mi nombre (pon el tuyo, o ¡ponle nombre propio a tu estación!).

Y eso es todo. Solo tienes que tener cuidado de que todo esté bien conectado, el programa subido a la placa controladora Arduino y la placa alimentada (por ejemplo, a través del cable USB). Aquí muestro unas fotos de cómo quedó el montaje. Lo bueno ahora sería hacerle algún tipo de caja para poner dentro todos los elementos, pero voy a esperar a ampliar la estación. Quiero añadir algún sensor de calidad del aire (ya estoy trabajando con el MQ-135, aunque no me está gustando mucho).

estación meteorológica arduino
estación meteorológica arduino
estación meteorológica arduino
estación meteorológica arduino

Se pueden hacer más cositas, como por ejemplo conseguir que los datos registrados por los sensores se escriban en un fichero (en una tarjeta SD, o en el ordenador al que está conectada por USB), añadir más sensores y todo lo que se te ocurra. Lo interesante es experimentar y así aprender un poquito más de electrónica.

Espero que esta entrada de mi blog te anime a hacer este o un proyecto similar con Arduino. Si tienes alguna duda, pregunta en la sección de comentarios y trataré de ayudarte.

Publicado enDivulgación

4 comentarios

  1. matias matias

    comprendo la parte de la conexion de los cables lcd a arduino,quiesiera saber la conexion de los cables que van a la lcd,desde ya gracias.

Responder a matias Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Verificado por MonsterInsights