mqtt_telemetrie.ino

Arduino Opta (micro PLC, STM32H747) · Archivo : mqtt_telemetrie.ino · Lenguaje : Arduino · Uso : Publier les mesures de la PLC vers un broker MQTT

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
  }
}

← Volver a la ficha