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
|
const int nbBtn = 8; // le code est composé de 8 boutons
// Les boutons sont sur les entrées 2, 3, 4, 5, 6, 7, 8, 9. Sur UNO on évitera de connecter les voies 0 et 1 surtout si on utilise les fonctions Serial()
int codeSecret[nbBtn]={1,3,5,7,2,4,6,8}; // Code secret, ordre des boutons
int codeBtn[nbBtn]={2,3,4,5,6,7,8,9}; // code, l'ordre a une importance (le code est ici 23456789).
int codeLed[nbBtn]={A0, A1, A2, A3, A4, A5, 10, 11}; // Ports des LED
int relais = 13; // sortie pour le relais (il y a aussi une led montée sur la platine)
int i, idx;
bool erreur;
void setup()
{
Serial.begin(115200);
// configuration des E/S
for (i=0; i<nbBtn; i++)
{
pinMode(codeBtn[i], INPUT_PULLUP);
pinMode(codeLed[i], OUTPUT);
}
pinMode(relais, OUTPUT);
idx = 0;
erreur = false;
ledToutChanger(LOW);
}
void loop()
{
erreur = false;
// rappel : les entrées sont en pull-up.
// on scanne toutes les voies, si une voie est à 0 (LOW) et que cela correspond, on incrémente un compteur
// si le mauvais bouton est pressé, il y a erreur, le compteur retourne à et on doit recommencer la séquence.
for (i=0; i<nbBtn; i++)
{
int codeSecretPin = codeBtn[codeSecret[i]-1];
if (digitalRead(codeBtn[codeSecret[i]-1]) == LOW)
{
delay(20);
if (i == idx)
{
digitalWrite(codeLed[codeSecret[i]-1], HIGH); // On allume la LED
idx++;
}
else
erreur = true;
}
while(digitalRead(codeBtn[codeSecret[i]-1]) == LOW){} // On attend le relachement du bouton
}
if (erreur)
{
ledToutChanger(LOW);
idx = 0;
digitalWrite(relais, HIGH); // Flasher la LED en cas d'erreur
delay(500);
digitalWrite(relais, LOW);
}
if (idx == nbBtn) // gagné
{
digitalWrite(relais, HIGH); // ouverture loquet
for (int i = 0; i < 4; i ++)
{
delay(500);
ledToutChanger(LOW);
delay(500);
ledToutChanger(HIGH);
}
delay(5000);
digitalWrite(relais, LOW); // fermeture loquet après 10s
ledToutChanger(LOW);
idx = 0;
}
}
void ledToutChanger(int ledEtat)
{
for (i=0; i<nbBtn; i++) // Pour eteindre toutes les LED
{
digitalWrite(codeLed[i], ledEtat); // Eteindre les LED
}
} |
Partager