Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Mide el tiempo del jugador:

  • guarda millis() en litAt cuando se encienda el LED
  • cuando se pulse el botón mientras está en LIT, calcula millis() - 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;
  }
}
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