¡Hola, futuros innovadores! En esta guía, nos adentraremos en el fascinante universo del Internet de las Cosas (IoT) y aprenderemos a comunicar dispositivos utilizando un protocolo clave: MQTT. ¿Listos para encender su primer LED remotamente? ¡Vamos a ello!
I. Introducción al IoT y MQTT: ¿Por qué y para qué?
Contexto del IoT
Imagina un mundo donde tus objetos cotidianos —desde tu cafetera hasta tu sistema de riego— pueden «hablar» entre sí y contigo. Eso es precisamente el Internet de las Cosas (IoT): una red de objetos físicos equipados con sensores, software y otras tecnologías que les permiten conectarse e intercambiar datos a través de internet. Esto nos permite automatizar tareas y optimizar procesos, impactando desde la domótica hasta la eficiencia energética (Patel & Patel, 2016).
Su esencia es la comunicación Máquina-a-Máquina (M2M), donde los dispositivos colaboran sin intervención humana directa (Patel & Patel, 2016). Para ti, como estudiante de bachillerato, comprender el IoT es fundamental, ya que moldea nuestro entorno y abre un sinfín de oportunidades de innovación (Hunkeler et al., 2008).
¿Qué es MQTT?
MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería ligero y flexible, construido sobre TCP/IP. Fue diseñado específicamente para entornos IoT, donde los dispositivos suelen tener recursos limitados y las conexiones pueden ser inestables. Su gran ventaja es que es sumamente eficiente y ligero, ideal para enviar pequeñas cantidades de datos de manera fiable.
Modelo Publicación/Suscripción: ¿Cómo se comunican los dispositivos?
El pilar central de la comunicación MQTT es el modelo de publicación/suscripción. Imagina que tienes una revista (el «tema») y varias personas interesadas en leerla. En lugar de enviar la revista a cada suscriptor individualmente, la dejas en un quiosco central. Aquellos interesados simplemente van al quiosco y recogen su copia.
En MQTT, funciona de manera similar:
- Un dispositivo (el Publicador) envía mensajes a un intermediario central llamado Broker.
- Otros dispositivos (los Suscriptores) le dicen al Broker qué tipo de mensajes les interesan, es decir, a qué «temas» o «tópicos» quieren suscribirse.
- El Broker se encarga de recibir los mensajes del Publicador y reenviarlos a todos los Suscriptores interesados en ese tema.
Este modelo es clave porque desacopla al emisor del receptor. El publicador no necesita saber quiénes son los suscriptores, y viceversa. Esto simplifica enormemente la gestión de sistemas con muchos dispositivos.
Conceptos Clave de MQTT
- Broker (Agente): Es el servidor central, como el cerebro de nuestro sistema IoT. Recibe todos los mensajes de los Publicadores y los distribuye a los Suscriptores correctos. Todos los clientes MQTT se conectan a él, formando una estructura en estrella.
- Cliente: Cualquier dispositivo que interactúa con el Broker. Puede ser nuestro ESP32, tu teléfono móvil con la aplicación, o incluso un servidor. Un cliente puede ser un Publicador (envía información, como un sensor de temperatura) y/o un Suscriptor (recibe información al «registrarse» en un tópico).
- Tópico (Tema): Son las «categorías» o «direcciones» específicas a las que se envían o de las que se reciben mensajes. Se organizan jerárquicamente, como rutas de carpetas (ej.,
/hogar/sala/luz1
). Esto permite organizar la comunicación de manera muy efectiva.
El Rol del ESP32
El ESP32 es un microcontrolador de bajo costo con Wi-Fi y Bluetooth integrados. Es una placa ideal para nuestros proyectos IoT educativos porque nos permite construir dispositivos conectados sin grandes barreras económicas y se puede conectar a diversos sensores y actuadores. ¡Es el cerebro de nuestro hardware!
II. Configuración del Broker MQTT (Conexión No Segura para Aprender)
Para que nuestros dispositivos se comuniquen, necesitamos un Broker MQTT. Para esta guía inicial, priorizaremos la simplicidad usando un broker público gratuito.
Selección del Broker
Para simplificar el proceso inicial de aprendizaje, te recomiendo que uses un broker público y gratuito para pruebas, como HiveMQ Public MQTT Broker o RosarIoT Broker MQTT Gratis. Estos no requieren instalación, solo necesitas la dirección del servidor (URL o IP) y el puerto (generalmente 1883 para conexiones no seguras).
Importante: Para sistemas IoT en entornos reales o de producción, la conexión no segura que usaremos en este tutorial no es adecuada. Siempre se deben implementar conexiones seguras (SSL/TLS) para proteger los datos. Este tutorial prioriza la simplicidad para el aprendizaje inicial.
Verificación del Broker
Para verificar que el broker está funcionando y que puedes conectarte:
- Visita un Broker Público: Abre tu navegador y ve a HiveMQ o RosarIoT.
- Identifica la Dirección y Puerto: En estas páginas, encontrarás la dirección del broker (ej.
broker.hivemq.com
obroker.rosariot.com
) y el puerto (1883). ¡Anótalo! - Usa un Cliente MQTT de Escritorio/Web: Muchos brokers públicos ofrecen clientes web. Por ejemplo, HiveMQ tiene un «Websocket Client» en su sitio que te permite conectar y suscribirte a tópicos. Conéctate con la dirección y puerto que anotaste. Si la conexión es exitosa, ¡estás listo!
III. Preparación y Codificación del ESP32 para el LED
Ahora que tenemos nuestro broker, ¡es hora de preparar el ESP32 para controlar el LED!
Hardware Necesario
Aquí tienes lo que necesitarás para tu experimento:
- Placa ESP32: El cerebro de nuestro proyecto.
- 1 LED (Diodo Emisor de Luz): La luz que controlaremos.
- 1 Resistencia (aproximadamente 220-330 ohmios): Esencial para proteger el LED de una corriente excesiva.
- Protoboard (placa de pruebas): Para montar el circuito sin soldar.
- Cables Jumper (macho-macho): Para hacer las conexiones.
Diagrama de Conexión Simple para el LED al ESP32:
Para conectar el LED al ESP32:
- Conecta la pata larga del LED (ánodo) a la resistencia.
- Conecta el otro extremo de la resistencia a un pin digital del ESP32 (por ejemplo, GPIO 2).
- Conecta la pata corta del LED (cátodo) al pin GND (tierra) del ESP32.
Entorno de Desarrollo: Arduino IDE
Usaremos el Arduino IDE, un entorno de programación muy popular para microcontroladores.
- Descarga e Instalación: Descarga la última versión estable del IDE de Arduino desde su sitio oficial. Se recomienda usar el instalador (.exe para Windows) ya que incluye los drivers necesarios.
- Soporte ESP32 en Arduino IDE: Para que el Arduino IDE reconozca tu ESP32, necesitas añadir su soporte:
- Abre el Arduino IDE.
- Ve a
Archivo > Preferencias
. - En el campo «URLs Adicionales de Gestores de Tarjetas», añade la siguiente URL:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
. Si ya tienes otras URLs, sepáralas con una coma. - Haz clic en
OK
. - Ahora ve a
Herramientas > Placa > Gestor de Tarjetas...
- En el buscador, escribe «ESP32» y busca el paquete «esp32 by Espressif Systems». Haz clic en Instalar.
- Librería PubSubClient: Esta librería nos permitirá que nuestro ESP32 actúe como un cliente MQTT.
- En el Arduino IDE, ve a
Programa > Incluir Librería > Gestionar Librerías...
- En el buscador, escribe «PubSubClient».
- Busca «PubSubClient by Nick O’Leary» y haz clic en Instalar.
- En el Arduino IDE, ve a
Desarrollo del Código (Programación Textual con Arduino IDE)
Aquí tienes el código completo paso a paso para tu ESP32.
#include <WiFi.h>
#include <PubSubClient.h>
// --- CONFIGURACIÓN DE RED Y MQTT ---
const char* ssid = "TU_SSID"; // ¡CAMBIA ESTO! Nombre de tu red WiFi
const char* password = "TU_PASSWORD"; // ¡CAMBIA ESTO! Contraseña de tu red WiFi
const char* mqtt_server = "broker.hivemq.com"; // ¡CAMBIA ESTO! Dirección de tu broker MQTT (ej. broker.hivemq.com, broker.rosariot.com)
const int mqtt_port = 1883; // Puerto estándar para MQTT no seguro
// --- DEFINICIONES DE HARDWARE ---
const int ledPin = 2; // Pin GPIO donde conectaste el LED (ej. GPIO 2)
// --- TÓPICOS MQTT ---
#define MQTT_TOPIC_CONTROL "/casa/mi_led/control" // Tópico para controlar el LED
// --- OBJETOS DE CONEXIÓN ---
WiFiClient espClient;
PubSubClient client(espClient);
// --- FUNCIONES ---
// Función para conectar a la red WiFi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Conectado!");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
// Función que se ejecuta cuando se recibe un mensaje MQTT
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido [");
Serial.print(topic);
Serial.print("] ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// Comprueba si el mensaje es para el tópico de control del LED
if (String(topic) == MQTT_TOPIC_CONTROL) {
if (message == "1" || message == "on") {
digitalWrite(ledPin, HIGH); // Enciende el LED
Serial.println("LED ENCENDIDO");
} else if (message == "0" || message == "off") {
digitalWrite(ledPin, LOW); // Apaga el LED
Serial.println("LED APAGADO");
}
}
}
// Función para reconectar al broker MQTT
void reconnect() {
while (!client.connected()) {
Serial.print("Intentando conexión MQTT...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX); // Genera un ID de cliente único
if (client.connect(clientId.c_str())) {
Serial.println("conectado al broker!");
// Una vez conectado, establece la función callback para manejar mensajes
client.setCallback(callback); // IMPORTANTE: Establecer el callback aquí
client.subscribe(MQTT_TOPIC_CONTROL); // Suscribirse al tópico de control
Serial.print("Suscrito a tópico: ");
Serial.println(MQTT_TOPIC_CONTROL);
} else {
Serial.print("falló, rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
// --- SETUP PRINCIPAL ---
void setup() {
Serial.begin(115200); // Inicia la comunicación serial para depuración
pinMode(ledPin, OUTPUT); // Define el pin del LED como salida
digitalWrite(ledPin, LOW); // Asegura que el LED esté apagado al inicio
setup_wifi(); // Conecta al WiFi
client.setServer(mqtt_server, mqtt_port); // Configura la dirección y puerto del broker MQTT
client.setCallback(callback); // Establece la función para manejar los mensajes MQTT entrantes
}
// --- LOOP PRINCIPAL ---
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop(); // Este método es crucial para procesar mensajes y mantener la conexión
}
Puntos clave del código:
setup_wifi()
: Conecta tu ESP32 a tu red WiFi. ¡No olvides cambiarTU_SSID
yTU_PASSWORD
!reconnect()
: Gestiona la conexión con el broker MQTT. Si se pierde la conexión, intenta reconectar automáticamente.callback()
: Esta función se ejecuta cada vez que el ESP32 recibe un mensaje en un tópico al que está suscrito. Aquí, se verifica si el mensaje es para controlar el LED (/casa/mi_led/control
) y, según el valor recibido («1» o «on» para encender, «0» o «off» para apagar), el LED se activa o desactiva.setup()
: Se ejecuta una vez al inicio. Configura el pin del LED, la comunicación serial, la conexión WiFi y el servidor MQTT.loop()
: Se ejecuta repetidamente. Asegura que el ESP32 esté conectado al broker MQTT y procesa los mensajes entrantes (client.loop()
).
Subida y Depuración
- Conectar el ESP32: Conecta tu placa ESP32 a tu computadora usando un cable USB.
- Seleccionar Placa y Puerto: En el Arduino IDE, ve a
Herramientas > Placa
y selecciona tu modelo de ESP32 (ej., «ESP32 Dev Module»). Luego, enHerramientas > Puerto
, selecciona el puerto COM al que está conectado tu ESP32. - Subir el Código: Haz clic en el botón de Flecha hacia la derecha («Subir») en la barra de herramientas del Arduino IDE. El código se compilará y se subirá a tu ESP32.
- Monitor Serial: Una vez que el código se haya subido, abre el Monitor Serial (icono de lupa en la esquina superior derecha del IDE o
Herramientas > Monitor Serial
). Asegúrate de que la velocidad de baudios esté configurada a 115200. Aquí verás los mensajes de depuración, como la conexión WiFi y MQTT, y si el LED se enciende o apaga.
IV. Creación de la Aplicación Móvil con Kodular (App Inventor)
Ahora, crearemos una aplicación simple para controlar el LED desde tu teléfono. Usaremos Kodular, una herramienta de programación visual por bloques similar a App Inventor, que simplifica enormemente el desarrollo de aplicaciones Android sin necesidad de escribir código textual.
Entorno Kodular/App Inventor
- Accede a Kodular: Ve al sitio web de Kodular (creator.kodular.io) y regístrate o inicia sesión con tu cuenta de Google.
- Crear Nuevo Proyecto: Haz clic en «Create Project» y dale un nombre a tu aplicación (ej., «ControlLED_IoT»).
Diseño de la Interfaz
En la pestaña «Designer» de Kodular, arrastra y suelta los siguientes componentes:
- Un componente «Vertical Arrangement»: Configúralo para que tenga
Width: Fill Parent
yHeight: Fill Parent
para ocupar toda la pantalla. - Dentro del «Vertical Arrangement», arrastra:
- Un «Label»: Cambia su
Text
a «Control de LED IoT». - Un «Button»: Nómbralo
Button_On
y cambia suText
a «Encender LED». - Otro «Button»: Nómbralo
Button_Off
y cambia suText
a «Apagar LED».
- Un «Label»: Cambia su
¡Puedes personalizar los colores y el tamaño de la fuente para que se vea bien!
Integración MQTT
Kodular, al igual que App Inventor, no tiene un componente MQTT nativo de forma predeterminada, pero puedes integrar extensiones de terceros.
- Buscar e Importar Extensión MQTT: Necesitarás buscar una extensión
.aix
de MQTT compatible con Kodular/App Inventor. Un buen punto de partida es buscar en foros de la comunidad de App Inventor o Kodular por «MQTT Extension Kodular» o «App Inventor MQTT client». Una extensión popular suele ser la de «MQTT Client» de MIT App Inventor. Una vez que hayas descargado la extensión (.aix
):- En Kodular, ve a
Palette > Extension
(abajo del todo). - Haz clic en
Import Extension
. - Haz clic en
Choose File
y selecciona el archivo.aix
que descargaste. - Haz clic en
Import
.
- En Kodular, ve a
- Añadir el Componente MQTT a tu Pantalla: Después de importarla, verás la extensión MQTT en la sección «Extension» de tu Paleta. Arrástrala y suéltala en tu pantalla. Será un componente no visible.
Ahora, pasamos a la pestaña «Blocks» para programar la lógica:
Conexión al Broker MQTT
- En la sección Blocks, busca el componente MQTT que acabas de añadir.
- Cuando la pantalla (
Screen1.Initialize
) se inicie, llama al bloqueMQTT.Connect
. - Para los parámetros, usa los siguientes bloques de texto:
Server
: La dirección del broker que anotaste (ej.,broker.hivemq.com
).Port
:1883
.ClientID
: Genera uno único, por ejemplo,AppLED_
+ un número aleatorio o un identificador de tu dispositivo.Username
yPassword
: Déjalos vacíos para una conexión no segura.
Lógica de Envío de Mensajes
- Botón «Encender LED»:
- Busca el bloque
Button_On.Click
. - Dentro de este bloque, arrastra el bloque
MQTT.Publish
. - Para
Topic
, usa un bloque de texto con el mismo tópico que definiste en el ESP32:/casa/mi_led/control
. - Para
Message
, usa un bloque de texto con el valor1
(oon
).
- Busca el bloque
- Botón «Apagar LED»:
- Busca el bloque
Button_Off.Click
. - Dentro de este bloque, arrastra el bloque
MQTT.Publish
. - Para
Topic
, usa un bloque de texto con el mismo tópico:/casa/mi_led/control
. - Para
Message
, usa un bloque de texto con el valor0
(ooff
).
- Busca el bloque
Pruebas de la Aplicación
- Generar el APK: En Kodular, ve a
Export > Android App (.apk)
. - Instalar en tu Dispositivo: Una vez que el archivo
.apk
se descargue, transfiérelo a tu teléfono Android e instálalo (puede que necesites permitir la instalación de aplicaciones de fuentes desconocidas en la configuración de seguridad de tu teléfono). - Probar el Control: Abre la aplicación, asegúrate de que tu ESP32 esté encendido y conectado al WiFi y al broker. Toca los botones «Encender LED» y «Apagar LED». ¡Deberías ver cómo el LED en tu protoboard responde!
V. Verificación y Puesta en Marcha del Sistema
¡Felicidades, casi lo logramos! Ahora, vamos a asegurarnos de que todo funcione a la perfección.
Prueba Integral
- Enciende tu ESP32: Asegúrate de que tu ESP32 esté conectado a la fuente de alimentación (USB de la computadora o una externa) y que el código se esté ejecutando.
- Broker MQTT (o público): Confirma que tu broker MQTT esté activo y accesible (no necesitas hacer nada si estás usando un broker público, solo asegúrate de tener conexión a internet).
- Abre tu Aplicación Kodular: Inicia la aplicación que creaste en tu teléfono Android.
Monitoreo de Mensajes
Para una depuración efectiva y para entender el flujo de mensajes, puedes usar un cliente MQTT externo:
- HiveMQ Web Client: Si usas HiveMQ, puedes ir a su «Websocket Client» en su página web y suscribirte al tópico
/casa/mi_led/control
. - Clientes de Escritorio: Programas como MQTT Explorer (multiplataforma) o comandos de terminal como
mosquitto_sub -h broker.hivemq.com -p 1883 -t "/casa/mi_led/control"
(si tienes Mosquitto instalado localmente).
Al presionar los botones en tu aplicación Kodular, deberías ver los mensajes («1» o «0») aparecer instantáneamente en el cliente MQTT externo, confirmando que tu aplicación está publicando correctamente. Simultáneamente, en el Monitor Serial de Arduino, deberías ver el ESP32 recibiendo esos mensajes y actuando sobre ellos.
Depuración Visual
- Observa el LED: La forma más directa de depuración. Si presionas «Encender LED» y el LED no se enciende (o viceversa), algo anda mal.
- Monitor Serial del Arduino IDE: Es tu mejor amigo para depurar. Observa los mensajes que imprime el ESP32:
- ¿Se conecta al WiFi correctamente?
- ¿Se conecta al broker MQTT?
- ¿Muestra «Mensaje recibido» cuando presionas los botones en la app?
- ¿Imprime «LED ENCENDIDO» o «LED APAGADO»?
Si algo no funciona, revisa las credenciales WiFi, la dirección del broker, el puerto, y verifica que el tópico sea exactamente el mismo en el código del ESP32 y en la aplicación Kodular.
VI. Conclusiones y Próximos Pasos
¡Felicidades! 🎉 Has completado tu primer sistema IoT distribuido, controlando un LED con un ESP32 y una aplicación móvil, utilizando el protocolo MQTT.
Recapitulación de Aprendizajes
A lo largo de esta guía, has adquirido habilidades y conocimientos fundamentales en:
- Internet de las Cosas (IoT): Entendiendo cómo los objetos se conectan y comunican.
- MQTT: Comprendiendo su modelo publicación/suscripción, y la función de Brokers, Clientes y Tópicos.
- ESP32: Aprendiendo a programar este potente microcontrolador para interactuar con el mundo físico.
- Kodular (App Inventor): Desarrollando una interfaz móvil intuitiva sin necesidad de código complejo.
- Sistemas Distribuidos: Experimentando cómo diferentes componentes (app, broker, ESP32) trabajan juntos de forma desacoplada.
Has visto cómo la combinación de ESP32, MQTT y programación visual permite a los estudiantes desarrollar sistemas IoT funcionales y útiles. Además, los desafíos de depuración que pudiste haber enfrentado te ayudaron a cultivar la perseverancia y la capacidad de análisis, habilidades cruciales para la ingeniería.
Ideas para Futuros Proyectos
Este es solo el comienzo. Aquí tienes algunas ideas para seguir explorando:
- Añadir Sensores: Conecta un sensor de temperatura (como el DHT22) al ESP32. Publica las lecturas de temperatura a un nuevo tópico MQTT (ej.,
/casa/sala/temperatura
). Luego, en Kodular, suscríbete a ese tópico y muestra la temperatura en tiempo real en la aplicación. - Controlar Múltiples Dispositivos: Añade más LEDs o incluso un pequeño relé para controlar un dispositivo de 120V (¡siempre con la supervisión de un adulto y precauciones de seguridad!). Simplemente define nuevos tópicos.
- Funcionalidades Avanzadas de MQTT: Investiga sobre Quality of Service (QoS) en MQTT para asegurar la entrega de mensajes, o «Last Will and Testament» para que el broker notifique cuando un dispositivo se desconecta inesperadamente.
- Interfaces Más Complejas: Experimenta con otros componentes de Kodular para crear interfaces más interactivas y útiles.
- Integración con Bases de Datos y Análisis: Puedes explorar cómo integrar tus datos de sensores con bases de datos para almacenamiento y análisis estadístico. Además, podrías investigar la incorporación de algoritmos de aprendizaje automático para que tu sistema aprenda de los datos. Por ejemplo, un algoritmo podría aprender del registro de datos de un sensor de humedad del suelo para predecir el riego óptimo, ajustándose a las necesidades de tus plantas a medida que «aprende según cómo se alimenta» con más datos, tal como Yohana mencionó. ¡Esto te acerca al fascinante mundo de la inteligencia de datos y automatización avanzada!
Seguridad (¡Recordatorio Importante!)
Es fundamental recordar que, para sistemas IoT en entornos reales o de producción, la conexión no segura que usamos en este tutorial no es adecuada. Siempre se deben implementar conexiones seguras (SSL/TLS) para proteger los datos de ser interceptados o manipulados. Este tutorial priorizó la simplicidad para el aprendizaje inicial, pero la seguridad es un paso crítico en el desarrollo avanzado de IoT.
Referencias Bibliográficas
- Arduino. (s.f.). Software. Recuperado de https://www.arduino.cc/en/software
- Bevywise. (n.d.). MQTT Reconnect. Recuperado de https://www.bevywise.com/mqtt-reconnect/
- Hunkeler, P., Thoma, Y., & Villegas, L. (2008). MQTT-S: A publish/subscribe protocol for wireless sensor networks. En 2008 5th Annual IEEE Communications Society Conference on Sensor, Mesh and Ad Hoc Communications and Networks (SECON) (pp. 576-582). IEEE.
- Patel, K., & Patel, S. M. (2016). Internet of Things-IoT: Potential applications and future challenges. En 2016 International Conference on Wireless Communications, Signal Processing and Networking (WiSPNET) (pp. 1195-1199). IEEE.