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.
Desafío
IntermedioLleva un registro:
- una variable
best, 0 al inicio - después de cada ronda cronometrada, si
bestes 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;
}
}
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