Menu
CoddyTech

Juego de reacción: mejor tiempo

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

El sketch conserva el mejor tiempo (el más bajo) en una variable y lo muestra después de cada ronda.

Al principio todavía no hay un mejor tiempo. Usa un valor que ninguna ronda real pueda tener, 0, para indicar «ninguno todavía». Después de cada ronda: si aún no hay un mejor tiempo, o si esta ronda lo superó, esta ronda es el nuevo mejor tiempo.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Coloca esto en el estado LIT, donde una ronda termina con un tiempo real. Una salida en falso nunca llega a ese código, así que nunca se convierte en el récord.

El mejor tiempo se guarda en la memoria de la placa (RAM), que se borra cuando se apaga: el récord dura hasta que vuelvas a pulsar Run.

challenge icon

Desafío

Intermedio

Lleva un registro:

  • una variable best, 0 al inicio
  • después de cada ronda cronometrada, si best es 0 o la ronda fue más rápida, guarda la ronda como el nuevo mejor tiempo
  • imprímelo después de cada ronda como Best: 250 ms
  • las salidas en falso no cambian nada

Pulsa Run, intenta superar tu mejor tiempo 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
unsigned long litAt = 0;     // cuándo se encendió el LED

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 exactamente el mismo
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Pulsado antes de que se encendiera la luz: salida en falso.
        Serial.println("Too soon!");
        state = READY;
      } else if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        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