MT06 - Networking¶
ESP32¶

El ESP32 es un microcontrolador potente y versátil, ideal para aplicaciones de Internet de las Cosas (IoT). Desarrollado por Espressif, cuenta con capacidades de Wi-Fi y Bluetooth integradas, lo que permite la comunicación inalámbrica entre dispositivos. Este microcontrolador es ideal para proyectos que requieren conectividad en red y una buena capacidad de procesamiento, como el envío y recepción de datos a través de protocolos de comunicación en la nube.
MQTT (Message Queuing Telemetry Transport)¶

MQTT es un protocolo de comunicación ligero diseñado para la transmisión de datos en redes con ancho de banda limitado o en aplicaciones IoT donde la eficiencia es crucial. MQTT utiliza un modelo de publicador/suscriptor: los dispositivos (clientes) pueden publicar mensajes en “tópicos” específicos o suscribirse a estos tópicos para recibir mensajes. Un broker MQTT (servidor) gestiona la distribución de los mensajes entre los clientes suscritos. Este modelo es útil para conectar múltiples dispositivos, ya que permite una comunicación eficiente sin requerir conexiones punto a punto.
Wokwi¶

Wokwi es un simulador de hardware en línea que permite desarrollar y probar código en microcontroladores como el ESP32, Arduino y Raspberry Pi, sin necesidad de hardware físico. Es una herramienta útil para pruebas de concepto y para el desarrollo de prototipos, ya que facilita la experimentación y el ajuste de código en un entorno controlado.
Eclipse MQTT Broker y Public MQTT Brokers¶

Para implementar MQTT en Wokwi, es necesario el uso de un public MQTT broker. Existen múltiples opciones de brokers públicos, como Eclipse Mosquitto, broker.hivemq.com, y otros. Estos brokers permiten la prueba de aplicaciones IoT en un entorno compartido sin necesidad de configurar un servidor propio, lo cual es ideal para prototipos y pruebas.
Arduino Web Editor¶

