web_relais.ino

Arduino Opta (micro automate, STM32H747) · Fichier : web_relais.ino · Langage : Arduino · Usage : Commander la PLC depuis une page web embarquée

Une page web servie par l'Opta elle-même : affichage de l'état des relais et de l'entrée analogique, boutons de commande par simple lien HTTP. Le dépannage à distance d'une machine sans redémarrer l'armoire, avec zéro dépendance logicielle.

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. Opta sur le réseau ; un navigateur (poste atelier ou téléphone en Wi-Fi d'atelier).

Câblage

Câble RJ45 ; l'IP statique du setup est à noter sur l'armoire. Ne pas exposer ce serveur sur Internet sans VPN.

Fonctionnement

Le serveur parse la ligne GET : /relais?n=&etat= applique la commande au relais puis renvoie la page HTML avec l'état courant lu en direct.

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

Ajouter un jeton dans l'URL pour restreindre l'accès, un refresh automatique (meta refresh), ou un bouton d'arrêt d'urgence prioritaire.

web_relais.ino

// Opta PLC : mini serveur web embarqué — page de commande des relais.
// GET /            -> page HTML   GET /relais?n=1&etat=on -> commande
#include "PLCContainer.h"
#include <Ethernet.h>

PLCContainer PLC;
EthernetServer serveur(80);

void page(EthernetClient &c) {
  c.println("HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n"
            "Connection: close\r\n\r\n"
            "<h2>Opta PLC</h2><ul>");
  for (int i = 0; i < 2; i++) {
    c.print("<li>RO"); c.print(i + 1);
    c.print(PLC.Relay[i].state() ? " : <b>ON</b> " : " : OFF ");
    c.print("<a href=\"/relais?n="); c.print(i);
    c.println(PLC.Relay[i].state() ? "&etat=off\">couper</a></li>"
                                   : "&etat=on\">activer</a></li>");
  }
  c.print("</ul>AI1 = "); c.print(PLC.AnalogIn.read(OPTA_AI_1));
  c.println(" mV"); c.stop();
}

void setup() {
  PLC.begin();
  byte mac[] = { 0x00, 0x80, 0xE1, 0x14, 0x22, 0x35 };
  PLC.Eth.begin(mac, IPAddress(192, 168, 1, 62), IPAddress(192, 168, 1, 1));
  serveur.begin();
}

void loop() {
  EthernetClient c = serveur.available();
  if (!c) return;
  String req = c.readStringUntil('\n');       // ligne GET /...
  if (req.startsWith("GET /relais")) {
    int n = req.substring(req.indexOf("n=") + 2).toInt();
    bool on = req.indexOf("etat=on") > 0;
    if (n >= 0 && n < 2) PLC.Relay[n].write(on);
  }
  page(c);
  delay(5); c.stop();
}

← Retour à la fiche