Exemple ESP32 pour Forge IoT¶
Statut : exemple pédagogique. Il montre comment un microcontrôleur
ESP32 publie une mesure conforme au contrat MQTT Forge IoT. C'est un
exemple de code, pas une dépendance Forge : Forge reste un framework web,
pas un outil Arduino.
Objectif¶
Remplacer le simulateur (forge iot:simulate) par un vrai capteur :
un ESP32 qui publie une température sur le topic Forge IoT, ingérée
ensuite par forge iot:listen et lisible via l'API HTTP.
Matériel nécessaire¶
- une carte ESP32 (DevKit, WROOM…) ;
- un câble USB ;
- optionnel : un capteur de température réel (DHT22, DS18B20…), sinon
l'exemple publie une valeur fixe.
Pré-requis¶
- l'IDE Arduino (ou PlatformIO) avec le coeur ESP32 installé ;
- la bibliothèque PubSubClient (Nick O'Leary) installée via le
gestionnaire de bibliothèques ; - un broker Mosquitto joignable sur le réseau local, voir
Mosquitto local ; - un projet Forge avec
forge-mvc-iotinstallé.
Contrat MQTT Forge IoT¶
L'ESP32 doit publier exactement sur :
Exemple utilisé ici :
Avec un payload JSON conforme :
Le timestamp est en UTC, suffixe Z : l'exemple l'obtient par NTP.
Code ESP32 minimal¶
Le sketch complet est ici :
esp32_mqtt_temperature.ino.
Extrait : les paramètres à adapter et la publication :
#include <WiFi.h>
#include <PubSubClient.h>
const char* WIFI_SSID = "CHANGE_ME";
const char* WIFI_PASSWORD = "CHANGE_ME";
const char* MQTT_HOST = "192.168.1.222"; // IP du PC qui héberge Mosquitto
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC = "forge/atelier/esp32-001/telemetry";
// ... dans loop() :
snprintf(payload, sizeof(payload),
"{\"kind\":\"temperature\",\"value\":%.1f,\"unit\":\"°C\",\"timestamp\":\"%s\"}",
value, timestamp.c_str());
mqtt.publish(MQTT_TOPIC, payload);
Adapter le Wi-Fi¶
Remplace WIFI_SSID et WIFI_PASSWORD par les identifiants de ton
réseau. L'ESP32 et le PC qui héberge Mosquitto doivent être sur le
même réseau.
Adapter l'adresse du broker MQTT¶
MQTT_HOST doit pointer vers l'adresse IP du poste qui fait tourner
Mosquitto, surtout pas localhost (qui désignerait l'ESP32
lui-même). Trouve l'IP du PC, par exemple :
puis mets-la dans MQTT_HOST (ex. 192.168.1.222).
Lancer Mosquitto¶
Détail : Mosquitto local.
Lancer Forge IoT¶
Côté serveur, prépare le stockage puis écoute :
Vérifier la réception¶
Téléverse le sketch sur l'ESP32. Dans le terminal forge iot:listen,
des lignes [OK] doivent apparaître à chaque message. Vérifie ensuite
l'API HTTP (application lancée via forge run) :
Tu peux aussi observer le trafic brut :
Erreurs fréquentes¶
- L'ESP32 ne se connecte pas au Wi-Fi : vérifie SSID/mot de passe et
que le réseau est en 2,4 GHz (l'ESP32 ne gère pas le 5 GHz) ; - Pas de connexion MQTT :
MQTT_HOSTpointe surlocalhostau lieu
de l'IP du PC, ou Mosquitto n'écoute pas (voir
Mosquitto local) ; - Message rejeté par Forge : topic hors format
forge/{site}/{device_id}/telemetry, ou payload incomplet
(kind/value/unit/timestampobligatoires) ; - Timestamp faux : NTP pas encore synchronisé, attends quelques
secondes après la connexion Wi-Fi.
Limites¶
Cet exemple reste volontairement simple. Sont hors périmètre :
- pas de TLS ni d'authentification MQTT ;
- pas de gestion Wi-Fi avancée (reconnexion fine, économie d'énergie) ;
- la bibliothèque PubSubClient est utilisée comme exemple, ce n'est
pas une dépendance de Forge ; - Arduino R4 n'est pas couvert ici (hors périmètre) : ce ticket
cible l'ESP32, la cible la plus simple et la plus standard pour MQTT.
Voir l'évaluation Arduino R4 pour l'état de
cette piste.