top of page
Passage à niveau Arduino, servos, son et feux.
Version sans PWM sur les leds.
// 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 feu_droit = 13; // Première paire de feux
const int feu_gauche = 12; // Deuxième paire de feux
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 tempo_led = 500; // tempo cligno
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.
void setup() {
pinMode(feu_droit,OUTPUT);
pinMode(feu_gauche,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) {
digitalWrite(feu_droit,LOW);
digitalWrite(feu_gauche,LOW);
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;
//digitalWrite(feu_droit,LOW);
//digitalWrite(feu_gauche,LOW);
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 {
Fonction_feux(); // Appel de la fonction qui gère les feux
if (barriere_ouverte == true) {
for (int tempo = 0; tempo <= tempo_fermeture; tempo +=1){ // Temporisation avant fermeture
Fonction_feux(); // Appel de la fonction qui gère les feux
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);
Fonction_feux(); // Appel de la fonction qui gère les feux
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);
}
void Fonction_feux() {
if (millis() > compteur_temps + tempo_led) {
compteur_temps = millis();
if (etat_feux == false) {
etat_feux = true;
digitalWrite(feu_droit,HIGH);
digitalWrite(feu_gauche,HIGH);
} else {
etat_feux = false;
digitalWrite(feu_droit,LOW);
digitalWrite(feu_gauche,LOW);
}
}
}
Feux routiers
// Déclaration des constantes correspondantes aux pins des leds
const byte LedRouge_feux_1 = 2;
const byte LedJaune_feux_1 = 3;
const byte LedVerte_feux_1 = 4;
const byte LedRouge_feux_2 = 5;
const byte LedJaune_feux_2 = 6;
const byte LedVerte_feux_2 = 7;
void setup() {
pinMode(LedRouge_feux_1, OUTPUT);
pinMode(LedJaune_feux_1, OUTPUT);
pinMode(LedVerte_feux_1, OUTPUT);
pinMode(LedRouge_feux_2, OUTPUT);
pinMode(LedJaune_feux_2, OUTPUT);
pinMode(LedVerte_feux_2, OUTPUT);
// au début on allume les feux rouges, par un état bas car on va câbler les leds au commun positif...si, si !!
digitalWrite(LedRouge_feux_1, LOW);
digitalWrite(LedJaune_feux_1, HIGH);
digitalWrite(LedVerte_feux_1, HIGH);
digitalWrite(LedRouge_feux_2, LOW);
digitalWrite(LedJaune_feux_2, HIGH);
digitalWrite(LedVerte_feux_2, HIGH);
}
void loop() {
digitalWrite(LedRouge_feux_1, HIGH);
digitalWrite(LedVerte_feux_1, LOW);
delay(8000);
digitalWrite(LedVerte_feux_1, HIGH);
digitalWrite(LedJaune_feux_1, LOW);
delay(3000);
digitalWrite(LedJaune_feux_1, HIGH);
digitalWrite(LedRouge_feux_1, LOW);
delay(2000);
digitalWrite(LedRouge_feux_2, HIGH);
digitalWrite(LedVerte_feux_2, LOW);
delay(8000);
digitalWrite(LedVerte_feux_2, HIGH);
digitalWrite(LedJaune_feux_2, LOW);
delay(3000);
digitalWrite(LedJaune_feux_2, HIGH);
digitalWrite(LedRouge_feux_2, LOW);
delay(2000);
}
bottom of page