ESTACIÓN METEOROLÓGICA

TRABAJO REALIZADO POR: Juan José Guirao García, Aarón Martínez Navío, David Núñez Sánchez.

Introducción:

La estación meteorológica desarrollada por nuestro equipo combina la tecnología de Arduino con un módulo WiFi para recopilar datos ambientales en tiempo real y enviarlos a una página web personalizada alojada en un servidor Azure. Este proyecto proporciona una solución innovadora y asequible para monitorear condiciones climáticas locales y compartir esta información de manera accesible en línea.

Componentes:

  • Placa Arduino Uno como unidad central de procesamiento.
  • Sensores de temperatura, humedad y ultrasónico para recopilar datos ambientales.
  • Módulo WiFi para la conectividad a Internet.
  • Pantalla LCD para la visualización local de los datos.
  • Potenciómetro.
  • Resistencias.
  • Cables.

Funcionamiento:

Los sensores de temperatura, humedad y ultrasónico están conectados a la placa Arduino Uno. Cada 4,5 segundos, la placa Arduino recopila datos de los sensores y los envía al módulo WiFi. El módulo WiFi se encarga de transmitir estos datos al servidor Azure, donde se almacenan y se actualizan en una página web creada por el grupo. Esta página web muestra los datos meteorológicos en tiempo real, lo que permite a los usuarios acceder a ellos desde cualquier dispositivo con conexión a Internet.

Para el pluviómetro hemos tenido que usar el sensor ultrasónico y un recipiente, el funcionamiento es el siguiente: El sensor ultrasónico se monta en la parte superior del recipiente, mirando hacia abajo para enviar ondas ultrasónicas al agua y medir la distancia desde la superficie del agua hasta el sensor. Durante la lluvia, el sensor mide el tiempo que tarda en recibir el eco de las ondas, calculando así la distancia al agua. Esta distancia se utiliza para calcular la altura del agua en el recipiente, lo que permite estimar la cantidad de lluvia acumulada.

El funcionamiento del sensor de temperatura y humedad es más sencillo, es solo un sensor que recoge datos de ambas.

Además, los datos recopilados también se muestran en una pantalla LCD localmente conectada a la placa Arduino. Esto proporciona una visualización en tiempo real de las condiciones meteorológicas para aquellos que estén cerca de la estación meteorológica.

Software (código):

  • Código Placa Arduino

El siguiente código implementa la funcionalidad de una estación meteorológica utilizando Arduino. La estación está equipada con sensores de temperatura, humedad y precipitación, así como una pantalla LCD para la visualización local de los datos. Los datos recopilados se envían a través de la comunicación serial y se actualizan continuamente.

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

#define trigPin 8 
#define echoPin 9 

#define pin_temperatura A0
#define pin_humedad A1

const float ALTURAPLUV=186.82;
LiquidCrystal lcd(7,6,5,4,3,2);
float temperature, humidity, precipitation, Temp, H;
unsigned long millis_tiempo;

byte degreeChar[8] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
void Serial_Enviar() {
  String datos = "{\"temperature\":" + String(temperature);
  datos += ", \"humidity\":" + String(humidity);
  datos += ", \"precipitation\":" + String(precipitation);
  datos += "}";
  Serial.print(datos);
  Serial.println(); 
}

void lcd_imprimir(float t, float h){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Tempt: ");
  lcd.print(String(t));
  lcd.write((byte)0);
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(String(h) + "%");
}

void setup() {
  lcd.begin(16,2);
  lcd.createChar(0, degreeChar);
  Serial.begin(9600);
  delay(1000);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  Serial.println("Iniciado correctamente..");
}

void loop() {
  long duration, distance;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(4);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);

  precipitation = ALTURAPLUV - duration * 10 / 29.2 / 2; // La velocidad del sonido en el aire es de aproximadamente 343 metros por segundos
  int val = analogRead(pin_temperatura);
  int val_h = analogRead(pin_humedad);
  Temp = log(10000.0 * ((1024.0 / val - 1))); //se uso una resistencia de 10k =10000 ohmios
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15; // Convertir de Kelvin a Celcius

  H = 0.163 * val_h;//RH10 = val + 6*val/10 + 3*val/100; = 0.163*val

  delay(500);
  temperature = Temp;
  humidity = H;
  Serial_Enviar();
  lcd_imprimir(temperature, humidity);
  delay(4500);
  
}

Explicación del Código:

El código comienza con la inclusión de las librerías necesarias para el funcionamiento del programa: SoftwareSerial.h para la comunicación serial, y LiquidCrystal.h para el manejo de la pantalla LCD.

Luego, se definen los pines utilizados para los sensores y la pantalla LCD utilizando #define para asignar nombres descriptivos a los pines.

Se declaran variables globales para almacenar los datos de temperatura, humedad y precipitación, así como otras variables necesarias para los cálculos.

La función Serial_Enviar() se encarga de formatear y enviar los datos por el puerto serie hacia el módulo WiFi o cualquier otro dispositivo conectado. Los datos se envían en formato JSON para facilitar su interpretación por parte del receptor.

La función lcd_imprimir() muestra los datos de temperatura y humedad en la pantalla LCD. Primero se limpia la pantalla, luego se imprime la temperatura seguida del símbolo de grado Celsius personalizado, y finalmente se imprime la humedad.

En la función setup(), se inicializan los componentes necesarios para el funcionamiento del sistema: la comunicación serial, la pantalla LCD, y se configuran los pines del sensor ultrasónico.

En el bucle loop(), se realizan las mediciones de temperatura, humedad y precipitación. Se utiliza un sensor de ultrasonido para medir la distancia y calcular la precipitación. Los datos analógicos de los sensores de temperatura y humedad se convierten a valores de temperatura y humedad respectivamente.

