🛠 Publier et s'abonner en MQTT
Objetivos
Dar un paso más hacia la mensajería IoT: conectar la GIGA R1 WiFi al WiFi, y luego utilizar el protocolo MQTT con la biblioteca PubSubClient para publicar un valor cada 5 segundos y recibir mensajes de otro cliente. MQTT es el protocolo nativo de Arduino IoT Cloud, que la tarjeta acepta oficialmente — este tutorial te da las bases para entender lo que ocurre «debajo» de la nube.
Material
- Tarjeta Arduino GIGA R1 WiFi + antena u.FL
- WiFi 2,4 GHz WPA2
- Biblioteca PubSubClient (Michael Schwartzkopff / Nick O'Leary) instalada mediante el Gestor de bibliotecas del IDE
- Un broker MQTT accesible: el broker público de prueba
test.mosquitto.orgen el puerto 1883, o tu propio Mosquitto local
Código completo
// GIGA R1 WiFi — MQTT publish/subscribe (MQTT brut port 1883, sans TLS)
#include <WiFi.h>
#include <PubSubClient.h>
const char SSID[] = "your-ssid";
const char PASS[] = "your-pass";
const char BROKER[] = "test.mosquitto.org";
const int PORT_BROKER = 1883;
const char SUJET_PUB[] = "giga/maison/salle/capteur";
const char SUJET_SUB[] = "giga/maison/salle/consigne";
WiFiClient reseau;
PubSubClient mqtt(reseau);
unsigned long dernierEnvoi = 0;
void callback(char* sujet, byte* payload, unsigned int longueur) {
Serial.print("Recu sur "); Serial.print(sujet); Serial.print(" : ");
for (unsigned int i = 0; i < longueur; i++) Serial.write(payload[i]);
Serial.println;
digitalWrite(LED_BUILTIN, mqtt.payload[0] == '1' ? HIGH : LOW);
}
void setup {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
WiFi.begin(SSID, PASS);
while (WiFi.status != WL_CONNECTED) { Serial.print("."); delay(200); }
Serial.print("IP "); Serial.println(WiFi.localIP);
mqtt.setServer(BROKER, PORT_BROKER);
mqtt.setCallback(callback);
while (!mqtt.connected) {
Serial.print("Connexion MQTT...");
if (mqtt.connect("giga-r1")) { // client id "giga-r1"
Serial.println("connecte");
mqtt.subscribe(SUJET_SUB);
Serial.print("abonne a "); Serial.println(SUJET_SUB);
} else {
Serial.print("echec rc="); Serial.println(mqtt.state);
delay(2000);
}
}
}
void loop {
mqtt.loop; // indispensable : keepalive + reception
if (WiFi.status != WL_CONNECTED) { mqtt.disconnect; WiFi.reconnect; return; }
if (!mqtt.connected) { mqtt.connect("giga-r1"); mqtt.subscribe(SUJET_SUB); return; }
if (millis - dernierEnvoi > 5000) {
dernierEnvoi = millis;
String v = String(analogRead(A0)); // 12 entrees analogiques 3.3 V
mqtt.publish(SUJET_PUB, v.c_str);
Serial.print("publie "); Serial.println(v);
}
}
Verificación esperada
El monitor muestra la conexión WiFi y luego «conectado / suscrito a ...», seguido de «publicado <valor>» cada 5 segundos. Al publicar desde otra herramienta (mosquitto_pub -t giga/maison/salle/consigne -m 1), el LED de la tarjeta se enciende y el mensaje aparece en la consola. En test.mosquitto.org, también puedes suscribirte al topic publicado desde cualquier cliente.
Errores frecuentes
mqtt.loopolvidado enloop: sin una llamada regular, el keepalive expira y el broker desconecta la tarjeta cada 60 s; los mensajes recibidos nunca se distribuyen.- Puerto 8883 utilizado sin TLS: el puerto 8883 de mosquitto usa TLS; con un
WiFiClientsimple, utiliza el puerto 1883 (consulta el tutorial de TLS para el puerto 8883). - Broker público saturado:
test.mosquitto.orges compartido y a veces lento; para un proyecto serio, instala Mosquitto localmente. - Topics no ASCII o demasiado largos: mantén identificadores simples (letras, números, /); los acentos en los topics rompen algunas herramientas.
- Reconexión mal gestionada: tras una caída de WiFi, es necesario reconectar MQTT Y volver a suscribirse — la suscripción no sobrevive a la reconexión.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino