/*attiny84 BAL3
23/08/2022
Fantasio
gestion carré et oeilleton
test: ok sur Nano
simulation:
https://wokwi.com/projects/340777383909917267 Par convention:
- une led s'allume si un niveau HIGH est présent en sortie
- si un train occupe un canton le capteur d'occupation voit sa sortie passer du niveau HIGH au niveau LOW
- si positionnement correct une masse se retrouve sur PositionAiguilles
pour le signal 2 on raccorde à PositionAiguilles le contact droit de l'Aiguille2 et le contact dévié de l'Aiguille3
(pour le signal 4 on raccorde à PositionAiguilles uniquement le contact dévié de l'Aiguille2)
- si dévié
le signal carré s'allume
envoi d'info occupation vers canton-1 (pour le ralentissement en jaune au niveau du signal d'avant, qu'il y ai loco ou pas)
- si droit
si Canton N occupé, alors LED semaphore rouge allumé et envoi d'info d'occupation
si Canton N libre et Canton N+1 occupé alors led jaune allumée, pas d'envoi d'info occupation vers canton-1
si Canton N libre et Canton N+1 libre alors led verte allumée , pas d'envoi d'info occupation vers canton-1
Brochage Attiny84
VCC=|1 U 14|= GND
PositionAiguilles -->10 =|2 13|= 0--> LedRougeSemaphore
9=|3 12|= 1--> LedJaune
Reset =|4 11|= 2--> LedVerte
8 =|5 10|= 3--> LedRougeCarre
OccupationCantonSuivant -->7 =|6 9|= 4--> LedOeilleton
DetectionTrain -->6 =|7 8|= 5--> OccupationCanton
*/
// Constantes
/*Branchement sur ATtiny84
const byte LedRougeSemaphore = 0; // pin reliée à la led rouge Sémaphore
const byte LedJaune = 1; // pin reliée à la led jaune
const byte LedVerte = 2; // pin reliée à la led verte
const byte LedRougeCarre = 3; // pin reliée à la led rouge Carré
const byte LedOeilleton = 4; // pin reliée à la led blanche de l'oeilleton
const byte OccupationCanton = 5; // pin reliée à l'entrée "OccupationCantonSuivant" du circuit N+1
const byte DetectionTrain = 6; // pin reliée à la sortie du détecteur d'occupation du canton N
const byte OccupationCantonSuivant = 7; // pin reliée à la sortie "OccupationCanton" du canton N-1
const byte PositionAiguilles = 9; // pin reliée aux contacts de l'Aiguille2 et l'Aiguille3(si besoin)
*/
// Branchement sur Nano
const byte LedRougeSemaphore = 3; // pin reliée à la led rouge Semaphore
const byte LedJaune = 4; // pin reliée à la led jaune
const byte LedVerte = 6; // pin reliée à la led verte
const byte LedRougeCarre = 5; // pin reliée à la led rouge Carré
const byte LedOeilleton = 2; // pin reliée à la led blanche de l'oeilleton
const byte OccupationCanton = 10; // pin reliée à l'entrée "OccupationCantonSuivant" du circuit N+1
const byte DetectionTrain = 7; // pin reliée à la sortie du détecteur d'occupation du canton N
const byte OccupationCantonSuivant = 12; // pin reliée à la sortie "OccupationCanton" du canton N-1
const byte PositionAiguilles = 8; // pin reliée aux contacts de l'Aiguille2 et l'Aiguille3(si besoin))
// Variables
bool etatLedRougeSemaphore; // pour la commande d'allumage des leds
bool etatLedJaune;
bool etatLedVerte;
bool etatLedRougeCarre;
bool etatLedOeilleton;
bool etatDetection; // HIGH si Canton N libre, LOW si Canton N occupé
bool etatOccupationCanton; // HIGH si Canton N libre, LOW si Canton N occupé
bool etatOccupationCantonSuivant; // HIGH si Canton N+1 libre, LOW si Canton N+1 occupé
bool etatPositionAiguilles; // LOW si positionnement correct pour l'allumage des led rouges Carré et Sémaphore
void setup() { // configuration des différentes pins
pinMode(LedRougeSemaphore, OUTPUT);
pinMode(LedJaune, OUTPUT);
pinMode(LedVerte, OUTPUT);
pinMode(LedRougeCarre, OUTPUT);
pinMode(LedOeilleton, OUTPUT);
pinMode(OccupationCanton, OUTPUT);
pinMode(OccupationCantonSuivant, INPUT_PULLUP);
pinMode(DetectionTrain, INPUT_PULLUP);
pinMode(PositionAiguilles, INPUT_PULLUP);
} // fin setup
void loop() {
etatDetection = digitalRead(DetectionTrain); // lecture de l'état du détecteur d'occupation du canton N
etatOccupationCantonSuivant = digitalRead( OccupationCantonSuivant); // information de l'état d'occupation transmise par le canton N+1
etatPositionAiguilles = digitalRead(PositionAiguilles); // lecture de la position des aiguilles 2 et 3
digitalWrite(OccupationCanton, etatOccupationCanton); // on informe le canton N-1 de l'état du canton N
digitalWrite(LedRougeSemaphore, etatLedRougeSemaphore);// allumage ou non des leds fonction de leur état respectif
digitalWrite(LedJaune, etatLedJaune);
digitalWrite(LedVerte, etatLedVerte);
digitalWrite(LedRougeCarre, etatLedRougeCarre);//
digitalWrite(LedOeilleton, etatLedOeilleton);//
if (etatPositionAiguilles == LOW) { // aiguille2 sur droit ou aiguille3 sur dévié pour signal2
etatOccupationCanton = LOW; // information "canton N occupé" à transmettre au canton N-1
etatLedRougeCarre = HIGH; // led rouge Carré allumé
etatLedRougeSemaphore = HIGH; // led rouge Sémaphore allumé
etatLedJaune = LOW; // led jaune éteinte
etatLedVerte = LOW; // led verte éteinte
etatLedOeilleton = LOW; // led oeilleton éteinte
} // fin if
else { // aiguille2 sur dévié et aiguille3 sur droit
if (etatDetection == LOW) { // canton N occupé
etatOccupationCanton = LOW; // information "canton N occupé" à transmettre au canton N-1
etatLedRougeCarre = LOW; // led rouge Carré éteinte
etatLedRougeSemaphore = HIGH; // led rouge Sémaphore allumé
etatLedJaune = LOW; // led jaune éteinte
etatLedVerte = LOW; // led verte éteinte
etatLedOeilleton = HIGH; // led oeilleton éteinte
} // fin if
else { // canton N libre
if (etatOccupationCantonSuivant == LOW) { // canton N libre et canton N+1 occupé
etatOccupationCanton = HIGH; // information "canton N libre" à transmettre au canton N-1
etatLedRougeSemaphore = LOW; // led rouge Sémaphore éteinte
etatLedRougeCarre = LOW; // led rouge Carré éteinte
etatLedJaune = HIGH; // led jaune allumée
etatLedVerte = LOW; // led verte éteinte
etatLedOeilleton = LOW; // led oeilleton éteinte
} // fin if
else {// canton N libre et canton N+1 libre
etatOccupationCanton = HIGH; // information "canton N libre" à transmettre au canton N-1
etatLedRougeSemaphore = LOW; // led rouge Sémaphore éteinte
etatLedRougeCarre = LOW; // led rouge Carré éteinte
etatLedJaune = LOW; // led jaune éteinte
etatLedVerte = HIGH; // led verte allumée
etatLedOeilleton = LOW; // led oeilleton éteinte
} // fin else
}// fin else
} // fin else
} // loop