Pour ce même code, est-il possible de rajouter une led 'verte' afin de valider chaque bouton validé dans l'ordre de la séquence?
Chacune des 8 led resteraient allumés tant que la séquence est correcte.
Merci
Version imprimable
Pour ce même code, est-il possible de rajouter une led 'verte' afin de valider chaque bouton validé dans l'ordre de la séquence?
Chacune des 8 led resteraient allumés tant que la séquence est correcte.
Merci
Salut Jay M
C'est ajouté dans la simulation et ça va nettement mieux!
Cordialement
jpbbricole
Bonjour jeanphikhors
Voilà une solution:
C'est modifié dans l'émulateur.Code:
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 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 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; ledToutEteindre(); } 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++) { if (digitalRead(codeBtn[i]) == LOW) { delay(20); if (i == idx) { digitalWrite(codeLed[idx], HIGH); // On allume la LED idx++; } else erreur = true; } while(digitalRead(codeBtn[i]) == LOW){} // On attend le relachement du bouton } if (erreur) { ledToutEteindre(); 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 delay(10000); digitalWrite(relais, LOW); // fermeture loquet après 10s ledToutEteindre(); idx = 0; } } void ledToutEteindre() { for (i=0; i<nbBtn; i++) // Pour eteindre toutes les LED { digitalWrite(codeLed[i], LOW); // Eteindre les LED } }
Attention, il ne te reste plus beaucoup d'E/S de libres!
Cordialement
jpbbricole
super simulation
(attention à la valeur des 2 premières résistances pour les LEDs vertes dans la simulation, c'est un peu faible)
je ne comprends pas. une fois le relais allumé et éteint (10s), les LEDs s'éteignent aussi et on est prêt à recommencerCitation:
remise à zéro en fin de programme pour les Leds cette fois-ci
Avec les LEDs vertes c'est quand même "plus simple" maintenant de découvrir le code car on sait tout de suite si le bouton appuyé est le bon -> on devine en 35 essais max au lieu de 40 320 (si on sait que tous les boutons sont utilisés et ne le sont qu'une seule fois)
Bonsoir à tous
En même temps, il est dit au début de ce sujet que c'est un jeu pour des enfants...
"Pour le sport" j'ai fait une version qui permet de choisir l'ordre dans lequel les boutons doivent être pressés. La simulation.
Il suffi de modifier le tableau:
Il n'y a pas, bien sûre, pour faire simple, de routine pour tester de la cohérence (doublons ou absence de chiffres) des modifications.Code:codeSecret[nbBtn]={1,3,5,7,2,4,6,8}; // Code secret, ordre des boutons
Le code:
CordialementCode:
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 } }
jpbbricole