domingo, 19 de febrero de 2017

Estación Meteorológica

Introducción

Algunos de los proyectos Arduino más comunes e interesantes son las estaciones meteorológicas, pues con ciertos sensores obtenemos información de primera mano en tiempo real. Los proyectos de este tipo van desde un sensor de temperatura hasta múltiples sensores como son de humedad, presión, velocidad del viento, brújula, sensor de lluvia, pluviómetros, etc.., todo lo que a uno se le pueda ocurrir. Al mismo tiempo registrar todos los datos obtenidos en una base de datos o en una tarjeta sd.
En este proyecto nos vamos a centrar sólo en datos de temperatura, humedad y presión relativa.
La presión relativa es aquella que sea cual sea la altitud que estemos, el sensor nos indicará la presión atmosférica que tendríamos si estuviéramos al nivel del mar, pues la presión cambia con la altitud y temperatura. ¿Y porqué esto?, pues porque así tendríamos referencia con los mapas del tiempo, pues la presión que nos publican son en superficie, o sea, al nivel del mar.


Componentes

Protoboard
Arduino Uno o similar
Fuente alimentación 9V 1A
Fuente alimantacion protoboard
Sensor temperatura humedad DHT22
Sensor presión BMP180
Cables jumpers
Lcd 1602 I2C

Esquema

Conexionado y código:



Código:

#include <Wire.h>
#include <SFE_BMP180.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
#define ALTITUDE 212.0 // definimos nuestra altitud sobre el nivel del mar

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
SFE_BMP180 pressure;

void setup() {
  Serial.begin(9600);
  lcd.begin(16,2);
  dht.begin();
  Wire.begin();
  if (pressure.begin())
    Serial.println("BMP180 iniciado");
  else {
    Serial.println("fallo en BMP180");
    while (1);
  }
  lcd.clear();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  char status;
  double T, P, p0, a;

  lcd.setCursor(0,0);
  lcd.print("T: ");
  lcd.print(t,1);
  lcd.setCursor(9,0);
  lcd.print("H: ");
  lcd.print(h,1);

  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0) {
      Serial.print("OK");
      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0) {
          Serial.print("OK");

          p0 = pressure.sealevel(P, ALTITUDE);
          lcd.setCursor(0,1);
          lcd.print("Pr: ");
          lcd.print(p0, 1);
          lcd.print(" mb");

          a= pressure.altitude(P,p0);
          Serial.print("OK");
        } else Serial.println("error");
      } else Serial.println("error");
    } else Serial.println("error");
  } else Serial.println("error");
  delay (2000);
}


Notas:

En ALTITUDE definimos la altura sobre el nivel del mar que nos encontramos. Esta información la podemos obtener de cualquier smartphone con GPS.


Enlaces:


Fotos: