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.
Défi
MoyenGarde une trace :
- une variable
best, à 0 au départ - après chaque manche chronométrée, si
bestvaut 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;
}
}
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