Paso 6: El bosquejo
A continuación es la versión actual. Mi codificación no es sofisticada que y comenten mucho. Pero parece que funciona.Después de tiempo de reacción de cena tester - creada por Bertus52x11
modificado por Duboisvb
idea es: se probarán 3 veces
cada prueba es una combinación de luces
tiempo de reacción y errores se acumularán una
Hay 3 situaciones posibles de la pantalla
// 1. 3 luces-
// 2. 2 luces-
// 3. 1 luz-
un zumbido se generarán al azar como una forma de distracción
usuario se pedirá para pulsar la reacción cuando correcto se ve la pantalla
#include < LiquidCrystal.h >
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
int LED1 = 6; LED pin 6
int LED2 = 7; LED pin 7
int LED3 = 8; LED pin 6
int ReactButton = 9;
int StartTestButton = 10;
largo CaseTarget; variable caso
largo litepattern; patrón variable
int señal sonora;
flotador TME; Tiempo
flotador de RTME = 0; Tiempo de reacción
Float rtmeTot = 0; tiempo total
char * myStrings1 [] = {"cualquier 1 ON", "Cualquier 2", "All ON 3"};
largo x; contador de bucle en lugar de retraso
char toneyn;
char buttonPushed;
goodOne Char;
int missedIt;
hacer la configuración una vez
void setup()
{
Serial.Begin(9600); abre / puerto Serial, establece la tarifa de datos a 9600 bps
LCD.Begin (16, 2);
pinMode (LED1, salida);
pinMode (LED2, salida);
pinMode (LED3, salida);
pinMode (ReactButton, entrada);
pinMode (StartTestButton, entrada);
}
bucle repetidamente
void loop()
{
restablecer todas las variables
TME = 0; Tiempo
RTME = 0; Tiempo de reacción
rtmeTot = 0; tiempo total
x = 0; contador de bucle en lugar de retraso
toneyn = ' n ';
buttonPushed = ' n ';
goodOne = ' n ';
missedIt = 0;
LCD.Clear(); Limpiar la pantalla.
LCD.Print "(comprobador de la reacción del);
Delay(3000);
LCD.Clear(); Limpiar la pantalla.
LCD.Print ("botón rojo");
lcd.setCursor(0,1); hacia la segunda línea.
LCD.Print ("para iniciar las pruebas.");
mientras que (digitalRead(StartTestButton) == LOW) / / la prueba no se inicia hasta que el botón es empujado (y apretado).
{noTone(13);
Tone(13,1200,30);
Delay(100);
noTone(13);
digitalWrite(LED1,HIGH); Todas las luces se encienden "".
digitalWrite (LED2, alto);
digitalWrite (LED 3, alto);
}
Botón rojo ha sido empujado hasta limpiar la pantalla y luces
LCD.Clear();
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
ir a setcase para obtener info del exhibición de prueba
setCase();
Delay(100);
LCD.Print ("A prueba");
lcd.setCursor(0,1); hacia la segunda línea.
LCD.Print(myStrings1[CaseTarget-1]);
parar aquí por lo que se puede leer la pantalla
retrasar (1000);
comenzar prueba es decir Inicio lámparas estilo cambiante, tono y temporizador y reaccionar a los botones
ir función de todoTest
doTest();
prueba # 2
setCase();
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
Delay(100);
LCD.Clear();
LCD.Print "(prueba B");
lcd.setCursor(0,1); hacia la segunda línea.
LCD.Print(myStrings1[CaseTarget-1]);
retrasar (1000);
doTest();
tercera prueba
setCase();
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
Delay(100);
LCD.Clear();
LCD.Print "(prueba C");
lcd.setCursor(0,1); hacia la segunda línea.
LCD.Print(myStrings1[CaseTarget-1]);
retrasar (1000);
doTest();
ver resultados de 3 pruebas
quedarme aquí hasta que se pulse el botón de prueba de inicio
LCD.Clear();
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
LCD.Print ("Total:");
LCD.Print(rtmeTot,3);
LCD.Print ("segundos");
lcd.setCursor(0,1); hacia la segunda línea.
LCD.Print ("errores:");
LCD.Print(missedIt);
Delay(5000);
}
Mis funciones
// ---------------------------------------------------------
// ------------------------------------------------------------
setCase
Esto es la creación de la situación objetivo es decir
el número de luces
void setCase()
{
randomSeed(analogRead(0)); Ruido aleatorio del pin 0
CaseTarget = random(1,4); Generar un número aleatorio para utilizar como caso de prueba
Si (CaseTarget = 1) entonces 1 luz
Si (CaseTarget = 2) entonces 2 luces
Si (CaseTarget = 3) entonces 3 luces
}
beepYN
al azar a poner un tono para los propósitos de distracción.
void beepYN() {}
randomSeed(analogRead(0)); Ruido aleatorio del pin 0
Un pitido = random(1,8); Generar un número aleatorio para utilizar como caso de prueba
Si (un pitido == 1)
{tone(13,500,100);
}
Si (un pitido == 2)
{tone(13,800,300);
}
Si (un pitido == 3)
{tono (13,1200,500);
}
Si (un pitido == 4)
{tone(13,1600,700);
}
Si (un pitido == 5)
{tone(13,2500,900);
}
}
void waitTime()
{
buttonPushed = ' n ';
para (x = 0; x < 175000; x ++)
{
Si (digitalRead(ReactButton) == HIGH)
{/ fianza en botón reacción presionado
x = 0;
buttonPushed = 'Y';
rotura;
}
Delay(50);
}
}
void assess()
{
llegar hasta aquí porque presionó el botón de reaccionar
o se debe haber presionado
// -----------------------------------------------
así que si presiona y fue todo lo correcto
-tiempo de registro y mostrar resultados
-ir a
presionado pero no debería haber sido
-registro como error
-incrementar el tiempo por 2 segundos como pena
no presionar pero debe tener los medios
patrón correcto lite pasó desapercibida
-registro como error
-incremento por 1 seg
empujado y buena
Si (goodOne == 'Y' & & buttonPushed == 'Y') {}
RTME = millis ()-TME; Tiempo entre lites en y el botón empujado
diivide por 1000 para obtener segundos
RTME = RTME/1000;
tiempo de accumalte para la exhibición de la última
rtmeTot = rtmeTot + RTME;
Mostrar el tiempo de reacción
dspTime();
}
empujado, pero no debe tener
Si (goodOne == ' n ' & & buttonPushed == 'Y')
{
dspError();
Añadir 2 segs para cada miss
rtmeTot = rtmeTot + 2.000;
missedIt = missedIt + 1;
}
no empuja sino que debe tener
Si (goodOne == 'Y' & & buttonPushed == ' n ')
{
dspError();
Añadir 2 segs para cada miss
rtmeTot = rtmeTot + 2.000;
missedIt = missedIt + 1;
}
}
aquí si tiene derecho
void dspTime()
{
Delay(100);
LCD.Clear();
LCD.Print ("tiempo de reacción:");
lcd.setCursor(0,1);
LCD.Print(RTME,3);
LCD.Print ("segundos");
Delay(1000);
}
aquí si presiona el botón en el momento equivocado
void dspError()
{
Delay(100);
LCD.Clear();
LCD.Print("error");
lcd.setCursor(0,1);
LCD.Print ("inténtelo de nuevo");
LCD.Print(RTME);
Delay(1000);
}
void doTest()
{
continúan cambiando tono y cristales hasta que se presiona el botón
Estas son posibilidades
// 1. los 3 en
// 2. 2 - 1 y 2
// 3. 2 - 1 y 3
// 4. 2 - 2 y 3
// 5. 1 on - 1
// 6. 1 a - 2
// 7. 1 a - 3
Nota Existen 3 posibilidades para 2 y 3 luces pero solo para 3
así que para hacer el 3 por un igual cantidad asignará a números extra al azar
a los 3 en
mientras (digitalRead(ReactButton)==LOW)
{
deba al azar cambiar luces y dar tiempo para la reacción
Hay 7 posibilidades por lo que obtendrá un número al azar y luego
sets luces a ese patrón
también se encenderá el tono al azar
randomSeed(analogRead(0)); Ruido aleatorio del pin 0
litepattern = random(8); al azar entre 0 y 8
litepattern = litepattern + 1; obtiene de 1 a 9
antes de encender lámparas estilo, necesita evaluar si es o no un
patrón lite blanco
Compruebe para ver si era correcto patrón lite
Si ((CaseTarget == 3 & & (litepattern == 1 || litepattern == 8 || litepattern == 9)) || (CaseTarget == 2 & & (litepattern == 2
|| litepattern == 3 || litepattern == 4)) || (CaseTarget == 1 & & (litepattern == 5 ||
litepattern == 6 || litepattern == 7)))
{
goodOne = 'Y';
}
otra cosa
{
goodOne = ' n ';
}
Si es un patrón de destino, deberá iniciar el contador
Si (litepattern == 1 || litepattern == 8 || litepattern == 9) {}
digitalWrite (LED 1, elevado);
digitalWrite (LED2, alto);
digitalWrite (LED 3, alto);
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
beepYN();
waitTime();
Si se empuja el botón, deberá evaluar
o si el botón no fue empujado pero debe haber sido
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
Si ningún botón a continuación bucle
}
if(litepattern == 2) {}
digitalWrite (LED 1, elevado);
digitalWrite (LED2, alto);
digitalWrite (LED 3, bajo);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
if(litepattern == 3) {}
digitalWrite (LED 1, elevado);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, alto);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
if(litepattern == 4) {}
digitalWrite (LED 1, bajo);
digitalWrite (LED2, alto);
digitalWrite (LED 3, alto);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
if(litepattern == 5) {}
digitalWrite (LED 1, elevado);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, bajo);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
if(litepattern == 6) {}
digitalWrite (LED 1, bajo);
digitalWrite (LED2, alto);
digitalWrite (LED 3, bajo);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
if(litepattern == 7) {}
digitalWrite (LED 1, bajo);
digitalWrite (LED2, LOW);
digitalWrite (LED 3, alto);
beepYN();
Si (goodOne == 'Y')
{
TME=Millis(); Iniciar el cronometraje
}
waitTime();
Si se empuja el botón, deberá evaluar
Si ((buttonPushed == 'Y') || (buttonPushed == ' n ' & & goodOne == 'Y'))
{
ASSESS();
retorno;
}
}
}
}