Simon: Sequência Aleatória
Parte da seção Projetos do Journey de Arduino da Coddy. Lição 14 de 24.
Agora é a vez da placa. Na primeira vez que um botão é solto, o jogo começa: a placa escolhe quatro cores aleatórias, as mantém em um array e as reproduz.
random(4) fornece 0, 1, 2 ou 3: uma cor. Um loop for preenche o array. Como no jogo de reação, inicialize com micros() ao pressionar, ou todos os jogos reproduzirão as mesmas cores:
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}Um segundo loop for reproduz o padrão: acenda uma cor com sua nota, espere, apague-a e espere novamente. A segunda espera é importante quando uma cor aparece duas vezes: sem ela, vermelho, vermelho parece um único vermelho prolongado. Agora, o jogador apenas observa, então delay() serve.
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}Um bool chamado playing registra que o jogo começou, para que apenas o primeiro pressionamento o inicie.
Desafio
MédioFaça a placa reproduzir um padrão:
- adicione
int sequence[4];ebool playing = false; - quando um botão for solto e
playingforfalse: inicialize a semente, preencha o array comrandom(4), definaplayingcomotruee reproduza o padrão - o padrão: aguarde 500 ms, depois cada cor com sua nota por 400 ms e 200 ms de silêncio após ela
Depois disso, os botões acendem e reproduzem sons como antes. Pressione Run, pressione um botão e, em seguida, Check.
Experimente você mesmo
// Uma entrada por cor: vermelho, verde, azul, amarelo
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 e C agudo
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // última leitura de cada botão
// Acenda a cor i e toque sua nota.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Apague a cor i e pare o som.
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) { // pressionado
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // solto
lightOff(i);
}
lastState[i] = state;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Projetos
Pratique por conta própria: Playground de Arduino