🛠 Nœud MQTT : télémétrie IMU et commandes à distance
Objetivos
Convertir la M5StickC Plus2 en un nodo IoT completo: publicación periódica de la telemetría (aceleración, voltaje de batería a través del pin de detección G38) en topics MQTT, y suscripción a un topic de comando para activar el zumbador a distancia. Biblioteca PubSubClient sobre Wi-Fi de 2,4 GHz.
Material
- 1× M5StickC Plus2 (v2)
- Broker MQTT accesible (p. ej.,
test.mosquitto.orgpara pruebas, o broker local) - Un cliente de prueba (Mosquitto CLI, MQTT Explorer) en el PC
- Arduino IDE / PlatformIO: M5Unified + PubSubClient
Código completo
// 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);
}
Verificación esperada
Con mosquitto_sub -h test.mosquitto.org -t 'stickc2/atelier/#', se observa la llegada cada 2 s del JSON de aceleración y el valor bruto de la batería. Publicar 880 en stickc2/atelier/cmd hace sonar el zumbador durante 400 ms y muestra el comando en la pantalla.
Errores frecuentes
- Publicar sin llamar a
mqtt.loopregularmente: los ACK y la recepción de comandos no funcionan. - Olvidar volver a suscribirse tras una reconexión: la telemetría se reanuda, pero los comandos permanecen silenciosos.
- Broker en
mqtts://(TLS, puerto 8883) con un simple WiFiClient: se necesita WiFiClientSecure. - Leer la batería en G25/G26: estos pines ADC2 son inutilizables con Wi-Fi activo; la detección oficial de batería está en G38 (ADC1).
- Convertir el valor ADC bruto a porcentaje sin una curva de referencia: la documentación oficial no proporciona la ley de descarga de los 200 mAh — mostrar el valor bruto o calibrar por uno mismo.
- Flood de publicaciones a 10 Hz en un broker público: limitar a 0,5–1 Hz y mantener margen de batería.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino