entrees_numeriques.ino

Arduino Opta (micro automate, STM32H747) · Fichier : entrees_numeriques.ino · Langage : Arduino · Usage : Lire les 4 entrées numériques 24 V avec anti-rebond

Les entrées de l'Opta acceptent directement le 24 V industriel : ce programme surveille IN1 à IN4, filtre les rebonds à 30 ms et affiche chaque changement d'état sur le port série. Un exemple d'association directe entrée→relais complète la démo.

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. Boutons ou capteurs trois fils 24 V (PNP/logique positive) sur IN1..IN4, 0 V sur la borne commune COM.

Câblage

Chaque capteur : +24 V sur sa sortie, sortie sur la borne INx, 0 V sur COM commune des entrées. Pas de résistance externe : le 24 V est la norme ici.

Fonctionnement

DigitalIn.read renvoie le niveau filtré matériel ; le filtre logiciel 30 ms évite les doublons sur contacts mécaniques. write copie l'état vers le relais.

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

Basculer la logique en détection de niveau bas (capteur NPN) ou mémoriser un compteur d'appuis par entrée pour un compteur de production.

entrees_numeriques.ino

// Opta PLC : lecture des entrées numériques IN1..IN4 (24 V DC, logique positive).
#include "PLCContainer.h"

PLCContainer PLC;

const int ENT[4] = { OPTA_IN_1, OPTA_IN_2, OPTA_IN_3, OPTA_IN_4 };
int etatPrec[4] = { -1, -1, -1, -1 };
unsigned long dernier[4] = { 0, 0, 0, 0 };
const unsigned long ANTI_REBOND_MS = 30;

void setup() {
  Serial.begin(115200);
  PLC.begin();
  for (int i = 0; i < 4; i++)
    PLC.DigitalIn.setMode(ENT[i], PLCDigitalIn::PULL_UP);
  Serial.println("Entrées Opta prêtes (IN1..IN4)");
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int e = PLC.DigitalIn.read(ENT[i]) ? 1 : 0;
    unsigned long maintenant = millis();
    if (e != etatPrec[i] && maintenant - dernier[i] > ANTI_REBOND_MS) {
      dernier[i] = maintenant;
      etatPrec[i] = e;
      Serial.printf("IN%d = %s\n", i + 1, e ? "ACTIVE (24V)" : "inactive");
      if (i == 0) PLC.Relay[0].write(e);   // bouton IN1 -> relais 1
    }
  }
}

← Retour à la fiche