Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Chronomètre le joueur :

  • enregistre millis() dans litAt lorsque la LED s’allume
  • lorsque l’appui survient dans LIT, calcule millis() - 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;
  }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Arduino