Los datos se envían mediante la función Serial_Enviar() y se muestran en la pantalla LCD utilizando lcd_imprimir().

El bucle loop() se ejecuta continuamente, actualizando los datos cada 4.5 segundos.

  • Código Módulo WiFi

Este código implementa la funcionalidad de conexión WiFi en Arduino utilizando el módulo WiFi. Se establece la conexión a una red WiFi específica y se envían los datos recopilados por la estación meteorológica a una URL específica mediante una solicitud HTTP POST:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

const char* ssid = "**********";;
const char* password = "**********";

String url = "https://webmeteorologica.azurewebsites.net/api/Data/";

char salidaJson[128];

float temperatura;
float humedad;

void setup() {
  Serial.begin(9600);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("Conectando...");
  }

  Serial.print("Conectado con éxito, mi IP es: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient client;
    client.begin(url);
    client.addHeader("Content-Type", "application/json");
    StaticJsonDocument<256> doc;

    delay(2000);

    deserializeJson(doc, Serial);

    serializeJson(doc, salidaJson);
    Serial.println(salidaJson);

    int httpCode = client.POST(String(salidaJson));

    if(httpCode > 0){
      Serial.println("\nStatuscode: " + String(httpCode));
      client.end();
    }else{
      Serial.println("Error en la solicitud HTTP: " + String(httpCode));
      Serial.println(client.errorToString(httpCode));
    }
  }else{
    Serial.println("Conexion perdida");
  }
  delay(1000);
}

Explicación del Código:

El código comienza con la inclusión de las librerías necesarias para la comunicación WiFi y HTTP, así como para el manejo de objetos JSON: WiFi.h, HTTPClient.h y ArduinoJson.h.

Se definen las credenciales de la red WiFi a la que se conectará el dispositivo mediante las variables ssid y password.

Se establece la URL a la que se enviarán los datos de la estación meteorológica mediante la variable url.

En la función setup(), se inicializa la comunicación serial y se establece la conexión WiFi utilizando las credenciales proporcionadas. Se espera a que la conexión se establezca con éxito antes de continuar.

Dentro del bucle loop(), se verifica si la conexión WiFi está establecida correctamente.

Se crea un objeto HTTPClient para realizar una solicitud HTTP POST a la URL especificada.

Se utiliza un objeto StaticJsonDocument para almacenar los datos recibidos por la comunicación serial. Esto permite parsear y manipular datos JSON de manera eficiente en dispositivos con recursos limitados.

Después de una breve espera para asegurar que los datos estén disponibles en el puerto serial, se deserializan los datos JSON recibidos y se guardan en el objeto doc.

Los datos se serializan en formato JSON y se envían mediante la solicitud HTTP POST utilizando el método client.POST(). El resultado de la solicitud se almacena en la variable httpCode.

Se manejan posibles errores durante el proceso de solicitud HTTP. Si la solicitud es exitosa, se muestra el código de estado HTTP por la comunicación serial. En caso de error, se imprime un mensaje indicando el error ocurrido.

El bucle loop() se ejecuta continuamente, verificando y enviando los datos cada segundo mediante el uso de la función delay(1000).

Problemas:

Durante el desarrollo de nuestro proyecto de estación meteorológica, nos enfrentamos a varios desafíos que requirieron creatividad y resolución de problemas para superarlos.

El primer obstáculo significativo fue la escasez de sensores necesarios para nuestro proyecto en el material proporcionado por la asignatura. Esta limitación nos obligó a adquirir los sensores de temperatura, humedad, y módulo wifi.

Además, nos encontramos con funcionalidad limitada de la pantalla LCD. Descubrimos que la falta de una soldadura adecuada en los pines de la pantalla resultaba en un mal funcionamiento, al no estar bien sujeto dificultaba la visualización precisa de los datos recopilados. Para solucionarlo pegamos la pantalla LCD en la Protoboard.

Otro desafío significativo surgió cuando intentamos configurar un servidor local para recibir y almacenar los datos de la estación meteorológica. Descubrimos que los puertos del servidor estaban cerrados, lo que dificultaba la comunicación efectiva entre la estación y el servidor. Por ello, tomamos la decisión de usar la plataforma Azure de Microsoft, que ofrecía una mejor solución para manejar el servidor de la página web.

Además, inicialmente planeamos utilizar únicamente un módulo WiFi para la comunicación de datos. Sin embargo, nos enfrentamos a dificultades para leer los valores analógicos de los sensores a través de este módulo. Esta limitación nos llevó a incorporar la placa Arduino para manejar la lectura de los sensores y la comunicación con el módulo WiFi. Esta solución añadió complejidad al proyecto en términos de programación y coordinación entre las dos placas Arduino.

Reparto de tareas:

En nuestro grupo de proyecto, todos hemos participado en todas las etapas del proyecto, tanto en el montaje del hardware como en la programación del software. Cada uno de nosotros ha contribuido en la configuración y conexión de los componentes físicos, así como en la codificación y prueba del código necesario para el funcionamiento del sistema.

Costes de los materiales:

El coste del sensor de temperatura y humedad fue de 8€ y el del modulo WIFI fue de 12€, en total 20€.

Conclusiones:

La estación meteorológica con conexión a Internet desarrollada por nuestro equipo demuestra cómo la combinación de tecnología de Arduino y conectividad web puede ofrecer una solución efectiva y asequible para monitorear y compartir datos ambientales en tiempo real.

Vídeos de demostración:

Vídeo Demostración Pluviómetro:

Vídeo Demostración de Sensor de Temperatura y Humedad:

También te podría gustar...

Deja una respuesta

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