/* ------------------------------------------------------------------------
* Ce programme est un automate qui compte le nombre de tours de circuit
* effectues par un train avant de l'arreter en gare.
* Christian BEZANGER - Septembre 2021 - Aout 2022 - Domaine public
* -----------------------------------------------------------------------*/
#include <LiquidCrystal.h>
// definition des sorties
const byte ILS = 2; // entrée de l'ILS
const byte BP = 3; // entrée du bouton poussoir
const byte relais = 10; // sortie commande relais
// ecran LCD
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
// initialisation des variables
unsigned int lecture_A0 = 0;
byte nombre_tours_prevus = 1; // Au moins un tour sinon cela n'a pas de sens
volatile static byte nombre_tours_realises = 0;
volatile static boolean departTrain = false; // true si départ du train est autorisé
volatile static unsigned long old_top_debutISR2; // Date antérieure d'appel ISR sur entrée 2
volatile static unsigned long old_top_debutISR3; // Date antérieure d'appel ISR sur entrée 3
// Sub Routines d'Interruption
void comptage() { // routine d'interruption (ISR) sur entree 2 (ILS)
unsigned long top_debutISR2 = millis(); // date appel ISR
if((top_debutISR2 - old_top_debutISR2) > 2000) {
// 2 secondes au moins entre exécution ISR (évite double détection)
nombre_tours_realises = nombre_tours_realises + 1; // incrémente le nombre de tours réalisés
old_top_debutISR2 = top_debutISR2; // initialisation date antérieure d'appel ISR
}
} // fin de ISR comptage
void depart() { // routine d'interruption (ISR) sur entree 3 (BP)
unsigned long top_debutISR3 = millis(); // date appel ISR
if((top_debutISR3 - old_top_debutISR3) > 2000) {
// 2 secondes au moins entre exécution ISR (évite double détection)
departTrain = true; // départ du train est autorisé
nombre_tours_realises = 0; // si départ donné, remise à zéro
old_top_debutISR3 = top_debutISR3; // initialisation date antérieure d'appel ISR
}
} // fin de ISR depart
void setup() {
// put your setup code here, to run once:
pinMode(ILS, INPUT_PULLUP);
pinMode(BP, INPUT_PULLUP);
pinMode(relais, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ILS),comptage, FALLING);
attachInterrupt(digitalPinToInterrupt(BP), depart, FALLING);
lcd.begin(16, 2); // 2 LIGNES
} // Fin de setup
void loop() {
// Lecture du potentiomètre
lecture_A0 = analogRead(A0);
// Détermination du nombre de tours à réaliser
nombre_tours_prevus = lecture_A0/114 + 1;
// Affichage des données sur écran LCD
lcd.setCursor(0, 0);
lcd.print("PREVUS:");
lcd.print(nombre_tours_prevus);
lcd.print("-REELS:");
lcd.print(nombre_tours_realises);
// Comparaison des valeurs de nombres de tours
if(nombre_tours_realises >= nombre_tours_prevus)
{
departTrain = false;
} // Fin de comparaison
// Départ ou arrêt du train
if(departTrain == true)
{
lcd.setCursor(0, 1);
lcd.print("DEPART EN GARE");
digitalWrite(relais, HIGH);
} // Fin du cas true
if(departTrain == false)
{
lcd.setCursor(0, 1);
lcd.print("ARRET EN GARE ");
digitalWrite(relais, LOW);
} // Fin du cas false
} // Fin de loop