Menu
CoddyTech

Jeu de réflexes : attente aléatoire

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

Le prochain projet est un jeu de réflexes. Tu appuies sur le bouton, la carte attend, puis allume la LED, et tu appuies de nouveau aussi vite que possible.

L’attente est aléatoire, sinon tu apprendrais le rythme. random(1000, 3001) donne un nombre entier de 1000 à 3000.

random() est un calcul : après chaque mise sous tension, il donne les mêmes nombres dans le même ordre. randomSeed() choisit où cette séquence commence. Initialise-la avec le moment de l’appui, en microsecondes, qui est différent à chaque partie :

randomSeed(micros());
waitTime = random(1000, 3001);

Le jeu est une machine à états avec trois états : READY (en attente d’un appui), WAITING (l’attente aléatoire) et LIT (la LED est allumée). L’attente utilise millis(), afin que les étapes suivantes puissent surveiller le bouton pendant ce temps.

Le code de départ calcule déjà pressed : le bouton lit LOW maintenant et lisait HIGH la dernière fois. Ce bouton ne rebondit pas, donc aucun anti-rebond n’est nécessaire.

challenge icon

Défi

Moyen

Le bouton est connecté à la broche 2 et la LED à la broche 12. Complète les trois états :

  • READY : un appui initialise le générateur avec micros(), choisit un délai de 1000 à 3000 ms, enregistre l’heure de début et passe à WAITING
  • WAITING : lorsque le délai est écoulé, allume la LED et passe à LIT
  • LIT : un appui éteint la LED et passe à READY

Appuie sur Run, joue quelques manches, puis clique 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 valeur lue du bouton la fois précédente
unsigned long waitStart = 0; // quand 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;

  // READY : un appui lance l'attente
  // WAITING : quand l'attente est terminée, allumer la LED
  // LIT : un appui éteint la LED et le jeu est de nouveau prêt

}
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