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.
Desafío
IntermedioEl botón está en el pin 2 y el LED en el pin 12. Completa los tres estados:
READY: al presionarlo, inicializa la semilla conmicros(), elige un tiempo de espera de 1000 a 3000 ms, guarda la hora de inicio y pasa aWAITINGWAITING: cuando termina el tiempo de espera, enciende el LED y pasa aLITLIT: al presionarlo, apaga el LED y pasa aREADY
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
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
2Juego de reacción
Juego de reacción: espera aleatoriaJuego de reacción: temporizadorJuego de reacción: salida en falsoJuego de reacción: mejor tiempoPractica por tu cuenta: Playground de Arduino