8.4 Comunicación IoT con MQTT

Este proyecto se centra en el uso de MQTT, un protocolo de comunicación popular en el dominio de Internet de las Cosas (IoT). MQTT permite a los dispositivos IoT intercambiar datos mediante un modelo de publicación/suscripción, donde los dispositivos comunican a través de temas.

En este proyecto, exploramos la implementación de MQTT construyendo un circuito que incluye un LED, un botón y un termistor. Se utiliza el microcontrolador ESP32-WROOM-32E para establecer una conexión WiFi y comunicarse con un broker MQTT. El código permite al microcontrolador suscribirse a temas específicos, recibir mensajes y controlar el LED basado en la información recibida. Adicionalmente, el proyecto demuestra la publicación de datos de temperatura del termistor a un tema designado cuando se presiona el botón.

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit de Inicio ESP32

320+

ESP32 Starter Kit

También puedes comprarlos por separado desde los siguientes enlaces.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

ESP32 WROOM 32E

BUY

Extensión de Cámara ESP32

-

Protoboard

BUY

Cables Puente

BUY

Resistor

BUY

LED

BUY

Botón

BUY

Termistor

BUY

Carga del Código

  1. Construye el circuito.

    Nota

    Al establecer una conexión WiFi, solo se pueden emplear los pines 36, 39, 34, 35, 32, 33 para la lectura analógica. Por favor, asegúrate de que el termistor esté conectado a estos pines designados.

    ../../_images/iot_4_matt_bb.png
  2. Luego, conecta el ESP32-WROOM-32E al computador usando el cable USB.

    ../../_images/plugin_esp32.png
  3. Abre el código.

    • Abre el archivo iot_4_mqtt.ino ubicado en el directorio esp32-starter-kit-main\c\codes\iot_4_mqtt, o copia el código en el IDE de Arduino.

    • Después de seleccionar la placa (ESP32 Dev Module) y el puerto apropiado, haz clic en el botón Upload.

    • ¿Siempre aparece «COMxx desconocido»?

    • Aquí se utiliza la biblioteca PubSubClient, la puedes instalar desde el Administrador de Bibliotecas.

      ../../_images/mqtt_lib.png
  4. Localiza las siguientes líneas y modifícalas con tu <SSID> y <PASSWORD>.

    // Replace the next variables with your SSID/Password combination
    const char* ssid = "<SSID>";
    const char* password = "<PASSWORD>";
    
  5. Encuentra la siguiente línea y modifica tu unique_identifier. Asegúrate de que tu identificador_único sea realmente único ya que cualquier ID que sea idéntico intentando iniciar sesión en el mismo broker MQTT puede resultar en un fallo de inicio de sesión.

    // Add your MQTT Broker address, example:
    const char* mqtt_server = "broker.hivemq.com";
    const char* unique_identifier = "sunfounder-client-sdgvsda";
    

Suscripción a Temas

  1. Para evitar interferencias de mensajes enviados por otros participantes, puedes configurarlo como una cadena oscura o poco común. Simplemente reemplaza el tema actual SF/LED con el nombre de tema que desees.

    Nota

    Tienes la libertad de establecer el Tema con cualquier carácter que desees. Cualquier dispositivo MQTT que se haya suscrito al mismo Tema podrá recibir el mismo mensaje. También puedes suscribirte simultáneamente a múltiples Temas.

    void reconnect() {
        // Loop until we're reconnected
        while (!client.connected()) {
            Serial.print("Attempting MQTT connection...");
            // Attempt to connect
            if (client.connect(unique_identifier)) {
                Serial.println("connected");
                // Subscribe
                client.subscribe("SF/LED");
            } else {
                Serial.print("failed, rc=");
                Serial.print(client.state());
                Serial.println(" try again in 5 seconds");
                // Wait 5 seconds before retrying
                delay(5000);
            }
        }
    }
    
  2. Modifica la funcionalidad para responder al tema suscrito. En el código proporcionado, si se recibe un mensaje en el tema SF/LED, verifica si el mensaje es on o off. Dependiendo del mensaje recibido, cambia el estado de salida para controlar el estado de encendido o apagado del LED.

    Nota

    Puedes modificarlo para cualquier tema al que estés suscrito, y puedes escribir múltiples declaraciones if para responder a múltiples temas.

    void callback(char* topic, byte* message, unsigned int length) {
        Serial.print("Message arrived on topic: ");
        Serial.print(topic);
        Serial.print(". Message: ");
        String messageTemp;
    
        for (int i = 0; i < length; i++) {
            Serial.print((char)message[i]);
            messageTemp += (char)message[i];
        }
        Serial.println();
    
        // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off".
        // Changes the output state according to the message
        if (String(topic) == "SF/LED") {
            Serial.print("Changing state to ");
            if (messageTemp == "on") {
                Serial.println("on");
                digitalWrite(ledPin, HIGH);
            } else if (messageTemp == "off") {
                Serial.println("off");
                digitalWrite(ledPin, LOW);
            }
        }
    }
    
  3. Tras seleccionar la placa correcta (ESP32 Dev Module) y puerto, haz clic en el botón Subir.

  4. Abre el monitor serial y si se imprime la siguiente información, indica una conexión exitosa al servidor MQTT.

    WiFi connected
    IP address:
    192.168.18.77
    Attempting MQTT connection...connected
    

Publicación de Mensajes via HiveMQ

HiveMQ es una plataforma de mensajería que funciona como un broker MQTT, facilitando la transferencia de datos rápida, eficiente y fiable a dispositivos IoT.

Nuestro código utiliza específicamente el broker MQTT proporcionado por HiveMQ. Hemos incluido la dirección del broker MQTT de HiveMQ en el código de la siguiente manera:

// Add your MQTT Broker address, example:
const char* mqtt_server = "broker.hivemq.com";
  1. Actualmente, abre el HiveMQ Web Client en tu navegador web.

  2. Conecta el cliente al proxy público predeterminado.

    ../../_images/sp230512_092258.png
  3. Publica un mensaje en el Tema al que te has suscrito. En este proyecto, puedes publicar on o off para controlar tu LED.

    ../../_images/sp230512_140234.png

Publicación de Mensajes a MQTT

También podemos utilizar el código para publicar información en el Tema. En esta demostración, hemos codificado una característica que envía la temperatura medida por el termistor al Tema cuando presionas el botón.

  1. Haz clic en Añadir Nueva Suscripción al Tema.

    ../../_images/sp230512_092341.png
  2. Rellena los temas que deseas seguir y haz clic en Suscribirse. En el código, enviamos información de la temperatura al tema SF/TEMP.

    void loop() {
        if (!client.connected()) {
            reconnect();
        }
        client.loop();
    
        // if the button pressed, publish the temperature to topic "SF/TEMP"
        if (digitalRead(buttonPin)) {
                long now = millis();
                if (now - lastMsg > 5000) {
                lastMsg = now;
                char tempString[8];
                dtostrf(thermistor(), 1, 2, tempString);
                client.publish("SF/TEMP", tempString);
            }
        }
    }
    
  3. Por lo tanto, podemos monitorear este Tema en HiveMQ, permitiéndonos ver la información que has publicado.

    ../../_images/sp230512_154342.png