Recepción de mensajes MQTT mostrados en un display LCD con ESP32

En la entrega siguiente de nuestro tutorial sobre MQTT, el enfoque estará puesto en el elemento del publicador. Este se ha implementado a través de una placa ESP32 S3, aunque es importante señalar que cualquier placa compatible con el framework de Arduino serviría para este propósito. En el esquema del protocolo MQTT, el rol del publicador es de carácter síncrono; es decir, publica datos tan pronto como estos se encuentran disponibles.

Componentes importantes:

  • WiFiClient espClient: Es el cliente que gestionará la conexión WiFi.
  • PubSubClient client(espClient): Se encargará de las operaciones MQTT. Utiliza espClient para manejar la parte de red.

El framework de arduino consiste en dos funciones. una función setup que se ejecuta una sola vez y otra función loop que se repite en bucle.

Función setup()

La función setup() es la primera que se ejecuta cuando arranca el programa. Se ejecuta una sola vez y aquí es donde se realizan las configuraciones iniciales.

Usaremos la comunicación serial para usarla como «consola»

Serial.begin(9600);
Serial.println("Demo mqtt con AHT20");

Configuración del Sensor AHT20

if (!aht.begin())
{
  Serial.println("No encontró el sensor AHT?");
  while (1)
    delay(10);
}
Serial.println("AHT20 encontrado!");

Estas líneas intentan inicializar el sensor AHT20. Si no se encuentra el sensor, el programa se detiene indefinidamente (while (1) delay(10);). Si se encuentra, imprime un mensaje de confirmación. «AHT20 encontrado»

Conexión WiFi

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
  delay(500);
  Serial.print(".");
}
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());

Estas líneas intentan conectarse a la red WiFi especificada por las variables ssid y password. Una vez que se establece la conexión, se imprime la dirección IP local asignada al ESP.

Configuración de Cliente MQTT

client.setServer(mqtt_server, mqtt_port);

Esta línea configura la dirección IP y el puerto del servidor MQTT al que se va a conectar. Esto no inicia la conexión, sólo la prepara.

Función loop()

La función loop() es el corazón del programa y se ejecuta indefinidamente una vez que ha terminado setup().

Lectura del Sensor AHT20

sensors_event_t e_humedad, e_temp;
aht.getEvent(&e_humedad, &e_temp);

Aquí estás utilizando la biblioteca Adafruit para leer los valores del sensor AHT20. Los datos se almacenan en las variables e_humedad y e_temp. ¿Sabéis porque llevan los operadores & las variables e_humedad y &e_temp?

Verificación de Conexión MQTT

if (!client.connected())
{
  reconnect();
}
client.loop();

Estas líneas verifican si el cliente MQTT está conectado. Si no es así, se invoca la función reconnect() para intentar establecer la conexión nuevamente. La función client.loop() se encarga de mantener la conexión activa y gestionar las llegadas de mensajes.

Publicación de Datos

if (now - lastMsg > 10000)
{
  ...
  client.publish("esp32/temperatura", msgt);
  client.publish("esp32/humedad", msgh);
}

Este bloque se ejecuta cada 10 segundos (10,000 milisegundos). Aquí, los datos de temperatura y humedad se formatean como cadenas de texto y luego se publican en los temas «esp32/temperatura» y «esp32/humedad» del servidor MQTT.

Función reconnect()

La función reconnect() intenta reconectar al cliente MQTT en caso de que la conexión se pierda. Utiliza una estructura de bucle para seguir intentando hasta que se restablece la conexión.

void reconnect()
{
  // Loop hasta que estemos reconectados
  while (!client.connected())
  {
    Serial.print("Intentando conexión MQTT...");
    // Intentar conectar
    if (client.connect("ESP32Client"))
    {
      Serial.println("conectado");
    }
    else
    {
      Serial.print("falló, rc=");
      Serial.print(client.state());
      Serial.println(" intentar de nuevo en 5 segundos");
      // Esperar 5 segundos antes de volver a intentar
      delay(5000);
    }
  }

Estas líneas intentan conectar el cliente MQTT con el ID de cliente «ESP32Client». Si la conexión es exitosa, imprime «conectado».

Equema eléctrico.

El ESP32 S3 tiene los pines de I2C configurados con pin número 9 SCL y pin número 8 SDA por defecto. El cable amarillo lleva los datos de reloj SCL y el naranja los datos SDA (tengo esa costumbre para el protocolo I2C) los otros dos cables son la alimentación a 3.3V del sensor.

Conclusión:

En este post, hemos explorado un caso práctico de cómo construir un publicador MQTT utilizando una placa ESP32 S3 y un sensor AHT20 para medir temperatura y humedad. A través de esta implementación, hemos logrado comprender no solo cómo extraer datos del sensor, sino también cómo administrar de forma efectiva las conexiones WiFi y MQTT. Este proyecto sirve como un excelente punto de partida para cualquier persona interesada en el mundo del IoT, demostrando que con componentes relativamente simples y librerías potentes, podemos configurar un sistema de monitoreo en tiempo real robusto y escalable.

Es importante subrayar la flexibilidad del código: aunque hemos empleado una placa ESP32 S3, el programa es lo suficientemente versátil como para ser adaptado a otros microcontroladores compatibles con Arduino.

En el entorno cada vez más conectado en el que vivimos, entender y aplicar protocolos como MQTT se convierte en una habilidad invaluable. Los conocimientos adquiridos aquí pueden extenderse a una variedad de aplicaciones, desde domótica hasta soluciones empresariales de IoT. Esperamos que este artículo haya gustado y te animo a que lo hagas tu mismo.

Referencias:

Código fuente:

https://github.com/elrincondeada/mqttdemo

Deja una respuesta

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