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.
Défi
MoyenFais jouer une séquence à la carte :
- ajoute
int sequence[4];etbool playing = false; - quand tu relâches un bouton et que
playingvautfalse: initialise la graine, remplis le tableau avecrandom(4), définisplayingsurtrueet 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;
}
}
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
1Feu de circulation
Cycle du feu de circulationFeu de circulation avec millis()Bouton de traverséeSignal piéton et buzzer4Simon
Simon : Boutons et notesSimon : Séquence aléatoireSimon : Répéter le motifSimon : Le jeu completEntraînez-vous par vous-même : Playground Arduino