1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| const byte entreeInutile = 255;
// on déclare les aiguillages
struct t_aiguillage {
const char * identifiant;
const byte pinActiverDroite;
const byte pinActiverGauche;
};
t_aiguillage lesAiguillages[] =
{
{"G1", 22, entreeInutile},
{"A1", 23, 24},
{"A2", 25, 26},
{"A3", 27, 28},
{"A4", 29, 30},
{"B1", 31, 32},
{"B2", 33, 34},
{"B3", 35, 36},
{"B4", 37, 38},
};
const byte nombreAiguillages = sizeof(lesAiguillages) / sizeof(lesAiguillages[0]);
// pour simplifier les références dans le tableau on définit des noms pour les aiguillages. cette énumération contient les indices d'un aiguillage dans le tableau
enum : byte {a_G1, a_A1, a_A2, a_A3, a_A4, a_B1, a_B2, a_B3, a_B4};
struct t_actionAiguillage {
const byte indexAiguillage;
const byte position;
};
const byte nombreMaximumAiguillageSurCheminement = 4;
// on déclare les cheminements possibles
struct t_cheminement {
const char * identifiant;
t_actionAiguillage actions[nombreMaximumAiguillageSurCheminement];
};
// pour simplifier la lecture on définit les mots clés DROITE et GAUCHE
enum : byte {DROITE = 'D', GAUCHE = 'G'};
t_cheminement lesChemins[] = {
{ "C1 V1", {{a_G1, DROITE}, {a_A1, GAUCHE}, {a_A3, DROITE}, {entreeInutile, entreeInutile}}},
{ "C1 V2", {{a_G1, DROITE}, {a_A1, DROITE}, {a_A4, DROITE}, {entreeInutile, entreeInutile}}},
{ "C2 V1", {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
{ "C2 V2", {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
{ "C2 V3", {{a_B1, DROITE}, {a_B4, DROITE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
{ "C3 V1", {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
{ "C3 V2", {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
{ "C3 V3", {{a_B2, GAUCHE}, {a_B4, GAUCHE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
};
// pour simplifier les références dans le tableau on définit des noms pour les chemins. cette énumération contient les indices d'un cheminement dans le tableau
enum : byte {c_C1_V1, c_C1_V2, c_C2_V1, c_C2_V2, c_C2_V3, c_C3_V1, c_C3_V2, c_C3_V3};
#include <simpleBouton.h> // à télécharger sur https://forum.arduino.cc/index.php?topic=375232.0
const byte pinBoutons[] = {5, 6, 7, 8, 9, 10, 11, 12};
const byte nombreDeBoutons = sizeof(pinBoutons) / sizeof(pinBoutons[0]); // doit correspondre au nombre de chemins
simpleBouton* lesBoutons[nombreDeBoutons];
const unsigned long dureeImpulsion = 50ul; // durée d'une impulsion sur la pin d'un aiguillage en ms
void impulsion(byte numPin)
{
digitalWrite(numPin, HIGH);
delay(dureeImpulsion);
digitalWrite(numPin, LOW);
}
void activerCheminement(byte c)
{
Serial.print(F("Cheminement "));
Serial.print(lesChemins[c].identifiant);
Serial.println(F(" demandé"));
for (byte i = 0; i < nombreMaximumAiguillageSurCheminement; i++) {
if (lesChemins[c].actions[i].position == DROITE) {
Serial.print(F("Aiguillage "));
Serial.print(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].identifiant);
Serial.println(F(" à Droite"));
impulsion(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].pinActiverDroite); // impulsion sur la pin de droite
} else if (lesChemins[c].actions[i].position == GAUCHE) {
Serial.print(F("Aiguillage "));
Serial.print(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].identifiant);
Serial.println(F(" à Gauche"));
impulsion(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].pinActiverGauche); // impulsion sur la pin de gauche
}
}
Serial.println();
}
void configurerLaGare()
{
Serial.println(F("*** Configuration Initiale ***"));
activerCheminement(c_C1_V1);
activerCheminement(c_C2_V2);
activerCheminement(c_C3_V3);
}
void setup()
{
Serial.begin(115200);
for (byte i = 0; i < nombreAiguillages; i++) {
if (lesAiguillages[i].pinActiverGauche != entreeInutile) pinMode(lesAiguillages[i].pinActiverGauche, OUTPUT);
if (lesAiguillages[i].pinActiverDroite != entreeInutile) pinMode(lesAiguillages[i].pinActiverDroite, OUTPUT);
Serial.print(F("Aiguillage "));
Serial.print(lesAiguillages[i].identifiant);
Serial.println(F(" configuré."));
}
Serial.println();
for (byte i = 0; i < nombreDeBoutons; i++) {
lesBoutons[i] = new simpleBouton(pinBoutons[i]); //Cablage : pin---BP---GND. Débounce à 20ms par défaut
Serial.print(F("Bouton du cheminement "));
Serial.print(lesChemins[i].identifiant);
Serial.println(F(" configuré."));
}
Serial.println();
// enfin on configure la gare
configurerLaGare();
Serial.println(F("*** CONFIGURATION TERMINEE ***\n"));
}
void loop()
{
for (byte bp = 0; bp < nombreDeBoutons; bp++) {
lesBoutons[bp]->actualiser();
if (lesBoutons[bp]->vientDEtreEnfonce()) activerCheminement(bp);
}
} |
Partager