analogique_0_10v.ino

Arduino Opta (micro PLC, STM32H747) · Archivo : analogique_0_10v.ino · Lenguaje : Arduino · Uso : Acquérir une entrée analogique 0-10 V avec moyenne glissante

Las entradas analógicas de Opta leen 0-10 V en milivoltios. Este sketch aplica una media móvil de 8 muestras para suavizar el ruido y escala un sensor estándar de 4-20 mA con una resistencia de lectura, con detección de lazo abierto.

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. Sensor 0-10 V, o lazo de 4-20 mA con resistencia de lectura de 250 Ω (0-5 V en sus bornes) en AI1 y GND.

Cableado

Salida del sensor al borne AIx, 0 V a GND analógico. En 4-20 mA: transmisor → resistencia 250 Ω → AIx, masa común con la PLC.

Funcionamiento

AnalogIn.read devuelve milivoltios; la media circular amortigua el ruido de fondo. Leer por encima de 19,5 mA indica lazo abierto (fallo del sensor).

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

Cambiar la escala para un sensor 0-10 V real (map 0..10000 mV), registrar en el servidor web embebido o publicar por MQTT.

analogique_0_10v.ino

// Opta PLC : acquisition AI1 (0-10 V) avec moyenne glissante + seuil.
#include "PLCContainer.h"

PLCContainer PLC;

const int CANAL = OPTA_AI_1;      // entrée analogique 1 (0-10 V)
const int FENETRE = 8;            // moyenne sur 8 mesures
long tampon[FENETRE];
int n = 0;
unsigned long t0 = 0;

// Capteur 4-20 mA typique avec résistance de lecture 250 Ω :
// 4 mA -> 1 V ; 20 mA -> 5 V. Conversion en mA ci-dessous.
float vers_mA(int millivolts) {
  return (millivolts / 250.0f) * 10.0f;
}

void setup() {
  Serial.begin(115200);
  PLC.begin();
  for (int i = 0; i < FENETRE; i++) tampon[i] = PLC.AnalogIn.read(CANAL);
}

void loop() {
  if (millis() - t0 < 250) return;      // 4 mesures/s
  t0 = millis();
  tampon[n] = PLC.AnalogIn.read(CANAL); // renvoie des millivolts
  n = (n + 1) % FENETRE;
  long somme = 0;
  for (int i = 0; i < FENETRE; i++) somme += tampon[i];
  long moy = somme / FENETRE;
  float mA = vers_mA(moy);
  Serial.printf("AI1 = %ld mV -> %.2f mA", moy, mA);
  if (mA > 19.5f) Serial.print("  ALERTE capteur en défaut (boucle ouverte)");
  Serial.println();
}

← Volver a la ficha