encendido de leds aleatorios y apagado por boton

Hola, soy nuevo en el mundo arduino, pero me gustaría iniciarme en el con un proyecto que le estoy haciendo a mi hija.
Se trata de lo siguiente:
tengo 8 leds que se encienden aleatoriamente y asociados a ellos 8 botones para que apaguen el led que se a encendido. (cada led debe tener asociado un único botón).
Se trata de ver la velocidad de reacción una vez encendido, para apagarlo.

Debería tener una pantalla lcd para ver los resultados y un switch de 4, por ejemplo, para cambiar de modo de juego, esto es, un modo para medir la velocidad de reacción, otro modo para ver aciertos, otro modo para en vez de apagar el led con una sola pulsación tener que pulsar dos veces...en definitiva distintos tipo de juego con la misma configuración.
Tengo parte hecha de la siguiente manera: (Como prueba con solo con 2 leds)

int lrojo = 6;

int lverde = 5;
int botonr = 2;
int botonv = 3;
int i = 0;                           //guardamos en esta variable el led que se va a encender

//Se declara una variable que almacenará el tiempo actual (real) transcurrido
//desde que se enciende la placa.
unsigned long tiempo = 0;

//Se declara una variable que almacenará el último valor de tiempo en el que se
//ejecutó la instrucción (delay).
unsigned long tactualizado = 0;

volatile int estadoled = LOW;       //estado inicial del led
int ver = 0;                                 // la variable ver la utilizo para guardar el número de veces que se encienden los leds
volatile int interoja = 0;
volatile int inteverde = 0;
volatile unsigned long tiempo2 = 0;
int tluz = 1500;

// guardo en las variables lectura el estado del pin donde están conectados los leds.
int lectura = LOW;            
int lectura2 = LOW;

void setup()
{
pinMode(lrojo, OUTPUT);
pinMode(lverde, OUTPUT);
pinMode(botonr, INPUT);
pinMode(botonv, INPUT);

randomSeed(analogRead(0));  //para generar una nueva semilla para la funcion random
i = random(5,7);                     //la variable i la utilizo para guardar el valor que me da random
 
//Creamos la interrupcion
attachInterrupt(0, rojo, HIGH);
attachInterrupt(1, verde, HIGH);
}

void loop()
{

tiempo = millis();                      //Guardo el tiempo real que esta en funcionamiento la placa
 
 if (estadoled == HIGH)            // Miramos si el led esta encendid
 {
  
  if (tiempo - tactualizado > tluz)
  {
    tactualizado = tiempo;
    estadoled = LOW;
  }
 }
 else
 {
   delay(1000);
   tactualizado = tiempo;
   i = random(5,7);
   estadoled = HIGH;
   ver++; 
 }
  
 digitalWrite(i,estadoled);   

// leo los estados de los leds
 lectura = digitalRead(5);
 lectura2 = digitalRead(6);
}

//Codigo de la interrupcion
void rojo()
{
 if (lectura2 == 1) // le asigno al led rojo uno de los botones y solo ese
 {
  if (millis() > tiempo2 + 250)
  {
  digitalWrite(lrojo, LOW);
  interoja++;
  estadoled = 0;
    tiempo = millis();
  }
 }
}
void verde()
{
 if (lectura == 1)
 {
  if (millis() > tiempo2 + 250)
  {
  digitalWrite(lverde, LOW);
  inteverde++;
  estadoled = 0;
    tiempo2 =  millis();
  }
 }
}

lo tengo hecho con interrupciones cada vez que se pulsa un botón.
Esta probado con un simulador.
Bueno ahora las consultas.

Alguna opinión sobre si se pudiera implementar de alguna otra manera más eficiente, teniendo en cuenta que el lcd no esta en el código y el switch tampoco.
Que placa arduino comprarme para el proyecto, porque no se si se prodrían agrupar todas los botones en una solo interrupción y dentro de esta discriminar que botón se ha pulsado o sino tendría que tener una placa que permitiese 8 interrupciones, mas los pines necesarios para conectar el lcd y el swith.

No se si me dejo algo, seguro que me van saliendo más dudas.
Bueno como veréis ando un poco perdido en todos estos temas, pero todas las opiniones seguro que me valen para seguir aprendiendo.

Gracias de antemano.

Primero te pediré que edites el modo en que has posteado el código porque no es el correcto. Debes usar este ícono </> y no el de citas (quote).
Para ello vas a More (abajo a la derecha), luego Modify y podrás hacerlo.

