#define pinLedRojo 37
#define pinLedVerde 35
#define pinLedAzul 45
#define pinSensor 19
#define A4988_STEP 1
#define A4988_DIR 2
#define PRENDIDO LOW
#define APAGADO HIGH
#define CAJA_CERRADA LOW
#define CAJA_ABIERTA HIGH
#define ANTIHORARIO LOW
#define HORARIO HIGH
uint8_t Sentido = 0; //Por defecto se gira de manera antihoraria
bool EstadoAnterior;
bool EstadoActual;
uint8_t pinesFilas[] = {13,12,11,10};
uint8_t pinesColumnas[] = {15,7,6,5};
uint8_t Teclas[4][4] = {{1, 2, 3, 'A'}, //Cada {} es una fila
{4, 5, 6, 'B'},
{7, 8, 9, 'C'},
{'*',0,'#','D'}};
uint8_t ContadorFilas = 0;
uint8_t ContadorColumnas = 0;
uint8_t CantidadDigitos = 0;
uint8_t Tecla;
int Contrasenha=0;
int Estado = CAJA_ABIERTA;
int Clave = 0;
void setup() {
pinMode(pinLedRojo,OUTPUT);
pinMode(pinLedVerde,OUTPUT);
pinMode(pinLedAzul,OUTPUT);
pinMode(A4988_STEP,OUTPUT);
pinMode(A4988_DIR,OUTPUT);
pinMode(pinSensor,INPUT_PULLUP);
//Inicializar el led, apagarlo
digitalWrite(pinLedRojo,APAGADO);
digitalWrite(pinLedVerde,APAGADO);
digitalWrite(pinLedAzul,APAGADO);
for(ContadorFilas=0; ContadorFilas<=3; ContadorFilas++){
pinMode(pinesFilas[ContadorFilas], OUTPUT);
digitalWrite(pinesFilas[ContadorFilas],HIGH);
}
for(ContadorColumnas=0; ContadorColumnas<=3; ContadorColumnas++){
pinMode(pinesColumnas[ContadorColumnas], INPUT_PULLUP);
}
//Estado == CAJA_ABIERTA;
Serial.begin(115200);
}
int LeerClave(){
ContadorFilas = 0;
ContadorColumnas = 0;
Contrasenha = 0;
CantidadDigitos = 0;
while(1){
//Se lee por filas y por cada fila se lee cada columna
digitalWrite(pinesFilas[ContadorFilas],LOW);
for(ContadorColumnas=0; ContadorColumnas<=3; ContadorColumnas++){
if(digitalRead(pinesColumnas[ContadorColumnas]) == LOW){
delay(5);
//Se está presionando una tecla
Tecla = Teclas[ContadorFilas][ContadorColumnas];
if(Tecla>=0 && Tecla<=9){
//Se está presionando un número
if(CantidadDigitos < 4){
Contrasenha = Contrasenha*10 + Tecla;
CantidadDigitos++;
}
}
if(Tecla == 'C'){
Contrasenha = 0;
CantidadDigitos = 0;
}
if(Tecla == 'D'){
Serial.print("La contraseña ingresada es: ");
Serial.println(Contrasenha);
return Contrasenha;
}
//Serial.print("Fila: ");
//Serial.print(ContadorFilas);
//Serial.print(", Columna: ");
//Serial.println(ContadorColumnas);
while(digitalRead(pinesColumnas[ContadorColumnas]) == LOW);
}
//Se espera hasta que se deje de presionar
}
digitalWrite(pinesFilas[ContadorFilas],HIGH);
//Si ya se completó el bucle 4, entonces se reinicia el contador de filas
if(ContadorFilas<=3){
ContadorFilas++;
}else{
ContadorFilas = 0;
}
}
}
void loop() {
if(Estado == CAJA_ABIERTA){
//Se prende el led verde
digitalWrite(pinLedRojo,APAGADO);
digitalWrite(pinLedVerde,PRENDIDO);
digitalWrite(pinLedAzul,APAGADO);
//Se cierra la caja manualmente para luego bloquearla
Clave = LeerClave();
if(digitalRead(pinSensor)== CAJA_CERRADA){ //Se cerró la caja manualmente
for(int i=1;i<=100;i++){
digitalWrite(A4988_DIR,HORARIO);
digitalWrite(A4988_STEP,HIGH);
delay(5);
digitalWrite(A4988_STEP,LOW);
delay(5);
}
}
Estado = CAJA_CERRADA;
}else if(Estado == CAJA_CERRADA){
digitalWrite(pinLedRojo,PRENDIDO);
digitalWrite(pinLedVerde,APAGADO);
digitalWrite(pinLedAzul,APAGADO);
while(LeerClave() != Clave){
Serial.println("Contraseña incorrecta, vuelva a intentar.");
}
for(int i=1;i<=100;i++){
digitalWrite(A4988_DIR,ANTIHORARIO);
digitalWrite(A4988_STEP,HIGH);
delay(5);
digitalWrite(A4988_STEP,LOW);
delay(5);
}
Estado = CAJA_ABIERTA;
}
}
//NICESUU