Tecnología e Ingeniería I • Bachillerato

Estación Meteorológica IoT

Diseño, Programación y Ética en la Cultura Maker

ESP8266 BMP280 MQTT / JSON Node-RED
Logotipo Universidad del Atlántico Medio
📡 Fase: Prototipado y Comunicaciones
💡 Metodología: ABP
RECURSO EDUCATIVO ABIERTO (REA)

Saltar la navegación

Fase 4. Envío de datos vía MQTT

📤 Fase 4 · 2–3 sesiones

Envío de datos vía MQTT

Después de comprender qué son IoT, WiFi, MQTT y JSON, llega el momento de poner en práctica esa arquitectura. En esta fase el ESP8266 se conecta a la red, genera un mensaje con los datos del sensor y lo publica en un tópico MQTT para que pueda ser recibido desde otro cliente.

WiFi Broker PubSubClient Topic Payload JSON
Conexión con la Fase 3: antes aprendiste qué era un broker, qué significaba publicar en un tópico y por qué JSON era útil para estructurar la información. Ahora vas a ver cómo esas ideas se convierten en código funcional dentro del ESP8266. 

🌐Redes y comunicación

Para enviar datos, el microcontrolador necesita conectarse primero a una red WiFiRed inalámbrica local que permite que el ESP8266 se comunique con otros equipos, como el broker MQTT o el ordenador donde corre Node-RED.. Una vez conectado, el dispositivo obtiene una dirección IP y puede abrir una conexión con el broker usando una IP o un nombre de host y un puertoNúmero que identifica un servicio concreto dentro de un servidor. La IP indica qué equipo queremos localizar y el puerto señala qué servicio debe responder, por ejemplo MQTT en el puerto 1883. concreto.

Iniciamos esp8266

En este proyecto se trabaja con un broker MQTT y con la librería PubSubClientLibrería de Arduino muy usada para trabajar con MQTT. Permite conectarse al broker, publicar mensajes y suscribirse a tópicos., que se encarga de gestionar la comunicación entre el ESP8266 y el servidor. 

⚙️Secuencia del envío

1
Conectar a WiFi
El ESP8266 se conecta a la red con su SSID y contraseña.
2
Conectar al broker MQTT
Se define el servidor, el puerto y el identificador del cliente.
3
Leer el sensor
Se obtienen temperatura, presión y altitud desde el BMP280.
4
Crear el JSON
Los datos se estructuran en un payload con claves y valores.
5
Publicar en el tópico
El mensaje se envía al broker para que otros clientes lo reciban.

🧭Ejemplo de tópico

Un tópicoRuta jerárquica que organiza los mensajes dentro del broker MQTT. Permite separar información por dispositivo, tipo de dato o proyecto. funciona como una dirección lógica donde se publica la información. En el código del proyecto se construye con una cadena que incluye la categoría del nodo y el identificador del dispositivo. 

Configuración MQTT

Topic de publicación cabrerapinto/meteorologia/esp8266-id/bmp280

📦Ejemplo de payload JSON

El payloadParte útil del mensaje MQTT. En este caso contiene información del ESP8266 y del sensor BMP280 en formato JSON. que se envía al broker contiene información del dispositivo y del sensor. Esta estructura permite que el cliente suscriptor identifique fácilmente qué datos debe leer y cómo debe interpretarlos. 

{
  "esp": {
    "ip": "192.168.1.48",
    "rssi": -56,
    "timestamp": 35420
  },
  "sensor": {
    "name": "BMP280",
    "temperatura_c": 23.4,
    "presion_hpa": 1012.8,
    "altitud_m": 12.1
  }
}
Fragmento del proyecto · Conexión WiFi, MQTT y publicación
// Conexión a la red WiFi
void wifiConnect() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }

  Serial.printf("[WiFi] OK IP=%s RSSI=%d\n",
                WiFi.localIP().toString().c_str(),
                WiFi.RSSI());
}

// Reconexión al broker MQTT
void reconnectMQTT() {
  String clientId = "ESP8266Client-" + String(ESP.getChipId());

  while (!client.connected()) {
    if (client.connect(clientId.c_str())) {
      Serial.println("[MQTT] connected");
    } else {
      Serial.println("[MQTT] retry");
      delay(5000);
    }
  }
}

// Lectura del sensor y publicación del JSON
void sendToBroker() {
  float tempC   = bmp.readTemperature();
  float pressHP = bmp.readPressure() / 100.0;
  float altM    = bmp.readAltitude(SEALEVELPRESSURE_HPA);

  DynamicJsonDocument doc(1024);
  JsonObject values = doc.createNestedObject("sensor");
  values["name"] = "BMP280";
  values["temperatura_c"] = tempC;
  values["presion_hpa"] = pressHP;
  values["altitud_m"] = altM;

  char payload[1024];
  serializeJson(doc, payload, sizeof(payload));

  client.publish(send_topic, payload);
}
Comprobación práctica: el envío puede verificarse de dos maneras. Primero, observando en el monitor serie si aparecen mensajes de conexión y publicación; segundo, utilizando un cliente suscriptor para comprobar si el tópico recibe correctamente el payload. Esta comprobación forma parte de la lógica de depuración descrita en la secuencia didáctica de la unidad. 

🧪Qué debes comprobar

1
La red WiFi conecta correctamente
El monitor serie debe mostrar una IP local y un valor de RSSI.
2
El broker acepta la conexión
Debe aparecer un mensaje de conexión MQTT correcta o de reintento si falla.
3
El tópico recibe el mensaje
El payload JSON debe llegar completo al cliente suscriptor.
4
Los datos tienen sentido
La temperatura, la presión y la altitud deben ser coherentes con el entorno de prueba.

Creado con eXeLearning (Ventana nueva)