Jeu de réflexes : chronomètre
Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 6 sur 24.
Maintenant, le jeu vous mesure. Le temps de réaction est le temps écoulé entre l’allumage de la LED et votre pression sur le bouton. Le sketch doit donc mémoriser un instant : celui où la LED s’est allumée.
digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;Lorsque la pression survient à l’état LIT, la différence donne la réponse :
unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");Cela ne fonctionne que parce que le sketch ne reste jamais bloqué dans un delay() : loop() vérifie le bouton des milliers de fois par milliseconde, si bien que la pression est détectée moins d’une milliseconde après avoir eu lieu. La plupart des gens ont besoin de 200 à 300 ms.
Défi
MoyenChronomètre le joueur :
- enregistre
millis()danslitAtlorsque la LED s’allume - lorsque l’appui survient dans
LIT, calculemillis() - litAt - affiche le résultat sous la forme
Reaction: 250 ms
Appuie sur Exécuter, joue, lis le moniteur série, puis appuie sur Vérifier.
Essayez vous-même
const int ledPin = 12;
const int buttonPin = 2;
// Les trois états d'un cycle
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // la valeur lue sur le bouton la dernière fois
unsigned long waitStart = 0; // le moment où l'attente a commencé
unsigned long waitTime = 0; // la durée de cette attente
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // vient d'être enfoncé
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // le moment de l'appui n'est jamais deux fois le même
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
state = READY;
}
break;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Projets
2Jeu de réflexes
Jeu de réflexes : attente aléatoireJeu de réflexes : chronomètreJeu de réflexes : faux départJeu de réflexes : meilleur tempsEntraînez-vous par vous-même : Playground Arduino