Le cadenas à code
Un seul bouton, mais une combinaison secrète faite d'appuis courts et longs. Le bon code déverrouille, le mauvais déclenche l'alarme.
Le principe du morse détourné en serrure. Avec un seul bouton, tu obtiens autant de combinaisons qu'avec un clavier.
SunuMake Découverte
Tes premiers pas avec Arduino - 8 composants inclus.
Ce qu'il faut sortir du kit
Prépare tout avant de commencer : c'est plus agréable que de fouiller la boîte au milieu du câblage.
- 1Carte Arduino UNO
- 1Plaque d'essai (breadboard)
- 1Bouton poussoir
- 2LED— une verte (ouvert) et une rouge (refusé)
- 2Résistances 220 Ω
- 1Buzzer piezo
- 6Fils de connexion
Le schéma des branchements
Débranche toujours l'USB avant de modifier un câblage, et vérifie ce tableau ligne par ligne avant de rebrancher.
| On relie | à | en passant par |
|---|---|---|
| Bouton — patte 1 | Broche 7 | Aucune résistance : INPUT_PULLUP |
| Bouton — patte 2 | GND | Rail bleu (−) |
| LED verte — patte longue | Broche 8 | Résistance 220 Ω |
| LED rouge — patte longue | Broche 9 | Résistance 220 Ω |
| Buzzer — patte + | Broche 11 | Direct |
| Pattes courtes LED + 2e patte buzzer | GND | Rail bleu (−) |
Les étapes
- 1
Matériel
1 bouton poussoir, 2 LED (une verte, une rouge), 2 résistances 220 Ω, 1 buzzer, des fils.
- 2
Câble le bouton
Une patte à la broche 7, l'autre à GND. On réutilise `INPUT_PULLUP`, donc pas de résistance externe.
- 3
Câble les LED et le buzzer
LED verte → broche 8 (via résistance), LED rouge → broche 9 (via résistance), buzzer → broche 11. Toutes les pattes courtes et la seconde patte du buzzer vont au rail bleu (−), relié à GND.
- 4
Apprends le code secret
Le code par défaut est : **court, court, long, court**. Un appui de moins d'une demi-seconde compte comme court ; au-delà, comme long. La LED verte clignote à chaque appui enregistré.
- 5
Téléverse et essaie
Entre la bonne séquence : la LED verte reste allumée deux secondes et un joli bip retentit. Trompe-toi volontairement : la LED rouge s'allume et le buzzer grogne. Ensuite, change le code dans la ligne `const bool CODE[]`.
Le programme à téléverser
Copie ce code dans l'IDE Arduino, branche ta carte en USB et clique sur le bouton « Téléverser » (la flèche en haut à gauche).
// Le cadenas à code - SunuMake// Le code est une suite d'appuis COURTS (false) et LONGS (true).const int BOUTON = 7;const int LED_OK = 8;const int LED_KO = 9;const int BUZZER = 11;const bool CODE[] = {false, false, true, false}; // court, court, long, courtconst int TAILLE = 4;const int SEUIL_LONG = 500; // au-delà de 500 ms, l'appui est « long »bool saisie[TAILLE];int position = 0;void setup() { pinMode(BOUTON, INPUT_PULLUP); pinMode(LED_OK, OUTPUT); pinMode(LED_KO, OUTPUT);}void loop() { if (digitalRead(BOUTON) == LOW) { // appui détecté unsigned long debut = millis(); while (digitalRead(BOUTON) == LOW) { } // on attend le relâchement unsigned long duree = millis() - debut; saisie[position] = (duree > SEUIL_LONG); // true si appui long position++; // Retour visuel : la verte confirme la prise en compte. digitalWrite(LED_OK, HIGH); delay(80); digitalWrite(LED_OK, LOW); if (position == TAILLE) { verifier(); position = 0; } delay(200); // petite pause anti-rebond }}void verifier() { bool correct = true; for (int i = 0; i < TAILLE; i++) { if (saisie[i] != CODE[i]) correct = false; } if (correct) { digitalWrite(LED_OK, HIGH); tone(BUZZER, 880, 150); delay(200); tone(BUZZER, 1320, 300); delay(400); digitalWrite(LED_OK, LOW); } else { digitalWrite(LED_KO, HIGH); tone(BUZZER, 150, 600); delay(800); digitalWrite(LED_KO, LOW); }}Comment ça marche ?
Le cœur de ce projet, c'est la mesure de durée. millis() renvoie le nombre de millisecondes écoulées depuis l'allumage de la carte. En notant l'instant du début de l'appui puis celui du relâchement, la soustraction donne la durée exacte - et donc si l'appui était court ou long.
Contrairement à delay(), qui bloque tout le programme, millis() permet de mesurer le temps sans jamais s'arrêter. C'est la technique qu'on utilise dès qu'un projet doit faire deux choses en même temps.
La boucle while (digitalRead(BOUTON) == LOW) { } est vide exprès : elle ne fait qu'attendre que le doigt se lève. Ça s'appelle une attente active.
Enfin, saisie[] et CODE[] sont deux tableaux de la même taille : vérifier revient à les comparer case par case. Dès qu'une case diffère, correct bascule à false et ne redeviendra jamais vrai - c'est le principe du « ET » logique appliqué à toute une série.
Idée d'amélioration : après trois échecs, bloque le cadenas pendant 10 secondes. C'est ce que fait ton téléphone.