mqtt_telemetrie.ino
Opta publica sus medidas en JSON a un broker MQTT cada 5 s: el enlace natural entre el armario eléctrico y un cuadro de mando domótico/industrial (Node-RED, Home Assistant, Grafana). Reconexión automática incluida.
Hardware
Una Opta PLC de STMicroelectronics (STM32H747 en tiempo real + coprocesador seguro i.MX RT1052) programada con el entorno Arduino PLC, alimentada a 24 V DIN. Un broker MQTT en la red (mosquitto, EMQX) y Opta conectada por Ethernet.
Cableado
RJ45 a la red; comprobar que el puerto 1883 está abierto entre Opta y el broker (cortafuegos del taller).
Funcionamiento
PubSubClient se apoya en EthernetClient; el suavizador exponencial estabiliza AI1 y el JSON se publica retained para que el dashboard arranque con el último valor.
Ejecución
Instala el gestor de placas Arduino PLC, selecciona «Opta PLC», conecta USB/DFU y vuelca el programa. El sketch corre por el STM32H747 en tiempo real.
Variantes
Suscribirse a opta/consigna para telemandar RO1 (callback publish), o añadir uptime al payload para la supervisión.
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
}
}