#include <EEPROM.h> // bibliothèque pour gérer la mise en mémoire
/*
* On va écrire/lire les valeurs positionAiguillage[I][J] de la manière suivante
* nécessite une EEprom de 1Ko mini
* adresse 0 à 31 : Itinéraire 1, aiguillages de 1 à 32
* adresse 32 à 64 : Itinéraire 2, aiguillages de 1 à 32
* adresse 65 à 97 : Itinéraire 3, aiguillages de 1 à 32
* etc ....
*
* formule de calcul
* adresse EEprom = (valeurDipItineraires * 32) + valeurDipAiguillages
*/
//#include <Bounce2.h>
#include<Wire.h>
#include <LiquidCrystal_I2C.h> // bibliothèque pour gérer écran LCD 2004
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int directBP = 12;
const int devieBP = 13;
const int directLed = A2;
const int devieLed = A3;
uint8_t positionAiguillage[8][32];
bool flagLectureDIPS;
bool flagLectureBPS;
/* DIP 3 digits pour les itinéraires */
const int pinDepartDipItineraires = 4;
const int nbPinsDipItineraires = 3;
int valeurDipItineraires;
int valeurDipDepartItineraires;
/* ================================ */
/* DIP 6 digits pour les aiguillages */
const int pinDepartDipAiguillages = 7;
const int nbPinsDipAiguillages = 5;
int valeurDipAiguillages;
int valeurDipDepartAiguillages;
/* ================================ */
void setup()
{
Serial.begin(9600);
lcd.begin(20, 4);
pinMode(directBP, INPUT_PULLUP);
pinMode(devieBP, INPUT_PULLUP);
pinMode(directLed, OUTPUT);
pinMode(devieLed, OUTPUT);
// Lecture départ du DIP des itinéraires (16 positions)
for (int i = 0; i < nbPinsDipItineraires; i++)
{
pinMode(pinDepartDipItineraires + i, INPUT_PULLUP);
valeurDipDepartItineraires += !digitalRead(pinDepartDipItineraires + i) * (1<<i);
} // Fin de for (int i = 0; i < nbPinsDipItineraires; i++)
lcd.setCursor(0, 0);lcd.print ("Iti.:");lcd.setCursor(6, 0);lcd.print(valeurDipDepartItineraires + 1);
Serial.print(F("Valeur depart itineraires : "));Serial.println(valeurDipDepartItineraires + 1);
// Lecture départ du DIP des aiguillages (64 positions)
for (int i = 0; i < nbPinsDipAiguillages; i++)
{
pinMode(pinDepartDipAiguillages + i, INPUT_PULLUP);
valeurDipDepartAiguillages += !digitalRead(pinDepartDipAiguillages + i) * (1<<i);
} // Fin de for (int i = 0; i < nbPinsDipAiguillages; i++)
lcd.setCursor(8, 0);lcd.print ("Aig.:");lcd.setCursor(14, 0);lcd.print(valeurDipDepartAiguillages + 1);
Serial.print(F("Valeur depart aiguillages : "));Serial.println(valeurDipDepartAiguillages + 1);
} // Fin de Setup
void loop(){
// Vérification changements du DIP des itinéraires (8 positions)
valeurDipItineraires = lectureDipItineraires();
if (valeurDipItineraires != valeurDipDepartItineraires){
valeurDipDepartItineraires = valeurDipItineraires;
lcd.setCursor(0, 0);lcd.print ("Iti.:");lcd.setCursor(6, 0);lcd.print(valeurDipItineraires + 1); lcd.print(" ");
Serial.print(F("Valeur lecture DIP itineraire: "));Serial.println(valeurDipItineraires + 1);
} // Fin de if (valeurDipItineraires != valeurDipDepartItineraires)
// Vérification changements du DIP des aiguillages (32 positions)
valeurDipAiguillages = lectureDipAiguillages();
if (valeurDipAiguillages != valeurDipDepartAiguillages){
valeurDipDepartAiguillages = valeurDipAiguillages;
lcd.setCursor(8, 0);lcd.print ("Aig.:");lcd.setCursor(14, 0);lcd.print(valeurDipAiguillages + 1); lcd.print(" ");
Serial.print(F("Valeur lecture DIP aiguillages: "));Serial.println(valeurDipAiguillages + 1);
} // Fin de if (valeurDipAiguillages != valeurDipDepartAiguillages)
// Si on a appuyé sur le BP "direct"
if (digitalRead(directBP) == 0){
EEPROM.update((valeurDipItineraires * 32) + valeurDipAiguillages, 1);
} // Fin de if (digitalRead(directBP) == 1)
// Si on a appuyé sur le BP "dévié"
if (digitalRead(devieBP) == 0){
EEPROM.update((valeurDipItineraires * 32) + valeurDipAiguillages, 2);
} // Fin de if (digitalRead(devieBP) == 1)
// Affichage de la position en cours pour l'itinéraire et l'aiguillage définis par la postion des deux DIP.
positionAiguillage[valeurDipItineraires][valeurDipAiguillages] = EEPROM.read((valeurDipItineraires * 32) + valeurDipAiguillages);
if (positionAiguillage[valeurDipItineraires][valeurDipAiguillages] == 1){
digitalWrite(directLed, HIGH);
digitalWrite(devieLed, LOW);
lcd.setCursor(3, 1);lcd.print (" Direct ");
} else if (positionAiguillage[valeurDipItineraires][valeurDipAiguillages] == 2) {
digitalWrite(directLed, LOW);
digitalWrite(devieLed, HIGH);
lcd.setCursor(3, 1);lcd.print (" Devie ");
} else {
digitalWrite(directLed, LOW);
digitalWrite(devieLed, LOW);
lcd.setCursor(3, 1);lcd.print (" N.C ");
} // Fin de if (positionAiguillage[valeurDipItineraires][valeurDipAiguillages] == 1){
} // Fin de loop
int lectureDipItineraires(){
int valeurLectureDipItineraires = 0;
for (int i = 0; i < nbPinsDipItineraires; i++)
{
valeurLectureDipItineraires += !digitalRead(pinDepartDipItineraires + i) * (1<<i);
} // Fin de for (int i = 0; i < nbPinsDipItineraires; i++)
return(valeurLectureDipItineraires);
} // Fin de prodédure lectureDipItineraires()
int lectureDipAiguillages(){
int valeurLectureDipAiguillages = 0;
for (int i = 0; i < nbPinsDipAiguillages; i++)
{
valeurLectureDipAiguillages += !digitalRead(pinDepartDipAiguillages + i) * (1<<i);
} // Fin de for (int i = 0; i < nbPinsDipAiguillages; i++)
return(valeurLectureDipAiguillages);
} // Fin de prodédure lectureDipAiguillages()
void lectureDIPS (void){
flagLectureDIPS = true;
}
void lectureBPS (void){
flagLectureBPS = true;
}