Menu
CoddyTech

Simon : Séquence aléatoire

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

Maintenant, c’est au tour de la carte. La première fois qu’on relâche un bouton, la partie commence : la carte choisit quatre couleurs aléatoires, les conserve dans un tableau et les joue.

random(4) donne 0, 1, 2 ou 3 : une couleur. Une boucle for remplit le tableau. Comme dans le jeu de réaction, initialisez la graine avec micros() au moment de l’appui, sinon chaque partie jouera les mêmes couleurs :

randomSeed(micros());
for (int i = 0; i < 4; i++) {
  sequence[i] = random(4);
}

Une deuxième boucle for joue la séquence : allumer une couleur avec sa note, attendre, l’éteindre, puis attendre à nouveau. La deuxième attente est importante lorsqu’une couleur apparaît deux fois : sans elle, rouge, rouge ressemble à un seul long rouge. Le joueur ne fait que regarder pour le moment, donc delay() convient.

for (int i = 0; i < 4; i++) {
  lightOn(sequence[i]);
  delay(400);
  lightOff(sequence[i]);
  delay(200);
}

Un bool appelé playing mémorise que la partie a commencé, de sorte que seul le premier appui la lance.

challenge icon

Défi

Moyen

Fais jouer une séquence à la carte :

  • ajoute int sequence[4]; et bool playing = false;
  • quand tu relâches un bouton et que playing vaut false : initialise la graine, remplis le tableau avec random(4), définis playing sur true et joue la séquence
  • la séquence : attends 500 ms, puis joue chaque couleur avec sa note pendant 400 ms, suivis de 200 ms de silence

Ensuite, les boutons s’allument et jouent comme avant. Appuie sur Run, appuie sur un bouton, puis sur Check.

Essayez vous-même

// Une entrée par couleur : rouge, vert, bleu, jaune
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C, E, G et C aigu
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // la dernière lecture de chaque bouton

// Allumer la couleur i et jouer sa note.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Éteindre la couleur i et arrêter le son.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // enfoncé
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // relâché
      lightOff(i);
    }
    lastState[i] = state;
  }
}
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