Menu
CoddyTech

Juego de reacción: espera aleatoria

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

El siguiente proyecto es un juego de reacción. Pulsas el botón, la placa espera, después enciende el LED y vuelves a pulsarlo lo más rápido que puedas.

La espera es aleatoria, o aprenderías el ritmo. random(1000, 3001) da un número entero del 1000 al 3000.

random() es un cálculo: después de cada encendido, da los mismos números en el mismo orden. randomSeed() elige dónde empieza esa secuencia. Inicializa la semilla con el momento de la pulsación, en microsegundos, que es diferente en cada partida:

randomSeed(micros());
waitTime = random(1000, 3001);

El juego es una máquina de estados con tres estados: READY (esperando una pulsación), WAITING (la espera aleatoria) y LIT (el LED está encendido). La espera usa millis(), para que los pasos posteriores puedan comprobar el botón durante ese tiempo.

El código inicial ya calcula pressed: el botón se lee como LOW ahora y se leyó como HIGH la última vez. Este botón no rebota, así que no necesita antirrebote.

challenge icon

Desafío

Intermedio

El botón está en el pin 2 y el LED en el pin 12. Completa los tres estados:

  • READY: al presionarlo, inicializa la semilla con micros(), elige un tiempo de espera de 1000 a 3000 ms, guarda la hora de inicio y pasa a WAITING
  • WAITING: cuando termina el tiempo de espera, enciende el LED y pasa a LIT
  • LIT: al presionarlo, apaga el LED y pasa a READY

Presiona Run, juega unas cuantas rondas y después haz clic en Check.

Pruébalo tú mismo

const int ledPin = 12;
const int buttonPin = 2;

// Los tres estados de una ronda
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // la lectura anterior del botón
unsigned long waitStart = 0; // cuándo comenzó la espera
unsigned long waitTime = 0;  // cuánto dura esta espera

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Press the button to start");
}

void loop() {
  int button = digitalRead(buttonPin);
  bool pressed = (button == LOW && lastButton == HIGH);  // pulsado justo ahora
  lastButton = button;

  // READY: una pulsación inicia la espera
  // WAITING: cuando termina la espera, enciende el LED
  // LIT: una pulsación apaga el LED y el juego vuelve a estar listo

}
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