mqtt_telemetrie.ino
L'Opta publie ses mesures au format JSON vers un broker MQTT toutes les 5 s : le lien naturel entre l'armoire électrique et un tableau de bord domotique/industriel (Node-RED, Home Assistant, Grafana). Reconnexion automatique incluse.
Matériel requis
Une Opta PLC STMicroelectronics (STM32H747 temps réel + coprocesseur sécurisé i.MX RT1052) programmée avec l'environnement Arduino PLC, alimentée en 24 V DIN. Un broker MQTT sur le réseau (mosquitto, EMQX) et l'Opta câblée en Ethernet.
Câblage
RJ45 vers le réseau ; vérifier que le port 1883 est ouvert entre l'Opta et le broker (pare-feu atelier).
Fonctionnement
PubSubClient s'appuie sur EthernetClient ; le lisseur exponentiel stabilise AI1, le JSON est publié en retained pour que le dashboard redémarre avec la dernière valeur.
Exécution
Installez le gestionnaire de cartes Arduino PLC, sélectionnez « Opta PLC », câblez en USB/DFU puis téléversez. Le programme tourne sur le STM32H747 côté temps réel.
Variantes
S'abonner à opta/consigne pour télécommander RO1 (callback publish), ou ajouter le RSSI/uptime dans le payload pour la supervision.
mqtt_telemetrie.ino
// Opta PLC : publication MQTT (PubSubClient sur Ethernet) toutes les 5 s.
// Broker test : mosquitto sur 192.168.1.10:1883 (adapter l'IP).
#include "PLCContainer.h"
#include <Ethernet.h>
#include <PubSubClient.h>
PLCContainer PLC;
EthernetClient eth;
PubSubClient mqtt(eth);
unsigned long t0 = 0;
float lecture_lisseur() {
static long moy = 0;
moy = (3 * moy + PLC.AnalogIn.read(OPTA_AI_1)) / 4; // lissage exponentiel
return moy / 1000.0f; // -> volts
}
void reconnect() {
while (!mqtt.connected()) {
if (mqtt.connect("opta-plc")) { mqtt.publish("opta/etat", "online", true); return; }
delay(2000);
}
}
void setup() {
Serial.begin(115200);
PLC.begin();
byte mac[] = { 0x00, 0x80, 0xE1, 0x14, 0x22, 0x34 };
PLC.Eth.begin(mac, IPAddress(192, 168, 1, 61), IPAddress(192, 168, 1, 1));
mqtt.setServer(IPAddress(192, 168, 1, 10), 1883);
mqtt.setBufferSize(256);
}
void loop() {
if (!mqtt.connected()) reconnect();
mqtt.loop();
if (millis() - t0 >= 5000) {
t0 = millis();
char buf[96];
snprintf(buf, sizeof buf, "{\"ai1_v\":%.2f,\"ro1\":%d}",
lecture_lisseur(), PLC.Relay[0].state() ? 1 : 0);
mqtt.publish("opta/mesures", buf, true); // retained
}
}