Menu
CoddyTech

Jeu de réflexes : meilleur temps

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 8 sur 24.

Le sketch conserve le meilleur temps (le plus bas) dans une variable et l’affiche après chaque manche.

Au départ, il n’y a pas encore de meilleur temps. Utilisez une valeur qu’aucune manche réelle ne peut avoir, 0, pour signifier « aucun pour l’instant ». Après chaque manche : s’il n’y a pas encore de meilleur temps, ou si cette manche l’a battu, cette manche devient le nouveau meilleur temps.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Placez ceci dans l’état LIT, où une manche se termine avec un temps réel. Un faux départ n’atteint jamais ce code et ne devient donc jamais le record.

Le meilleur temps est stocké dans la mémoire de la carte (RAM), qui est effacée lorsque l’alimentation est coupée : le record est conservé jusqu’à ce que vous appuyiez de nouveau sur Run.

challenge icon

Défi

Moyen

Garde une trace :

  • une variable best, à 0 au départ
  • après chaque manche chronométrée, si best vaut 0 ou si la manche a été plus rapide, enregistre cette manche comme nouveau record
  • affiche-le après chaque manche sous la forme Best: 250 ms
  • les faux départs ne changent rien

Appuie sur Run, essaie de battre ton record, puis appuie sur Check.

Essayez vous-même

const int ledPin = 12;
const int buttonPin = 2;

// Les trois états d'une manche
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // la dernière valeur lue sur le bouton
unsigned long waitStart = 0; // le moment où l'attente a commencé
unsigned long waitTime = 0;  // la durée de cette attente
unsigned long litAt = 0;     // le moment où la LED s'est allumée

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 où le bouton est enfoncé n'est jamais deux fois le même
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Bouton enfoncé avant que la lumière ne s'allume : un faux départ.
        Serial.println("Too soon!");
        state = READY;
      } else if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        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