Hola, estoy intentando hacer una especie de Simón Dice en Arduino pero me ha surgido un problema; cuando empieza la secuencia se me enciende el correspondiente led del valor aleatorio que toca, pero a la hora de que el usuario encienda ese mismo led suceden 2 cosas:
- O el led se enciende pero lo detecta como error y comienza la secuencia error.
- El led directamente no se enciende.
He comprobado las conexiones mirando si cada pulsador enciende al led correspondiente y eso funciona perfecto así que el error debe ser de código, pero después de más de una semana intentandolo no encuentro el fallo; alguien podría aportarme alguna idea. Adjunto el mapa del cableado y todo el código que tengo hasta el momento.
/* implementar un juego “Simón” con cuatro LEDS y cuatro pulsadores;
el programa iluminará los LED en una secuencia aleatoria, y el
jugador deberá reproducirla; el juego acaba con los cuatro LED destelleando
durante 5 segundos (a intervalo de un segundo), cuando el jugador se
equivoca. Presentaremos el nº de aciertos que ha tenido*/
const int redS = 13;
const int redE = 2;
const int blueS = 12;
const int blueE = 3;
const int yellowS = 11;
const int yellowE = 4;
const int greenS = 10;
const int greenE = 5;
int arrayE[300];
int arrayS[300];
int secuencia=1;
void generaAleatorios(){//generamos al principio toda la secuencia que puede llegar a realizar
for (int i = 0; i< 300; i++){
int n = random(4);
arrayS[i]=n;
}
}
void simonDice() {//muestra la secuencia nivel a nivel
for (int i = 0; i<secuencia; i++){
//le asignamos a cada color un número de los aleatorios que contiene el array de salida
if (arrayS[i] == 1) {
digitalWrite (redS, HIGH);
delay(1000);
digitalWrite (redS, LOW);
delay(1000);
}
if (arrayS[i] == 2) {
digitalWrite (blueS, HIGH);
delay(1000);
digitalWrite (blueS, LOW);
delay(1000);
}
if (arrayS[i] == 3) {
digitalWrite (yellowS, HIGH);
delay(1000);
digitalWrite (yellowS, LOW);
delay(1000);
}
if (arrayS[i] == 4) {
digitalWrite (greenS, HIGH);
delay(1000);
digitalWrite (greenS, LOW);
delay(1000);
}
}
}
void playerDice(){
int flag = 0;//condicionante que nos permite estar dentro del while
int estadoR = digitalRead(redE);
int estadoB = digitalRead(blueE);
int estadoY = digitalRead(yellowE);
int estadoG = digitalRead(greenE);
for(int i = 0; i < 300; i++){
flag = 0;//siempre que salimos se vuelve a poner a cero
while(flag == 0){//mientras el condicionante valga 0 estaremos dentro del while
if(estadoR == HIGH){
digitalWrite(redS, HIGH);
arrayE[i] = 1;
flag = 1;
delay(1000);
if(arrayE[i] != arrayS[i]){// si no se cumple la igual entra en la función error
error();
}
}
else{
digitalWrite(redS, LOW);
}
if(estadoB == HIGH){
digitalWrite(blueS, HIGH);
arrayE[i] = 2;
flag = 1;
delay(1000);
if(arrayE[i] != arrayS[i]){
error();
}
}
else{
digitalWrite(blueS, LOW);
}
if(estadoY == HIGH){
digitalWrite(yellowS, HIGH);
arrayE[i] = 3;
flag = 1;
delay(1000);
if(arrayE[i] != arrayS[i]){
error();
}
}
else{
digitalWrite(yellowS, LOW);
}
if(estadoG == HIGH){
digitalWrite(greenS, HIGH);
arrayE[i] = 4;
flag = 1;
delay(1000);
if(arrayE[i] != arrayS[i]){
error();
}
}
else{
digitalWrite(greenS, LOW);
}
}
}
correcto();//cuando se cumplen todos los ciclos
}
void correcto(){//función para aumentar un ciclo
if (secuencia < 300){
secuencia++;
}
delay(500);
}
void error(){
//secuencia de salida
for (int j = 0; j < 5; j++){
digitalWrite(redS, HIGH);
digitalWrite(blueS, HIGH);
digitalWrite(yellowS, HIGH);
digitalWrite(greenS, HIGH);
delay(500);
digitalWrite(redS, LOW);
digitalWrite(blueS, LOW);
digitalWrite(yellowS, LOW);
digitalWrite(greenS, LOW);
delay(500);
}
secuencia = secuencia - 1;
Serial.print("Has llegado al nivel: ");
Serial.println(secuencia);
exit(0);
}
void setup() {
Serial.begin(9600);
//definimos las entradas y salidas
pinMode(redS, OUTPUT);
pinMode(redE, INPUT);
pinMode(blueS, OUTPUT);
pinMode(blueE, INPUT);
pinMode(yellowS, OUTPUT);
pinMode(yellowE, INPUT);
pinMode(greenS, OUTPUT);
pinMode(greenE, INPUT);
}
void loop(){
if (secuencia == 1){// solo la primera vez
generaAleatorios();
simonDice();
delay(200);
playerDice();
}
if (secuencia !=1){// el resto de ciclos
simonDice();
delay(200);
playerDice();
}
}