Arduino
//
#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);
}