/* Claude EMERY - Barrière SNCF avec ATtiny -
* Modifié le 21/06/2026
* Ajout de la led verte
* Simulation des 2 ILS par 1 seul bouton poussoir
* 1er appui -> le train arrive
* 2eme appui le train est passé
* --------------------------------------------------------------------------------
* Source : https://www.locoduino.org/spip.php?article194
* Servo_PN_ATtiny.ino
* --------------------------------------------------------------------------------
* Servomoteur avec un ATtiny pour barrieres PN
* Fabrique sur la sortie ServoPin un signal de servomoteur avec une
* impulsion reglable de pulseMin a pulseMax (soit 1 a 2 ms) et
* avec une période de 15000 µS (soit 15 ms) qui est fixe.
* 1,0 ms ==> servo a -90°
* 1,5 ms ==> servo centré
* 2,0 ms ==> servo a +90°
* En fait, depend du modele de servo
* --------------------------------------------------------------------------------
* ILS non declenche ==> barrieres fixes (ouvertes ou fermees)
* ILS declenche ==> provoque mouvement des barrieres
* --------------------------------------------------------------------------------
* Introduit le clignotement des feux rouges de PN sur sortie ledPin
*/
// constantes :
const int bpPin = 4; // ILS
const int ServoPin = 3; // Servo
const int ledRouge = 0; // LED de feu rouge - Les voitures s'arretent
const int ledVert = 1; // LED de feu vert - Les voiture peuvent passer
const int nbre_cligno_avant = 3; // clignotement des LED avant fermeture barrieres
const int duree_cligno = 500; // demi periode de clignotement des LED en ms
const long period = 15000; // periode (en microsecondes; comprise entre 10 et 20 ms)
const long pulseMin = 1000; // logiquement >= 1000
const long pulseMax = 2000; // logiquement <= 2000
// Ces deux valeurs permettent un debattement de 90° du servo
// variables :
unsigned long debut_boucle = 0; // memorise le debut du signal Servo
unsigned long duree_signal = 2000; // signal limite en duree pour eviter fretillement
unsigned long previousMicros = 0; // memorise l instant du front montant
unsigned long previousMillis = 0; // memorise changement d etat de la DEL
unsigned long currentMicros;
unsigned long currentMillis;
long pulse = 1000; // Impulsion en microsecondes du signal, de pulseMin a pulseMax
void setup() {
pinMode(bpPin, INPUT_PULLUP);
pinMode(ServoPin, OUTPUT);
pinMode(ledRouge, OUTPUT);
pinMode(ledVert, OUTPUT);
digitalWrite(ledVert,1); // LED verte allumée à l'initialisation
}
void loop() {
debut_boucle = millis();
while(digitalRead(bpPin) == 1){
// ILS non declenche
pulse = pulseMin;
currentMicros = micros();
if(currentMicros - previousMicros >= pulse) {
digitalWrite(ServoPin, 0);
}
if (currentMicros - previousMicros >= (period - pulse)) {
digitalWrite(ServoPin, 1);
previousMicros = currentMicros;
}
if(millis() - debut_boucle >= duree_signal){
break; // on arrete le signal après 2 secondes
}
}
while(digitalRead(bpPin) == 1) {
// attendre
}
// Ici, ILS declenche : clignotement LED rouge
for(int i = 1; i <= nbre_cligno_avant; i++) {
digitalWrite(ledVert, 0);
digitalWrite(ledRouge, 1);
delay(duree_cligno);
digitalWrite(ledRouge, 0);
delay(duree_cligno);
}
debut_boucle = millis();
while(digitalRead(bpPin) == 1) {
currentMillis = millis();
pulse = pulseMax;
currentMicros = micros();
if(currentMicros - previousMicros >= pulse) {
digitalWrite(ServoPin, 0);
}
if (currentMicros - previousMicros >= (period - pulse)) {
digitalWrite(ServoPin, 1);
previousMicros = currentMicros;
}
// Clignotement LED rouge
if (currentMillis - previousMillis >= duree_cligno) {
digitalWrite(ledRouge, !digitalRead(ledRouge));
previousMillis = currentMillis;
}
if(millis() - debut_boucle >= duree_signal) {
break; // on arrete le signal apres 2 secondes
}
}
while(digitalRead(bpPin) == 1) {
// LED continuent a clignoter
currentMillis = millis();
if(currentMillis - previousMillis >= duree_cligno) {
digitalWrite(ledRouge, !digitalRead(ledRouge));
previousMillis = currentMillis;
}
}
// Declenchement ILS
delay(500); // anti-rebond
digitalWrite(ledRouge, 0); // Extinction LED rouge
digitalWrite(ledVert, 1); // Allumage LED verte
// ouverture des barrières se fera en debut de fonction loop
}Vert -> Voiture passe
Rouge -> Voiture s'arrête
Simulation ILS
1er appui -> le train arrive ...
2eme appui -> le train est passé ...
Ouverture / Fermeture barrière