/*attiny84 BAL2
23/08/2022
Fantasio
gestion carré et oeilleton
test: ok sur Nano
simulation:
https://wokwi.com/projects/340777383909917267 si Canton N occupé
alors led rouge Sémaphore allumée et envoi info d'occupation vers Canton-1
la led rouge Carré du Signal2 s'allume si Aiguille2 en droit ou Aigille3 en dévié
la led rouge Carré du signal4 s'allume si Aiguille2 en dévié
l'oeilleton s'allume si led rouge Carré éteinte par position différente des aiguilles
si Canton N libre et Canton N+1 occupé alors led jaune allumée
si Canton N libre et Canton N+1 libre alors led verte allumée
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
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 = 9; // 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 de la led rouge Carré
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 (etatDetection == LOW) { // canton N occupé
etatOccupationCanton = LOW; // information "canton N occupé" à transmettre au canton N-1
etatLedJaune = LOW; // led jaune éteinte
etatLedVerte = LOW; // led verte éteinte
etatLedRougeSemaphore = HIGH; // led rouge Sémaphore allumé
if (etatPositionAiguilles == LOW) { // et aiguille2 sur droit ou aiguille3 sur dévié pour signal2
etatLedRougeCarre = HIGH; // led rouge Carré allumé
etatLedOeilleton = LOW; // led oeilleton éteinte
} // fin if
else { // canton N occupé mais aiguille2 sur dévié et aiguille3 sur droit
etatLedRougeCarre = LOW; // led rouge Carré éteinte
etatLedOeilleton = HIGH; // led oeilleton allumé
} // fin else
} // fin if
else { // canton N 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
etatLedOeilleton = LOW; // led oeilleton éteinte
if (etatOccupationCantonSuivant == LOW) { // canton N libre et canton N+1 occupé
etatLedJaune = HIGH; // led jaune allumée
etatLedVerte = LOW; // led verte éteinte
} // fin if
else { // canton N libre et canton N+1 libre
etatLedJaune = LOW; // led jaune éteinte
etatLedVerte = HIGH; // led verte allumée
} // fin else
} // fin else
} // fin loop