Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Faça a placa reproduzir um padrão:

  • adicione int sequence[4]; e bool playing = false;
  • quando um botão for solto e playing for false: inicialize a semente, preencha o array com random(4), defina playing como true e 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;
  }
}
quiz iconTeste seus conhecimentos

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