/*
*************************************************
* Feux de passage à niveau français *
* version 20250117 *
* double voies *
* Arduino ATtiny85 *
* simulation sur *
* https://wokwi.com/projects/419037515415254017 *
*************************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Ce code est distribué gratuitement sous licence !
! Creativ Commons CC-BY-NC-ND 3.0 !
! !
! Cette licence permet à d'autres utilisateurs d'utiliser ce code !
! à des fins non commerciales, dans la mesure où le nom de l'auteur est !
! mentionné. Toute modification du code devra être soumise à !
! l'autorisation expresse de l'auteur. !
! !
! auteur Philippe GUENET - [email protected] - https://wgnt-train.fr !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pour ATtiny 85
====================
Restet VCC
PB3/A3 PB2/A1/SCL
PB4/A2 PB1
GND PB0/SDA
====================
On utilise une fréquence de 1Hz qui semble être la norme SNCF
*/
#include <Arduino.h>
#include <Bounce2.h>
Bounce detection;
const byte pinDetection = PB2;
const byte pinLedsRouge1 = A2; // feux rouge A A2
const byte pinLedsRouge2 = A3; // feux rouge B A3
const int luminositeMiniRouges = 0; // *
const int luminositeMaxiRouges = 250; // *
int luminositeLedsRouges = luminositeMiniRouges;
const int intervalRouges = (1200 / (2 * luminositeMaxiRouges)); // le clignotement est calculé sur une fréquence de 1 Hz (1000) qui semble être la norme SNCF
unsigned long previousMillis = 0; // Dernière mise à jour
bool flagExtinction = false; // Indique si la LED est en train de s'éteindre
enum etatRouges {
Rouges_INIT,
Rouges_UP,
Rouges_DOWN,
};
volatile etatRouges etatLedsRouges = Rouges_INIT;
void setup() {
pinMode(pinLedsRouge1, OUTPUT);
pinMode(pinLedsRouge2, OUTPUT);
analogWrite(pinLedsRouge1, 0); // Initialise la LED 1 à 0% de luminosité
analogWrite(pinLedsRouge2, 0); // Initialise la LED 2 à 0% de luminosité
detection.attach(pinDetection, INPUT_PULLUP);
detection.interval(10);
} // Fin de setup()
void loop() {
detection.update(); // Met à jour l'état du bouton via Bounce2
if (detection.fell()){
flagExtinction = false;
etatLedsRouges = Rouges_UP;
} else if (detection.rose()){
flagExtinction = true;
etatLedsRouges = Rouges_DOWN;
} // Fin de if (detection.fell())
// Gère l'état actuel des LEDs
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= intervalRouges) {
previousMillis = currentMillis;
switch (etatLedsRouges) {
case Rouges_UP:
luminositeLedsRouges++;
if (luminositeLedsRouges >= luminositeMaxiRouges) {
luminositeLedsRouges = luminositeMaxiRouges;
etatLedsRouges = Rouges_DOWN; // Passe à la descente
}
break;
case Rouges_DOWN:
luminositeLedsRouges--;
if (luminositeLedsRouges <= luminositeMiniRouges) {
luminositeLedsRouges = luminositeMiniRouges;
delay(100);
etatLedsRouges = Rouges_INIT; // Arrête après la fin du fade-out
flagExtinction = false; // Permet d'attendre le prochain appui du bouton
}
break;
case Rouges_INIT:
// Attente de la transition vers un autre état
if (detection.read() == LOW) {
etatLedsRouges = Rouges_UP; // Commence à monter la luminosité
} // Fin de if (detection.read() == LOW)
break;
} // Fin de switch (etatLedsRouges)
// Applique la luminosité aux LEDs
analogWrite(pinLedsRouge1, luminositeLedsRouges);
analogWrite(pinLedsRouge2, luminositeLedsRouges);
} // Fin de if (currentMillis - previousMillis >= intervalRouges)
} // Fin de loop()