Menu
CoddyTech

Simón: Secuencia aleatoria

Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 14 de 24.

Ahora le toca el turno al tablero. La primera vez que se suelta un botón, comienza el juego: el tablero elige cuatro colores al azar, los guarda en un array y los reproduce.

random(4) da 0, 1, 2 o 3: un color. Un bucle for llena el array. Como en el juego de reacción, inicializa la semilla con micros() al pulsar o todos los juegos reproducirán los mismos colores:

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

Un segundo bucle for reproduce el patrón: enciende un color con su nota, espera, lo apaga y vuelve a esperar. La segunda espera importa cuando un color aparece dos veces: sin ella, rojo, rojo parece un único rojo largo. Ahora el jugador solo observa, así que delay() está bien.

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

Un bool llamado playing recuerda que el juego ha comenzado, así que solo la primera pulsación lo inicia.

challenge icon

Desafío

Intermedio

Haz que la placa reproduzca un patrón:

  • añade int sequence[4]; y bool playing = false;
  • cuando se suelte un botón y playing sea false: inicializa la semilla, llena el array con random(4), establece playing en true y reproduce el patrón
  • el patrón: espera 500 ms y después cada color con su nota durante 400 ms, seguido de 200 ms de silencio

Después, los botones se iluminan y suenan como antes. Pulsa Run, pulsa un botón y, después, Check.

Pruébalo tú mismo

// Una entrada por color: rojo, verde, azul, amarillo
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 y C agudo
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // la última lectura de cada botón

// Enciende el color i y reproduce su nota.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Apaga el color i y detén el sonido.
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) {  // pulsado
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // soltado
      lightOff(i);
    }
    lastState[i] = state;
  }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Arduino