Chronomètre de réflexes
Arduino C++Créez un jeu de réflexes sur la carte que vous venez de monter. La LED de la broche 13 s'allume après une attente aléatoire de 1 à 3 s ; le joueur appuie le plus vite possible sur le bouton de D2 (relié à GND), et le temps entre la LED et l'appui s'affiche, par exemple, sous la forme Reaction: 312 ms. Un appui avant la LED affiche Too soon!. Après chaque appui, la LED s'éteint et une nouvelle manche commence. Captez l'appui avec une interruption sur D2, filtrez les rebonds, et chronométrez tout avec millis(), jamais avec delay().
Vérifications
- Pas encore lancéUtilise attachInterrupt, INPUT_PULLUP et millis(), et jamais delay()
- Pas encore lancéLa LED reste d'abord éteinte
- Pas encore lancéLa LED s'allume en moins de 3 s
- Pas encore lancéUn appui éteint aussitôt la LED et lance une nouvelle manche
- Pas encore lancéAffiche le temps de réaction, par exemple Reaction: 312 ms
- Pas encore lancéUn appui avant la LED affiche Too soon!
Indices
- attachInterrupt(digitalPinToInterrupt(2), onFall, FALLING) exécute onFall dès que D2 descend. Gardez la routine d'interruption courte : notez millis() dans une variable volatile et levez un drapeau.
- Les contacts rebondissent pendant quelques millisecondes à l'appui, puis de nouveau au relâchement. Ne comptez un front que si la broche lit encore LOW 20 ms plus tard.
- Pas de delay() : enregistrez le moment où la LED doit s'allumer, millis() + random(1000, 3001), et comparez dans loop() avec (long)(millis() - goAt) >= 0, qui résiste au débordement de millis().
- Copiez ce qu'écrit l'interruption avec les interruptions coupées (noInterrupts() … interrupts()) : un unsigned long fait 4 octets, et l'AVR le lit un octet à la fois.