Buenas gente. Antes que nada, quiero decir que es mi primer mensaje en el foro y que me encanta vuestra comunidad, así que cuando hoy me he encontrado con este problema en mi proyecto, he decidido pediros una ayudita jajaja.
La cosa es así: Estoy intentando hacer un cerrojo de puerta que funcione con un destornillador sónico de Doctor Who a base de ponerle un LED infrarrojo. Esa parte, sin embargo, está sin problema. Las dudas me aparecen cuando, y como mecanismo de seguridad, quiero tener cuatro botones que sirvan para introducir una contraseña en caso que no tenga en ese momento el LED infrarrojo.
La cosa es, en principio, sencilla. Cuatro botones puestos en hilera que se tienen que pulsar en orden y coincidir con el orden ya guardado en una array del código. Pero, por alguna razón, no consigo que funcione y acaba detectando casi siempre que he pulsado el botón 1, además de que el LED rojo se acaba volviendo un poco loco
Éste es mi código:
int correct[5] = {1,2,3,4};
int usuario[5];//Contraseña introducida por el usuario
int i=0;//Centinela de los botones
int check=0;//Neutro = 0, Correcto = 1, Erróneo = 2;
int pos=0;//Posición en grados del servo
#define uno 8
#define dos 9
#define tres 10
#define cuatro 11
#define verde 12
#define rojo 13
void setup(){
pinMode(uno, INPUT);
pinMode(dos, INPUT);
pinMode(tres, INPUT);
pinMode(cuatro, INPUT);
pinMode(verde, OUTPUT);
pinMode(rojo, OUTPUT);
Serial.begin(9600);
}
void loop(){
//Entradas de Botones
//----------------------
//En cuanto se pulsa uno de ellos, se añade el valor correspondiente (1, 2, 3 o 4) a
//la array "usuario". Cuando se han pulsado 4 botones, la variable "i" aumenta en uno,
//así se pasa al siguiente paso, la comprobación.
if(digitalRead(uno)==HIGH){
usuario[i]=1;
i++;
Serial.print("Boton 1 guardado en posicion ");
Serial.println(i);
delay(200);
} else if(digitalRead(dos)==HIGH){
usuario[i]=2;
i++;
Serial.print("Boton 2 guardado en posicion ");
Serial.println(i);
delay(200);
} else if(digitalRead(tres)==HIGH){
usuario[i]=3;
i++;
Serial.print("Boton 3 guardado en posicion ");
Serial.println(i);
delay(200);
} else if(digitalRead(cuatro)==HIGH){
usuario[i]=4;
i++;
Serial.print("Boton 4 guardado en posicion ");
Serial.println(i);
delay(200);
}
//Comprobación
//---------------
//Si se han pulsado 4 botones y, por tanto, "i" es igual a 4, se inicia la comprobación.
//Primero se resetea "i" poniéndola a cero, pues tanto si se introduce una contraseña
//correcta como si no, se empezaría de nuevo igual.
//Después comprueba uno a uno, con un bucle "for", si las respuestas son correctas.
//Si alguna falla, la variable "check" toma el valor de 2, es decir, erróneo,
//impidiendo que en la comprobación cuando se pulsa el último botón pueda dar positivo.
//En cambio, si todos han sido correctos, check se transforma en afirmativo (1).
if(i==4){
i=0;
for(int j=0;j<4&&check!=2;++j){
if(usuario[j]!=correct[j]) check=2;
if(j==3&&check!=2) check=1;
}
}
//Iluminación de LED de Comprobación
//--------------------------------------
//Si el valor de "check" es uno y, por tanto, la comprobación ha resultado ser
//correcta, se iluminará el led verde durante un segundo y cambia la posición del servo a
//abierto. Si no, se enciende el rojo y se cierra.
switch(check){
case 1: digitalWrite(verde, HIGH);
delay(1000);
digitalWrite(verde, LOW);
pos=0;
break;
case 2: digitalWrite(rojo, HIGH);
delay(1000);
digitalWrite(rojo, LOW);
pos=180;
}
}
También he adjuntado una imagen de cómo está dispuesto el hardware, aunque he de admitir que no lo he hecho de forma física, y simplemente lo he probado en un simulador web. Por si alguien lo quiere ver en “acción”, el link es éste:
Algo me dice a mí que el problema está en el nesting de if’s.
Si alguien me puede echar un cable, estaría muy agradecido. Gracias de antemano.