🛠 Publier et s'abonner en MQTT
Objectifs
Monter d'un cran vers le messaging IoT : connecter la GIGA R1 WiFi au WiFi, puis utiliser le protocole MQTT avec la bibliothèque PubSubClient pour publier une valeur toutes les 5 secondes et recevoir les messages d'un autre client. MQTT est le protocole natif d'Arduino IoT Cloud, que la carte accepte officiellement — ce tuto vous donne les bases pour comprendre ce qui se passe « sous » le cloud.
Matériel
- Carte Arduino GIGA R1 WiFi + antenne u.FL
- WiFi 2,4 GHz WPA2
- Bibliothèque PubSubClient (Michael Schwartzkopff / Nick O'Leary) installée via le Gestionnaire de bibliothèques de l'IDE
- Un broker MQTT accessible : le broker public de test
test.mosquitto.orgen 1883, ou votre propre Mosquitto local
Code complet
// 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 réseau;
PubSubClient mqtt(réseau);
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("échec 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 entrées analogiques 3.3 V
mqtt.publish(SUJET_PUB, v.c_str);
Serial.print("publie "); Serial.println(v);
}
}
Vérification attendue
Le moniteur affiche la connexion WiFi puis « connecté / abonné à ... », puis « publié <valeur> » toutes les 5 secondes. En publiant depuis un autre outil (mosquitto_pub -t giga/maison/salle/consigne -m 1) la LED de la carte s'allume et le message apparaît dans la console. Sur test.mosquitto.org, vous pouvez aussi vous abonner au topic publié depuis n'importe quel client.
Erreurs fréquentes
mqtt.loopoublié dansloop: sans appel régulier, le keepalive expire et le broker déconnecte la carte toutes les 60 s ; les messages reçus ne sont jamais distribués.- Port 8883 utilisé sans TLS : le port 8883 de mosquitto est en TLS ; avec
WiFiClientsimple, utilisez le 1883 (voir le tuto TLS pour le 8883). - Broker public saturé :
test.mosquitto.orgest partagé et parfois lent ; pour un projet sérieux, montez Mosquitto en local. - Topics non ASCII ou trop longs : gardez des identifiants simples (lettres, chiffres, /) ; les accents dans les topics cassent certains outils.
- Reconnexion mal gérée : après une coupure WiFi, il faut redéconnecter MQTT ET se réabonner — l'abonnement ne survit pas à la reconnexion.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton.inoArduinorespiration.inoArduinoanalogique.inoArduinodac-onde.inoArduinooled-i2c.inoArduino