/* ------------------------------------------------------------------
* programme "BAL_8_Cantons_Monosens_Securises.ino"
* ------------------------------------------------------------------
* Christian BEZANGER - janvier 2025 - Domaine public
* Illustre la fiche pratique III.88 de Loco-Revue 931 (fevrier 2025)
* ------------------------------------------------------------------
* Ce programme gere un B.A.L de 8 cantons securises avec 8 signaux
* a CATHODES COMMUNES (Signaux a anodes communes possibles).
* Les trains doivent etre munis d'un aimant a l'avant et d'un
* aimant a l'arriere (dernier wagon) pour la securite.
* Signaux luimineux de 22 à 45
* Signaux sur sorties qui se suivent, ordre vert - rouge - orange
* ----------------------------------------------------------------*/
const byte etatLedON = HIGH; // Mettre LOW si signaux a anodes communes
const byte etatLedOFF = LOW; // Mettre HIGH si signaux a anodes communes
// definition des ILS
// ------------------
const byte pinILS1 = A0;
const byte pinILS2 = A1;
const byte pinILS3 = A2;
const byte pinILS4 = A3;
const byte pinILS5 = A4;
const byte pinILS6 = A5;
const byte pinILS7 = A6;
const byte pinILS8 = A7;
// Les signaux de B.A.L
// --------------------
// Signal 1
const byte S1_vert = 22;
const byte S1_rouge = 23;
const byte S1_orange = 24;
// Signal 2
const byte S2_vert = 25;
const byte S2_rouge = 26;
const byte S2_orange = 27;
// Signal 3
const byte S3_vert = 28;
const byte S3_rouge = 29;
const byte S3_orange = 30;
// Signal 4
const byte S4_vert = 31;
const byte S4_rouge = 32;
const byte S4_orange = 33;
// Signal 5
const byte S5_vert = 34;
const byte S5_rouge = 35;
const byte S5_orange = 36;
// Signal 6
const byte S6_vert = 37;
const byte S6_rouge = 38;
const byte S6_orange = 39;
// Signal 7
const byte S7_vert = 40;
const byte S7_rouge = 41;
const byte S7_orange = 42;
// Signal 8
const byte S8_vert = 43;
const byte S8_rouge = 44;
const byte S8_orange = 45;
// Occupation des cantons
// ----------------------
volatile bool canton1 = false; // true si occupe
volatile bool canton2 = false;
volatile bool canton3 = false;
volatile bool canton4 = false;
volatile bool canton5 = false;
volatile bool canton6 = false;
volatile bool canton7 = false;
volatile bool canton8 = false;
// Compteur des cantons
// --------------------
int compteurCanton1 = 0;
int compteurCanton2 = 0;
int compteurCanton3 = 0;
int compteurCanton4 = 0;
int compteurCanton5 = 0;
int compteurCanton6 = 0;
int compteurCanton7 = 0;
int compteurCanton8 = 0;
// Reperes temporels pour eviter double declenchement
// --------------------------------------------------
long topILS1 = 0;
long oldtopILS1 = 0;
long topILS2 = 0;
long oldtopILS2 = 0;
long topILS3 = 0;
long oldtopILS3 = 0;
long topILS4 = 0;
long oldtopILS4 = 0;
long topILS5 = 0;
long oldtopILS5 = 0;
long topILS6 = 0;
long oldtopILS6 = 0;
long topILS7 = 0;
long oldtopILS7 = 0;
long topILS8 = 0;
long oldtopILS8 = 0;
// variable de communication
// -------------------------
byte varCom = 0b00000000;
byte oldvarCom = 0b00000000;
void setup()
{
Serial.begin(9600);
// Broches des ILS en entree et active le pullup interne
pinMode(pinILS1, INPUT_PULLUP);
pinMode(pinILS2, INPUT_PULLUP);
pinMode(pinILS3, INPUT_PULLUP);
pinMode(pinILS4, INPUT_PULLUP);
pinMode(pinILS5, INPUT_PULLUP);
pinMode(pinILS6, INPUT_PULLUP);
pinMode(pinILS7, INPUT_PULLUP);
pinMode(pinILS8, INPUT_PULLUP);
// Programme les feux des signaux en sortie
for(int j = 22; j <= 45; j++){
pinMode(j, OUTPUT);
}
// Eteint tous les feux des signaux
for(int j = 22; j <= 45; j++){
digitalWrite(j, LOW);
}
// Allume les huit signaux au vert au debut du jeu
digitalWrite(S1_vert, HIGH);
digitalWrite(S2_vert, HIGH);
digitalWrite(S3_vert, HIGH);
digitalWrite(S4_vert, HIGH);
digitalWrite(S5_vert, HIGH);
digitalWrite(S6_vert, HIGH);
digitalWrite(S7_vert, HIGH);
digitalWrite(S8_vert, HIGH);
} // Fin de setup
void loop()
{
// Scrutation des ILS
if(digitalRead(pinILS1)==LOW) {
topILS1 = millis();
if((topILS1 - oldtopILS1) > 2000) {
compteurCanton1 = compteurCanton1 + 1;
compteurCanton8 = compteurCanton8 - 1;
if(compteurCanton8 < 0) {compteurCanton8 = 0;}
oldtopILS1 = topILS1;
}
}
if(digitalRead(pinILS2)==LOW) {
topILS2 = millis();
if((topILS2 - oldtopILS2) > 2000) {
compteurCanton2 = compteurCanton2 + 1;
compteurCanton1 = compteurCanton1 - 1;
if(compteurCanton1 < 0) {compteurCanton1 = 0;}
oldtopILS2 = topILS2;
}
}
if(digitalRead(pinILS3)==LOW) {
topILS3 = millis();
if((topILS3 - oldtopILS3) > 2000) {
compteurCanton3 = compteurCanton3 + 1;
compteurCanton2 = compteurCanton2 - 1;
if(compteurCanton2 < 0) {compteurCanton2 = 0;}
oldtopILS3 = topILS3;
}
}
if(digitalRead(pinILS4)==LOW) {
topILS4 = millis();
if((topILS4 - oldtopILS4) > 2000) {
compteurCanton4 = compteurCanton4 + 1;
compteurCanton3 = compteurCanton3 - 1;
if(compteurCanton3 < 0) {compteurCanton3 = 0;}
oldtopILS4 = topILS4;
}
}
if(digitalRead(pinILS5)==LOW) {
topILS5 = millis();
if((topILS5 - oldtopILS5) > 2000) {
compteurCanton5 = compteurCanton5 + 1;
compteurCanton4 = compteurCanton4 - 1;
if(compteurCanton4 < 0) {compteurCanton4 = 0;}
oldtopILS5 = topILS5;
}
}
if(digitalRead(pinILS6)==LOW) {
topILS6 = millis();
if((topILS6 - oldtopILS6) > 2000) {
compteurCanton6 = compteurCanton6 + 1;
compteurCanton5 = compteurCanton5 - 1;
if(compteurCanton5 < 0) {compteurCanton5 = 0;}
oldtopILS6 = topILS6;
}
}
if(digitalRead(pinILS7)==LOW) {
topILS7 = millis();
if((topILS7 - oldtopILS7) > 2000) {
compteurCanton7 = compteurCanton7 + 1;
compteurCanton6 = compteurCanton6 - 1;
if(compteurCanton6 < 0) {compteurCanton6 = 0;}
oldtopILS7 = topILS7;
}
}
if(digitalRead(pinILS8)==LOW) {
topILS8 = millis();
if((topILS8 - oldtopILS8) > 2000) {
compteurCanton8 = compteurCanton8 + 1;
compteurCanton7 = compteurCanton7 - 1;
if(compteurCanton7 < 0) {compteurCanton7 = 0;}
oldtopILS8 = topILS8;
}
}
// Determination de l'etat des cantons
if(compteurCanton1 == 0) {canton1 = false;} else {canton1 = true;}
if(compteurCanton2 == 0) {canton2 = false;} else {canton2 = true;}
if(compteurCanton3 == 0) {canton3 = false;} else {canton3 = true;}
if(compteurCanton4 == 0) {canton4 = false;} else {canton4 = true;}
if(compteurCanton5 == 0) {canton5 = false;} else {canton5 = true;}
if(compteurCanton6 == 0) {canton6 = false;} else {canton6 = true;}
if(compteurCanton7 == 0) {canton7 = false;} else {canton7 = true;}
if(compteurCanton8 == 0) {canton8 = false;} else {canton8 = true;}
// Elaboration de la variable de communication
if(canton1) {bitSet(varCom, 0);} else {bitClear(varCom, 0);}
if(canton2) {bitSet(varCom, 1);} else {bitClear(varCom, 1);}
if(canton3) {bitSet(varCom, 2);} else {bitClear(varCom, 2);}
if(canton4) {bitSet(varCom, 3);} else {bitClear(varCom, 3);}
if(canton5) {bitSet(varCom, 4);} else {bitClear(varCom, 4);}
if(canton6) {bitSet(varCom, 5);} else {bitClear(varCom, 5);}
if(canton7) {bitSet(varCom, 6);} else {bitClear(varCom, 6);}
if(canton8) {bitSet(varCom, 7);} else {bitClear(varCom, 7);}
// Affichage
if(varCom != oldvarCom) {
for(int k = 0; k <= 7; k++) {
int bit_canton = bitRead(varCom, k);
Serial.print(bit_canton);
}
Serial.println();
oldvarCom = varCom;
}
// Traitement du signal 1
if(canton1){ // Signal 1 au rouge
digitalWrite(S1_vert, etatLedOFF);
digitalWrite(S1_orange, etatLedOFF);
digitalWrite(S1_rouge, etatLedON);
}
if(!canton1 && canton2){ // Signal 1 a l orange
digitalWrite(S1_vert, etatLedOFF);
digitalWrite(S1_rouge, etatLedOFF);
digitalWrite(S1_orange, etatLedON);
}
if(!canton1 && !canton2){ // Signal 1 au vert
digitalWrite(S1_orange, etatLedOFF);
digitalWrite(S1_rouge, etatLedOFF);
digitalWrite(S1_vert, etatLedON);
}
// Traitement du signal 2
if(canton2){ // Signal 2 au rouge
digitalWrite(S2_vert, etatLedOFF);
digitalWrite(S2_orange, etatLedOFF);
digitalWrite(S2_rouge, etatLedON);
}
if(!canton2 && canton3){ // Signal 2 a l orange
digitalWrite(S2_vert, etatLedOFF);
digitalWrite(S2_rouge, etatLedOFF);
digitalWrite(S2_orange, etatLedON);
}
if(!canton2 && !canton3){ // Signal 2 au vert
digitalWrite(S2_orange, etatLedOFF);
digitalWrite(S2_rouge, etatLedOFF);
digitalWrite(S2_vert, etatLedON);
}
// Traitement du signal 3
if(canton3){ // Signal 3 au rouge
digitalWrite(S3_vert, etatLedOFF);
digitalWrite(S3_orange, etatLedOFF);
digitalWrite(S3_rouge, etatLedON);
}
if(!canton3 && canton4){ // Signal 3 a l orange
digitalWrite(S3_vert, etatLedOFF);
digitalWrite(S3_rouge, etatLedOFF);
digitalWrite(S3_orange, etatLedON);
}
if(!canton3 && !canton4){ // Signal 3 au vert
digitalWrite(S3_orange, etatLedOFF);
digitalWrite(S3_rouge, etatLedOFF);
digitalWrite(S3_vert, etatLedON);
}
// Traitement du signal 4
if(canton4){ // Signal 4 au rouge
digitalWrite(S4_vert, etatLedOFF);
digitalWrite(S4_orange, etatLedOFF);
digitalWrite(S4_rouge, etatLedON);
}
if(!canton4 && canton5){ // Signal 4 a l orange
digitalWrite(S4_vert, etatLedOFF);
digitalWrite(S4_rouge, etatLedOFF);
digitalWrite(S4_orange, etatLedON);
}
if(!canton4 && !canton5){ // Signal 4 au vert
digitalWrite(S4_orange, etatLedOFF);
digitalWrite(S4_rouge, etatLedOFF);
digitalWrite(S4_vert, etatLedON);
}
// Traitement du signal 5
if(canton5){ // Signal 5 au rouge
digitalWrite(S5_vert, etatLedOFF);
digitalWrite(S5_orange, etatLedOFF);
digitalWrite(S5_rouge, etatLedON);
}
if(!canton5 && canton6){ // Signal 5 a l orange
digitalWrite(S5_vert, etatLedOFF);
digitalWrite(S5_rouge, etatLedOFF);
digitalWrite(S5_orange, etatLedON);
}
if(!canton5 && !canton6){ // Signal 5 au vert
digitalWrite(S5_orange, etatLedOFF);
digitalWrite(S5_rouge, etatLedOFF);
digitalWrite(S5_vert, etatLedON);
}
// Traitement du signal 6
if(canton6){ // Signal 6 au rouge
digitalWrite(S6_vert, etatLedOFF);
digitalWrite(S6_orange, etatLedOFF);
digitalWrite(S6_rouge, etatLedON);
}
if(!canton6 && canton7){ // Signal 6 a l orange
digitalWrite(S6_vert, etatLedOFF);
digitalWrite(S6_rouge, etatLedOFF);
digitalWrite(S6_orange, etatLedON);
}
if(!canton6 && !canton7){ // Signal 6 au vert
digitalWrite(S6_orange, etatLedOFF);
digitalWrite(S6_rouge, etatLedOFF);
digitalWrite(S6_vert, etatLedON);
}
// Traitement du signal 7
if(canton7){ // Signal 7 au rouge
digitalWrite(S7_vert, etatLedOFF);
digitalWrite(S7_orange, etatLedOFF);
digitalWrite(S7_rouge, etatLedON);
}
if(!canton7 && canton8){ // Signal 7 a l orange
digitalWrite(S7_vert, etatLedOFF);
digitalWrite(S7_rouge, etatLedOFF);
digitalWrite(S7_orange, etatLedON);
}
if(!canton7 && !canton8){ // Signal 7 au vert
digitalWrite(S7_orange, etatLedOFF);
digitalWrite(S7_rouge, etatLedOFF);
digitalWrite(S7_vert, etatLedON);
}
// Traitement du signal 8
if(canton8){ // Signal 8 au rouge
digitalWrite(S8_vert, etatLedOFF);
digitalWrite(S8_orange, etatLedOFF);
digitalWrite(S8_rouge, etatLedON);
}
if(!canton8 && canton1){ // Signal 8 a l orange
digitalWrite(S8_vert, etatLedOFF);
digitalWrite(S8_rouge, etatLedOFF);
digitalWrite(S8_orange, etatLedON);
}
if(!canton8 && !canton1){ // Signal 8 au vert
digitalWrite(S8_orange, etatLedOFF);
digitalWrite(S8_rouge, etatLedOFF);
digitalWrite(S8_vert, etatLedON);
}
} // Fin de loop
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r
btn6:1.l
btn6:2.l
btn6:1.r
btn6:2.r
btn7:1.l
btn7:2.l
btn7:1.r
btn7:2.r
btn8:1.l
btn8:2.l
btn8:1.r
btn8:2.r
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
led16:A
led16:C
led17:A
led17:C
led18:A
led18:C
led19:A
led19:C
led20:A
led20:C
led21:A
led21:C
led22:A
led22:C
led23:A
led23:C
led24:A
led24:C
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
r13:1
r13:2
r14:1
r14:2
r15:1
r15:2
r16:1
r16:2