Medidor de reflejos
Arduino C++Construye un juego de reflejos en la placa que acabas de montar. El LED del pin 13 se enciende tras una espera al azar de 1 a 3 s; el jugador pulsa lo más rápido que pueda el botón de D2 (conectado a GND), y el tiempo desde el LED hasta la pulsación se imprime como, por ejemplo, Reaction: 312 ms. Una pulsación antes del LED imprime Too soon!. Después de cada pulsación el LED se apaga y empieza una ronda nueva. Captura la pulsación con una interrupción en D2, quítale los rebotes y mide todo con millis(), nunca con delay().
Comprobaciones
- Aún sin ejecutarUsa attachInterrupt, INPUT_PULLUP y millis(), y nunca delay()
- Aún sin ejecutarAl principio el LED sigue apagado
- Aún sin ejecutarEl LED se enciende en menos de 3 s
- Aún sin ejecutarUna pulsación apaga el LED al instante y empieza una ronda nueva
- Aún sin ejecutarImprime el tiempo de reacción, por ejemplo Reaction: 312 ms
- Aún sin ejecutarUna pulsación antes del LED imprime Too soon!
Pistas
- attachInterrupt(digitalPinToInterrupt(2), onFall, FALLING) ejecuta onFall en el instante en que D2 baja. Haz corta la rutina de interrupción: apunta millis() en una variable volatile y activa una bandera.
- Los contactos rebotan durante unos milisegundos al pulsar y otra vez al soltar. Cuenta un flanco solo si el pin sigue leyendo LOW 20 ms después.
- Sin delay(): guarda cuándo debe encenderse el LED, millis() + random(1000, 3001), y compara en loop() con (long)(millis() - goAt) >= 0, que sobrevive al desbordamiento de millis().
- Copia lo que escribe la interrupción con las interrupciones desactivadas (noInterrupts() … interrupts()): un unsigned long ocupa 4 bytes, y el AVR lo lee byte a byte.