Estación Meteorológica con Protocolo MQTT

Sistema IoT para Monitorización Ambiental en Tiempo Real con Protocolos MQTT

Ejemplo del proyecto

En la actualidad, la monitorización ambiental en tiempo real se ha convertido en una
necesidad crítica en muchos campos, desde la gestión de espacios domésticos hasta la
supervisión de procesos industriales. El auge del Internet de las Cosas (IoT) ha
facilitado la adopción de soluciones para medir variables como temperatura, humedad y
presión atmosférica, permitiendo una mayor precisión y accesibilidad en la toma de
decisiones.

Entre las tecnologías disponibles para este proyecto destacan los sensores
multifuncionales como el BME680, que combina diversas capacidades en un solo
módulo compacto y eficiente. Este módulo, cuando se integra con microcontroladores
como el ESP32-C3 y protocolos de comunicación como MQTT, ofrecen un enfoque
robusto para la recolección y transmisión de datos. El microcontrolador actúa como
cliente MQTT y transmite los datos al bróker Mosquitto, instalado en un servidor local.

Diagrama explicativo del trabajo

Los materiales necesarios:

  • ESP32
  • Sensor BME680
  • Hub I2C

Lo siguiente será mostrar el esquema de montaje, teniendo en cuenta que usaremos los pines 4 y 5 del microcontrolador

La comunicación del sensor BME680 con el ESP32 se realiza por protocolo I2C y alimentando el módulo Vcc a 3V3 y GND a masa

Esquema del cableado

Ahora le comentaremos el código implementado con Arduino. Usamos los pines 4 y 5. Usamos la librería PubSub.h, declaramos las variables a usar. Configuramos la IP del servidor como salida y el echo como entrada. El algoritmo constará de un bucle que realizará un paneo gracias al motor y el sensor pegado a el nos indicará si hay un objeto cerca y cómo de cerca. Para esto utilizaremos una función llamada calculateDistance.

El código completo que usaremos en Arduino es el siguiente:

#include <PubSubClient.h>                           //Incluimos librerías
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME680.h>
#include <Adafruit_Sensor.h>
//Se incluyen librerías
const char* ssid = “ssid”;                          //Id del WiFi Portatil
const char* password = “contraseña”;                //contraseña del WiFi
const char* mqttServer = “192.168.137.1”;           //IP privada del servidor (mi portatil)
const int mqttPort = 1883;                          //Puerto de la dirección IP
Adafruit_BME680 sensor;
WiFiClient espClient;
PubSubClient client(espClient);
void reconectarse() {
  //Función para reconectarse al servidor en el caso de haber perdido la conexión
  //Bucle hasta que nos conectemos
  while (!client.connected())
  {      
    Serial.println(“Conectando a MQTT…”);
    if (client.connect(“ESP32Client”))                //, mqttUser, mqttPassword
    {
      Serial.println(“Conectado a MQTT”);
    }
    else
    {    
      Serial.print(“Fallo al conectar, estado:”);
      Serial.print(client.state());
      delay(2000);
    }
  }
}
void setup()
{
  Serial.begin(115200);
  Wire.begin(4,5);                                    //Inicia I2C con SDA en GPIO 4 y SCL en GPIO 5
  //Wire.setClock(100000);                            //Fija la frecuencia I2C a 100kHz
  WiFi.begin(ssid, password);
  Serial.println(“……………………………..”);
  Serial.print(“Conectando al WiFi…”);
  while (WiFi.status() != WL_CONNECTED)               //Mientras no nos hayamos conectado
    {  
      delay(500);
      Serial.print(“.”) ;
    }
  Serial.println(“Conectado a la red WiFi”);
  client.setServer(mqttServer, mqttPort);
  //Inicia comunicación con el sensor BME680
  if (!sensor.begin(0x76)) {
    Serial.println(“No se encontró un BME680!”);
 
    while (1);
  }
  //Configuración del sensor
  sensor.setTemperatureOversampling(BME680_OS_8X);
  sensor.setHumidityOversampling(BME680_OS_2X);
  sensor.setPressureOversampling(BME680_OS_4X);
  sensor.setIIRFilterSize(BME680_FILTER_SIZE_3);
   
}
 
  void loop()                    
  {
    if (!client.connected())                          //Si el Cliente MQTT no se ha conectado al servidor
    {
      reconectarse();
    }
    client.loop();
  if (!sensor.performReading())                       //Si no es capaz de recibir información del sensor
  {
    Serial.println(“Falló la lectura del sensor!”);
    return;
  }
  // Publicar temperatura
  char valorTemperatura[16];
  dtostrf(sensor.temperature, 1, 2, valorTemperatura); // Convierte a string
  client.publish(“Sensor/Temperatura”, valorTemperatura);
  Serial.print(“Temperatura: “);
  Serial.println(valorTemperatura);
  // Publicar humedad
  char valorHumedad[16];
  dtostrf(sensor.humidity, 1, 2, valorHumedad);
  client.publish(“Sensor/Humedad”, valorHumedad);
  Serial.print(“Humedad: “);
  Serial.println(valorHumedad);
  // Publicar presión
  char valorPresion[16];
  dtostrf((sensor.pressure/1000)*0.00986, 1, 2, valorPresion); //De Pa a atm
  client.publish(“Sensor/Presion”, valorPresion);
  Serial.print(“Presion: “);
  Serial.println(valorPresion);
  delay(5000); // Esperar 5 segundos entre lecturas
  }

Este código controla un servo y un sensor ultrasónico para medir distancias. El servo se mueve de 15° a 165° y luego regresa, mientras en cada posición se mide la distancia a un objeto. La distancia se calcula usando la duración del eco del sensor ultrasónico y se imprime junto con el ángulo del servo en el monitor serie. La función CalculateDistance() gestiona el envío del pulso ultrasónico y calcula la distancia basándose en el tiempo de retorno del eco.

Para completar el proyecto, descargaremos el programa Processing de forma gratuita: https://processing.org/download

Una vez descargado será hora de crear la interfaz que nos dirá dónde está el objeto identificado y a cuanta distancia. Para ello usaremos el siguiente código, no te olvides de modificar en la línea 11 del código el puerto utilizado por el que estés usando . Lo puedes saber mirando en el programa Arduino, en Tools, Port: COM.

Antes de darle a Run al código de Processing, cierra el programa de Arduino, sino el puerto COM estará ocupado.

El proyecto acabado quedará de está manera, adjuntamos video con el resultado.

Esperamos que os haya servido de ayuda para completar vuestro proyecto o al menos para aprender algo que desconocíais.

Deja un comentario

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