mqtt_telemetrie.ino

Arduino Opta (micro automate, STM32H747) · Fichier : mqtt_telemetrie.ino · Langage : Arduino · Usage : Publier les mesures de la PLC vers un broker MQTT

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

← Retour à la fiche