Ahora respondo tu consulta;
Antes un comentario. Hacer lo que has hecho y pretender medir reacciones cuando usas delay ya implica un error.
No se puede usar delay cuando se quiere medir una reacción.
Electrónicamente hay un modo de poner 8 interruptores, disparar una interrupción y saber cual se presionó.
Te lo muestro con 4 porque es el esquema hecho que encontré.
Podes hacer que sean resistencia pull up como te voy a mostrar o pull down.

En este esquema tenes las resistencias Pull UP y /ANY (ANY negado o sea cualquiera) va a la interrupción.
Cada INT es un pin del arduino.
En este caso siempre tienes nivel ALTO en los pines. Y cuando presionas tienes un nivel BAJO en el PIN.
Como el pin de la interrupción tambien es PULL UP cuando un pulsador pasa a LOW el diodo conduce y la interrupción se dispara.
Esto hace que en tu interrupción disparada por FALLING tu lo primero que haras será detectar que pin se a puesto en LOW y esa será tu respuesta.
Eso lleva pocos useg asi que ni lo consideras un error.

El esquema para TU CASO es poner las R como ahora las tienes, entre GND y el puslador.
Sacar las R que van a 5V
Invertir los diodos y poner tambien un R a GND en la interrupción, y cuando se presiones, tu Interrupción se disparará por RISING o sea 0 a 1 y harás lo mismo pero ahora buscarás pin en HIGH.

Tu código luce bien pero no puedes usar delay y luego cuentas velocidad de reacción.

Lo primero es darte las gracias, a parte de por contestar, por enseñarme tambièn a redactar el mensage.
Probarè a realizar lo que me indicas, tiene muy buena pinta, pero tengo la duda de si primero podrè encender el led aleatoriamente para posteriormente apagarlo con el pulsador.
Con respecto al delay solo lo uso para que pase un tiempo dado entre el apagado de un led, con el boton, y el encendido aleatorio de siguiente, una vez se ha disparado la interrupcion, que es donde mido el tiempo de reacciòn. Seria algo asi ENCIENDO LED --> PULSO EL BOTON --> DELAY --> ENCIENDO LED, entre enciendo led y pulso el boton es donde mido el tiempo de reacciòn, que alomejor no es correcto como lo hago pero sino no se como hacer para que pase un tiempo entre encendidos de los leds.
Luego si alguien me puede indicar que arduino comprar para el proyecto se lo agradeceria, teniendo en cuenta que me gustaria poner un lcd y usar un switch.

Bueno, gracias a todos los que siguen ayudando.

Intentar apagar un led que se enciende aleatoriamente?
Eso me huele a juego de reflejos.

:smiley: :wink:

Eso es lo que intento, mas o menos, hacer un juego de reflejos y velocidad, pero no tengo muy claro como, en eso estamos.
Toda ayuda que me pueda prestar cualquier persona será bien recibida.

Bueno, estuve viendo el código y por ahora encuentro un error

  1. mal asignación de tactualizado = tiempo;
// al comienzo del loop pones	tiempo = millis();                      //Guardo el tiempo real que esta en funcionamiento la placa
	if (estadoled == HIGH) {	           // Miramos si el led esta encendid
	 	if (tiempo - tactualizado > tluz) {
	  	    tactualizado = tiempo;
	  		estadoled = LOW;
	  	}
	}
	else {
		   delay(1000);
		   tactualizado = tiempo;
		   i = random(5,7);
		   estadoled = HIGH;
		   ver++; 
	 }

Para mi aca va

delay(1000);
tactualizado = millis();

porque de lo contrario usando tiempo estas 1000 mseg atrasado!!

  1. Calculas i = random(5,7) y no lo usas en ningún lado?

  2. Hay que quitar ese delay(1000) porque no se como responde la interrupción en medio de ese loop.

Hola a todos, he estado ausente unos días y no he podido ver los mensajes.
En cuanto a lo de la asignación de tiempoactualizado es mas correcto la opción que me das.
En lo de la i=random(5,7), si que lo uso en: digitalWrite(i,estadoled);
En el tema del dalay(1000), no se como poner sino un tiempo entre que se apaga un led y se enciende el siguiente.

Gracias por molestarte en mirar el código y dar tu opinión.

Tienes razón.
La reacción la mides sobre que led se enciende. Yo me imaginé otra cosa.