Juego de reacción: temporizador
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 6 de 24.
Ahora el juego te mide. El tiempo de reacción es el tiempo que transcurre desde que se enciende el LED hasta que pulsas, así que el sketch necesita recordar un instante: cuándo encendió el LED.
digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;Cuando se pulsa mientras está en el estado LIT, la diferencia es la respuesta:
unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");Esto solo funciona porque el sketch nunca se queda en un delay(): loop() comprueba el botón miles de veces cada milisegundo, así que detecta la pulsación menos de un milisegundo después de que ocurra. La mayoría de las personas necesita entre 200 y 300 ms.
Desafío
IntermedioMide el tiempo del jugador:
- guarda
millis()enlitAtcuando se encienda el LED - cuando se pulse el botón mientras está en
LIT, calculamillis() - litAt - imprímelo como
Reaction: 250 ms
Pulsa Run, juega, lee el monitor Serial y después pulsa 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;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // el momento de la pulsación nunca es el mismo dos veces
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
state = READY;
}
break;
}
}
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