/* TRAIN
Programme permétant le contrôle digital d'un projet de train électrique mignature.
Version 1.0
Auteur: Christian Roberge
Date: 1-07-2026
Cette partie du programme contient les biblioteque du repeteur. NE PAS MODIFIER LES LIGNES CI-DESSOUS.*/
#include <Wire.h> //Library Wire.h
#include <LiquidCrystal_I2C.h> //Library display cristal liquide i2c
/*Cette partie du programme sert a la configuration du système. Elle contient des variables qui peuvent être modifier
en fonction des besoins de l'utilisateur. */
const byte PassageDetect = 2; //Détection d'arrivé de train passage 1
const byte TestLed = 13; //Test seulement. A effacer
const byte LedFinLigne = 22; //LED de fin de ligne
bool EtatLedFinLigne = LOW; //Quel est l'état des LED in de ligne
const byte LedPassage1activer = 23; //LED passage a niveau 1 activé ou pas
const byte LedPassage1 = 24; //LED passage a niveau 1 flash
bool EtatLedPassage1 = LOW; //Quel est l'état des LED passage a niveau
bool EtatPassage1 = HIGH; //Le passage1 est-t-il activé ou pas
/* Cette partie du programme sert a la configuration du systèeme. Elle contient des variables qui serve au bon fonctionnement
du système. NE PAS CHANGER CES VARIABLES. UN DISFONCTIONNEMENT DU SYSTÈME EST ENVISAGEABLE SI CES FARIABLES SONT MODIFIER.
Demander au manifacturier si vous avez des questions ou besoins particulier. Il vous indiquera la marche a suivre pour modifier
les variables ci-cessous. */
int LCDAddresse = 0x27; //Addresse de l'affichage I2C
byte LCDnbCol = 16; //Display LCD = Nombre de carartères (colonnes)
byte LCDnbLg = 4; //Display LCD = Nombre de lignes
LiquidCrystal_I2C lcd(LCDAddresse, LCDnbCol, LCDnbLg); // Initialisation de la library I2C address 0x20, 16 colonnes and 4 lignes
unsigned long DelaiLedFinLigne = 400; //Nombre de miliseconde que les LED LedFinLigne doivent flacher 1000 = 1 seconde.
unsigned long StartLedFinLigne = 0; //Déclaration de la variable temps initial LedFinLigne (utilisé avec fonction "millis()")
unsigned long PreviousLedFinLigne = 0; //Déclaration de la variable temps précédente LedFinLigne (utilisé avec fonction "millis()")
//---
unsigned long DelaiLedPassage1 = 500; //Nombre de miliseconde que les LED doivent flacher 1000 = 1 seconde.
unsigned long StartLedPassage1 = 0; //Déclaration de la variable temps initial Passage1 (utilisé avec fonction "millis()")
unsigned long PreviousLedPassage1 = 0; //Déclaration de la variable temps précédente Passage1 (utilisé avec fonction "millis()")
void setup() {
Serial.begin(9600); //Initialisation du port série USB 9600 baud
delay(200); //Delais d'initialisation USB
lcd.init(); //initialise lcd_I2C du 2e écran
lcd.backlight(); //Active le rétroéclairage du 2e écran
pinMode(LedFinLigne, OUTPUT); //Configuration des LED de fin de ligne
//Config du passage a niveai 1
pinMode(PassageDetect, INPUT); //Configuration pin entré détection d'arrivé de train passage 1
pinMode(LedPassage1, OUTPUT); //Configuration des LED de fin de ligne
digitalWrite(LedPassage1activer,LOW); //On déactive le passage 1 (on étein LED passage 1)
//Config des LED de fin de ligne
digitalWrite(LedFinLigne,EtatLedFinLigne); //On affiche a la sortie des LED fin de ligne
digitalWrite(LedPassage1,EtatLedPassage1); //On affiche a la sortie des LED fin de ligne
LCDClear(); //On efface le lcd
LcdMessage(1); //Envoi du message 1 "Mode AUTO"
delay(2000); //Delais transmission USB
}
void loop() {
LedFinLigneFlash(); //Fonction faisant flacher toutes les LED de fin de ligne
Passage1(); //Test clignotement passage a niveau 1
}
void LCDClear() { //Fonction qui permet d'effacer les LCD
lcd.clear(); //Clear display I2C
}
void LcdMessage(int Message) { //Fonction qui a pour but l'affichage de messages sur le display LCD
/*1= "TRAIN ver 1.0"
2= "COM1 initialiser"
3= "Test LED"
4= "Test SPEACH"
5= "READY "
6= "VHF:OFF"
7= "VHF:ON "
8= "UHF:OFF"
9= "UHF:ON "
10= "MEMERE "
11= "VE2-XXX "
12= "IDENT."
13=
14=
Default= "Error 10 "
*/
String LCDMessage; //Déclaration variable type string pour stoquer le message a envoyer
switch (Message) {
case 1: //Message 1"
LCDMessage = "TRAIN ver: 1.0"; //Message a envoyer sur le LCD
lcd.clear(); //Efface le LCD
lcd.setCursor(3,0); //Position curseur position 0 ligne 0
lcd.print(LCDMessage); //Affichage message sur LCD I2C
break;
case 2: //Message 2
LCDMessage = "COM1 initialiser"; //Message a envoyer sur le LCD
lcd.clear(); //Efface le LCD
lcd.setCursor(0,0); //Position curseur position 0 ligne 0
lcd.print(LCDMessage); //Affichage message sur LCD I2C
break;
}
}
void LedFinLigneFlash() { //Fonction faisant flacher toutes les LED de fin de ligne
StartLedFinLigne = millis(); //Debut temps compteur StartLedFinLigne
if((StartLedFinLigne - PreviousLedFinLigne) > DelaiLedFinLigne){ //Si compteur debut - compteur avant > DelaiLedFinLigne
PreviousLedFinLigne = StartLedFinLigne; //Reset compteur previousLedAuto
EtatLedFinLigne=!EtatLedFinLigne; //On inverse l'etat des LED fin de ligne
digitalWrite(LedFinLigne,EtatLedFinLigne); //On affiche a la sortie la nouvelle valeur led
}
}
void Passage1() {
EtatPassage1 = digitalRead(PassageDetect); //Test de détection de train du passage a niveau1
Serial.print("PassageDetect"); Serial.println(PassageDetect);
Serial.print("EtatPassage1"); Serial.println(EtatPassage1);
Serial.print("LedPassage1activer"); Serial.println(LedPassage1activer);
if (EtatPassage1 == LOW) { //Passage active ou pas?
digitalWrite(LedPassage1activer,HIGH); //On active le passage 1 (on permet aux led d'allumer)
StartLedPassage1 = millis(); //Debut temps compteur StartLedFinLigne
if((StartLedPassage1 - PreviousLedPassage1) > DelaiLedPassage1){ //Si compteur debut - compteur avant > DelaiLedFinLigne
PreviousLedPassage1 = StartLedPassage1; //Reset compteur previousLedAuto
EtatLedPassage1=!EtatLedPassage1; //On inverse l'etat des LED fin de ligne
digitalWrite(LedPassage1,EtatLedPassage1); //On affiche a la sortie la nouvelle valeur led
}
} else {
digitalWrite(LedPassage1,LOW); //On adéactive relais LED
digitalWrite(LedPassage1activer,LOW); //On déactive le passage 1 (on étein LED passage 1)
EtatPassage1 = HIGH; //Reset input passage 1
}
}