/***************************
* Signal_BAL - 30/11/2016 *
* *************************
* Ce programme simule le fonctionnement d un signal lumineux a trois
* feux d un B.A.L Block Automatique Lumineux. Il n assure pas
* l espacement des trains. Lorsque la loco declenche le premier ILS,
* le signal se met au rouge. Lorsque la loco declenche le deuxieme
* ILS, le signal se met a l orange pour une duree egale a celle du
* rouge, puis repasse au vert.
*/
/* VARIABLES
* --------------------------------------------------------------
* debRouge : temps de debut du feu rouge
* finRouge : temps de fin du feu rouge
* dureeRouge ; duree du feu rouge
* debOrange : temps de debut du feu orange
* flagOrange : booleen 0 si feu orange eteint, 1 si allume
*/
/* BRANCHEMENTS
* --------------------------------------------------------------
* ILS E (entree) sur 2
* ILS S (sortie) sur 3
* feu vert sur 4
* feu rouge sur 5
* feu orange sur 6
*/
const byte ILS_entree = 2;
const byte ILS_sortie = 3;
const byte feu_vert = 4;
const byte feu_rouge = 5;
const byte feu_orange = 6;
unsigned long debRouge = 0;
unsigned long finRouge = 0;
unsigned long debOrange = 0;
unsigned long dureeRouge;
boolean flagOrange = 0;
void setup() {
pinMode(ILS_entree, INPUT_PULLUP);
pinMode(ILS_sortie, INPUT_PULLUP);
pinMode(feu_vert, OUTPUT);
pinMode(feu_rouge, OUTPUT);
pinMode(feu_orange, OUTPUT);
// Initialisation du signal a anode commune, allume par LOW
digitalWrite(feu_vert, LOW);
digitalWrite(feu_rouge, HIGH);
digitalWrite(feu_orange, HIGH);
}
void loop() {
// Surveillance de l ILS d entree
while (digitalRead(ILS_entree) == HIGH)
{
// ILS E non declenche
if (flagOrange)
{
if ((millis() - debOrange) > dureeRouge)
{
digitalWrite(feu_orange, HIGH);
flagOrange = 0;
digitalWrite(feu_vert, LOW);
}
}
}
// ILS E declenche
digitalWrite(feu_vert, HIGH);
digitalWrite(feu_orange, HIGH);
flagOrange = 0;
digitalWrite(feu_rouge, LOW);
debRouge = millis();
// Surveillance de l ILS de sortie
while (digitalRead(ILS_sortie) == HIGH)
{
// ILS S non declenche, ne rien faire
}
// ILS S declenche
finRouge = millis();
dureeRouge = finRouge - debRouge;
digitalWrite(feu_rouge, HIGH);
digitalWrite(feu_orange, LOW);
flagOrange = 1;
debOrange = millis();
}