Arduino Web Editor es una plataforma en línea proporcionada por Arduino para programar y gestionar proyectos en microcontroladores desde cualquier navegador con acceso a internet. Permite editar y cargar código directamente a placas compatibles, como el Arduino y ESP32, sin necesidad de instalar un software local. Entre sus ventajas destacan: - Acceso desde cualquier lugar: Solo necesitas un navegador y conexión a internet para acceder a tus proyectos y cargar código a tus placas. Compatibilidad de placas: Soporta una amplia variedad de placas de Arduino y algunas de terceros, lo que permite trabajar con diversos microcontroladores. - Bibliotecas y soporte en la nube: Dispone de una biblioteca integrada en la nube, facilitando el uso de librerías sin preocuparse por instalaciones adicionales. - Colaboración y respaldo: Guarda automáticamente el código en tu cuenta de Arduino, lo que facilita compartir y respaldar tus proyectos.
El uso de Arduino Web Editor simplifica la programación, especialmente en entornos educativos o colaborativos, permitiendo que estudiantes y profesionales puedan trabajar en sus proyectos sin restricciones de dispositivo o ubicación.
Paso a Paso de la Práctica¶
Paso 1: Configuración del Simulador Wokwi¶
Ingreso al simulador Wokwi en el navegador y se agregan dos placas ESP32 en dos pestañas diferentes. Se configura cada ESP32 como un nodo MQTT. Uno actuará como publicador (enviando datos de un botón o potenciómetro), y el otro como suscriptor (recibiendo los datos y actuando en consecuencia).
Paso 2: Configuración del Broker MQTT en Wokwi¶
En cada pestaña, se configura la conexión MQTT especificando un broker público, como broker.hivemq.com. Se define un tópico común (en este caso esp32/input) para que ambos ESP32 se comuniquen de forma correcta.
Paso 3: Código para el Publicador (ESP32 A)¶
En el ESP32 A, se lee el estado de un botón conectado al microcontrolador y se publica el resultado en el tópico MQTT. Se declaran las variables de red y configuración del broker. En setup(), se conecta el ESP32 a Wi-Fi y se configura el broker MQTT. En loop(), se ferifica el estado del botón. Si el botón está presionado, se publica el mensaje “ON”; de lo contrario, se publica “OFF”.
Aquí está el código del publicador:
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
int buttonPin = 2;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado a WiFi");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Intentando conectar al broker MQTT...");
if (client.connect("ESP32A")) {
Serial.println(" Conectado al broker MQTT");
} else {
Serial.print(" Error de conexión, rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
client.publish("esp32/input", "ON");
Serial.println("Mensaje enviado: ON");
} else {
client.publish("esp32/input", "OFF");
Serial.println("Mensaje enviado: OFF");
}
delay(1000);
}
Paso 4: Código para el Suscriptor (ESP32 B)¶
En el ESP32 B, se suscribe al tópico y, cuando se recibe un mensaje de “ON” o “OFF”, se enciende o apaga un LED respectivamente. Se declaran las variables de red y configuración del broker. En setup(), se configura el LED y se suscribe el ESP32 al tópico esp32/input. En la función callback, se definen las acciones a realizar cuando se recibe un mensaje.
Aquí está el código del suscriptor:
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
int ledPin = 4;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado a WiFi");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Intentando conectar al broker MQTT...");
if (client.connect("ESP32B")) {
Serial.println(" Conectado al broker MQTT");
client.subscribe("esp32/input");
Serial.println(" Suscrito al tópico: esp32/input");
} else {
Serial.print(" Error de conexión, rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Mensaje recibido en el tópico ");
Serial.print(topic);
Serial.print(": ");
Serial.println(message);
if (message == "ON") {
digitalWrite(ledPin, HIGH);
Serial.println("LED encendido");
} else if (message == "OFF") {
digitalWrite(ledPin, LOW);
Serial.println("LED apagado");
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Paso 5: Pruebas en Wokwi¶
Se cargó el código en ambas pestañas y se ejecutó la simulación. Se verificó en el monitor serie de ambas pestañas. Si todo está configurado correctamente, cuando se presiona el botón en el ESP32 A, el LED en el ESP32 B debería encenderse o apagarse, dependiendo del mensaje MQTT enviado. Cómo se puede apreciar en el siguiente video, este flujo permite una comunicación básica entre dispositivos usando MQTT, facilitando el control remoto entre placas ESP32.
Paso 6: Conección placa física - placa en simulador¶
Para realizar la comunicación entre la placa física (ESP32 A) y la segunda placa (simulada en Wokwi), se configuró para conectarse a una red Wi-Fi local ingresando el nombre y la contraseña correspondientes. En el simulador Wokwi, el ESP32 B se conectó a la red predeterminada “Wokwi-GUEST”. Ambos dispositivos (ESP32 físico y en Wokwi) se conectaron al mismo broker MQTT público (broker.hivemq.com) para asegurar que puedan comunicarse, independientemente de la red en la que estén. Ambos dispositivos se configuraron para publicar y suscribirse al mismo tópico (esp32/input), asegurando la comunicación en ambas direcciones. Se utilizaron mensajes en el monitor serie para confirmar que el ESP32 físico y el de Wokwi estaban conectados al broker y suscritos correctamente al tópico compartido.
En esta actividad, logramos establecer comunicación entre una placa ESP32 física y una placa ESP32 en el simulador Wokwi a través del protocolo MQTT, lo que nos permitió controlar un actuador remoto en el simulador mediante el estado de un sensor en el dispositivo físico. Este ejercicio consolidó conceptos clave de la IoT, como la publicación y suscripción a tópicos MQTT, la configuración de redes Wi-Fi y la integración de hardware virtual y físico. El uso de un broker MQTT público fue fundamental para lograr esta interacción en redes diferentes, lo que demuestra la versatilidad y escalabilidad del protocolo MQTT en aplicaciones de control remoto. Además, la actividad nos permitió enfrentar y resolver desafíos de conectividad y depuración en dispositivos de distinta naturaleza, acercándonos a un entorno de IoT real. Esta experiencia nos proporciona una base sólida para proyectos más complejos de automatización y control distribuidos los cuales tienen gran compatibilidad con nuestro trayecto académico en la EFDI.