web_relais.ino
Una página web servida por la propia Opta: estado de los relés y entrada analógica a la vista, botones de mando como enlaces HTTP simples. Diagnóstico remoto de la máquina sin abrir el armario, con cero dependencias de software.
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. Opta en la red; un navegador (PC del taller o móvil con Wi-Fi del taller).
Cableado
Cable RJ45; anotar la IP estática del setup en la puerta del armario. No exponer este servidor a Internet sin VPN.
Funcionamiento
El servidor analiza la línea GET: /relais?n=&etat= aplica la orden al relé y devuelve la página HTML con el estado en directo.
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
Añadir un token en la URL para restringir el acceso, un refresco automático (meta refresh) o un botón de parada de emergencia prioritario.
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();
}