jeudi 6 octobre 2022

 Arduino

Décodeur d'accessoires ( 8 Aiguillages)







Passage a Niveau
barrières, sonnerie,feux








Programme a copier dans IDE Arduino
 // C++ code

//
#include <Servo.h>
// Déclaration de constantes et variables
const int Detect1 = A0; // Détection 1 branchée sur l'entée A0
const int Detect2 = A1; // Détection 2 branchée sur l'entée A1
const int pulse_dfplayer = 11;
const int barriere1 = 8; // Fil signal servo1
const int barriere2 = 9; // Fil signal Servo2
int tempo_fermeture = 4000; // temps clignotement avant fermeture barrières
int angle_fermeture = 0; // angle servo position fermée
int angle_ouverture = 80; // angle servo position ouverte
int vitesse_barriere = 70; // temps entre 2 degrés
int inhibition = 10000; // Pendant cette durée le PN ne peut pas se redéclencher
int angle_barriere;
Servo servo1;
Servo servo2;
unsigned long compteur_temps;
boolean etat_feux = false; // Variable 0 si leds éteintes et 1 si allumées
int valeur_Detect1 = 1023; // Détecteur 1 ( + de 512 pas de détection. - de 512 détection.)
int valeur_Detect2 = 1023; // Détecteur 2
int premiere_detection = 0; // 1 si détecteur1 en premier, 2 si détecteur2 en premier.
boolean detection = false; // 0 si pas de détection. 1 si train détecté.
boolean barriere_ouverte; // 1 si barrières ouvertes.

enum { ETEINT, EN_AUGMENTATION, ALLUME, EN_DIMINUTION };

struct FeuClignotant {
  const byte pin;
  byte etat;
  unsigned long dateDernierChangement;
};

struct FeuClignotant feuPN = {3, ETEINT, 0 };

void gereFeuClignotant(struct FeuClignotant& feu)
{
  unsigned long date = millis();
  int valeurPWM;
  switch (feu.etat)
  {
    case ETEINT:
      analogWrite(feu.pin, 0);
      // Attente de 200ms
      if (date - feu.dateDernierChangement >= 200) {
        // les 200ms sont passée, on change l'état du feu
        feu.dateDernierChangement = date;
        feu.etat = EN_AUGMENTATION;
      }
      break;
    case EN_AUGMENTATION:
      // La valeur de la PWM est donnée par la difference entre
      // la date et la dateDernierChangement
      valeurPWM = date - feu.dateDernierChangement;
      if (valeurPWM <= 250) analogWrite(feu.pin, valeurPWM);
      else {
        // Les 250 ms sont passées, on change l'état du feu
        feu.dateDernierChangement = date;
        feu.etat = ALLUME;
      }
      break;
    case ALLUME:
      analogWrite(feu.pin, 250);
      // Attente de 200ms
      if (date - feu.dateDernierChangement >= 200) {
        // les 200ms sont passée, on change l'état du feu
        feu.dateDernierChangement = date;
        feu.etat = EN_DIMINUTION;
      }
      break;
    case EN_DIMINUTION:
      // La valeur de la PWM est donnée par 250 moins la difference entre
      // la date et la dateDernierChangement. Attention aux parenthèses
      valeurPWM = 250 - (date - feu.dateDernierChangement);
      if (valeurPWM >= 0) analogWrite(feu.pin, valeurPWM);
      else {
        // Les 250 ms sont passées, on change l'état du feu
        feu.dateDernierChangement = date;
        feu.etat = ETEINT;
      }
      break;
  }
}


void setup() {
 
   
pinMode(feuPN.pin, OUTPUT);

 
pinMode(pulse_dfplayer,OUTPUT);
digitalWrite(pulse_dfplayer,HIGH);

 servo1.attach(barriere1,500,2500);
servo2.attach(barriere2,500,2500);
servo1.write(angle_ouverture); //ouverture au début
servo2.write(angle_ouverture);
barriere_ouverte = true;
}
void loop() {
valeur_Detect1 = analogRead(Detect1);
valeur_Detect2 = analogRead(Detect2);
if (detection == 1 && premiere_detection == 0) {
if (valeur_Detect1 > 512 && valeur_Detect2 > 512) {

   analogWrite(feuPN.pin,0);
for (int angle_barriere=angle_fermeture; angle_barriere<=angle_ouverture; angle_barriere+=1){ //OUVERTURE BARRIERES
servo1.write(angle_barriere);
servo2.write(angle_barriere);
delay(vitesse_barriere);
}
barriere_ouverte = true;
detection = 0;
delay(inhibition);
}
}
// Permet de savoir quel détecteur est passé à l'état bas en premier
if (detection == false) {
// détection d'un train
if (valeur_Detect1 < 512 || valeur_Detect2 < 512) {
detection = true;
   digitalWrite(pulse_dfplayer,LOW);
   delay(100);
   digitalWrite(pulse_dfplayer,HIGH);
// Mise en mémoire du détecteur.
if (valeur_Detect1 < 512) {
premiere_detection = 1;
} else {
premiere_detection = 2;
}
}
}
// Un train est détecté.
else {
   
// Appel de la fonction qui gère les feux
   gereFeuClignotant(feuPN);
   
if (barriere_ouverte == true) {
for (int tempo = 0; tempo <= tempo_fermeture; tempo +=1){ // Temporisation avant fermeture
// Appel de la fonction qui gère les feux
   gereFeuClignotant(feuPN);
delay(1);
}

 for (int angle_barriere=angle_ouverture; angle_barriere>=angle_fermeture; angle_barriere-=1){ //FERMETURE BARRIERES
servo1.write(angle_barriere);
servo2.write(angle_barriere);
// Appel de la fonction qui gère les feux
   gereFeuClignotant(feuPN);
delay(vitesse_barriere); // Vitesse angle barrière
}
barriere_ouverte = false;
   

 }
if (premiere_detection == 1) {
if (valeur_Detect2 < 512) {
premiere_detection = 0;;
}
}
if (premiere_detection == 2) { // Si non c'est que c'est le 2eme capteur
if (valeur_Detect1 < 512) {
premiere_detection = 0;
}
}
}
delay(50);
}

 




Peut fonctionner avec le détecteur d'occupation via contact C1et C2


Aucun commentaire:

Enregistrer un commentaire