🛠 Nœud MQTT : télémétrie IMU et commandes à distance
Objectifs
Faire de la M5StickC Plus2 un nœud IoT complet : publication périodique de la télémétrie (accélération, tension batterie via la broche de détection G38) sur des topics MQTT, et abonnement à un topic de commande pour faire sonner le buzzer à distance. Bibliothèque PubSubClient sur le Wi-Fi 2,4 GHz.
Matériel
- 1× M5StickC Plus2 (v2)
- Broker MQTT accessible (ex.
test.mosquitto.orgen test, ou broker local) - Un client de test (Mosquitto CLI, MQTT Explorer) sur le PC
- Arduino IDE / PlatformIO : M5Unified + PubSubClient
Code complet
// Noeud MQTT : publie accel + batterie, recoit des ordres de bip
#include <M5Unified.h>
#include <WiFi.h>
#include <PubSubClient.h>
const char* SSID = "VOTRE_WIFI_24GHZ";
const char* PASS = "motdepasse";
const char* BROKER = "test.mosquitto.org"; // port 1883
const char* BASE = "stickc2/atelier/";
WiFiClient wifiNet;
PubSubClient mqtt(wifiNet);
uint32_t dernierEnvoi = 0;
void callback(char* topic, byte* payload, unsigned int len) {
String msg((char*)payload, len);
M5.Display.setCursor(0, 90);
M5.Display.printf("<-%s", msg.c_str);
int freq = msg.toInt;
if (freq > 40 && freq < 8000) M5.Speaker.tone(freq, 400); // buzzer G2
}
void setup {
auto cfg = M5.config;
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.setTextSize(1);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASS);
while (WiFi.waitForConnectResult != WL_CONNECTED) delay(2000);
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(callback);
while (!mqtt.connect("stickc2plus2")) delay(1000);
String cmd = String(BASE) + "cmd";
mqtt.subscribe(cmd.c_str);
}
void loop {
M5.update;
mqtt.loop;
if (!mqtt.connected) { // reconnexion + re-abonnement
if (mqtt.connect("stickc2plus2")) {
String cmd = String(BASE) + "cmd";
mqtt.subscribe(cmd.c_str);
}
}
if (millis - dernierEnvoi > 2000) {
dernierEnvoi = millis;
float ax, ay, az;
M5.Imu.getAccel(&ax, &ay, &az);
String t = String(BASE) + "accel";
char json[96];
snprintf(json, sizeof json, "{\"ax\":%.2f,\"ay\":%.2f,\"az\":%.2f}", ax, ay, az);
mqtt.publish(t.c_str, json);
// Tension batterie : broche de detection G38 (ADC1) — la conversion
// brute -> pourcentage n'est pas documentee :
// >
uint32_t batt = mqtt.publish((String(BASE) + "batt").c_str,
String(analogRead(38)).c_str);
(void)batt;
M5.Display.setCursor(0, 20);
M5.Display.printf("pub accel OK RSSI %d\n", WiFi.RSSI);
}
vTaskDelay(20 / portTICK_PERIOD_MS);
}
Vérification attendue
Avec mosquitto_sub -h test.mosquitto.org -t 'stickc2/atelier/#', on voit arriver toutes les 2 s le JSON d'accélération et la valeur brute batterie. Publier 880 sur stickc2/atelier/cmd fait retentir le buzzer 400 ms et affiche la commande à l'écran.
Erreurs fréquentes
- Publier sans appeler
mqtt.looprégulièrement : les ACK et la réception de commandes ne fonctionnent pas. - Oublier de se réabonner après une reconnexion : la télémétrie repart, les commandes restent muettes.
- Broker en
mqtts://(TLS, port 8883) avec un simple WiFiClient : il faut WiFiClientSecure. - Lire la batterie sur G25/G26 : ces broches ADC2 sont inutilisables Wi-Fi actif ; la détection batterie officielle est sur G38 (ADC1).
- Convertir l'ADC brut en pourcentage sans courbe de référence : la doc officielle ne donne pas la loi de décharge des 200 mAh — afficher la valeur brute ou calibrer soi-même.
- Flood de publications à 10 Hz sur un broker public : throttler à 0,5–1 Hz et garder la marge de la batterie.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino