Sunteți pe pagina 1din 7

#include <LiquidCrystal.

h>

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

int adc_key_val[5] = {50, 200, 400, 600, 800 };

int NUM_KEYS = 5;

int adc_key_in; /// Variables que se utilizan para el manejor del


teclado de la pantalla(boton presionado)
int key=-1;
int oldkey=-1;

boolean luzEncendida=true; // variable bool para saber cuando la luz esta


apagada o encendida
boolean cursorActivo=false; // variable bool para saber si el cursor esta activo
o no
unsigned long time;

int x=0; /// variable que se utiliza para llevar la posicion x en la matriz de la
pantalla

String contrasena = "123";// variable String para almacenar la contrase�a


permanente
String nuevaContra=""; // variable String en la que se guardar� la nueva
contrasenna temporalmente

int tam = contrasena.length(); // obtener el tamano del de la contrasena

char caracterActual = '0'; // char que se utilizar� para recibir cada caracter
que se ingresa con los botones

int conta=0; // Index para llevar el control cuando compara la contrasena vieja
con la insertada en ese momento
int m =0; // Contador para llevar las comparaciones en Login
int t = 0; // Contador para llevar el total de intentos del Login

int conta2= 0; // Index para llevar el control cuando compara la contrasena vieja
con la insertada en ese momento en la parte de Digitar Vieja contrasenna
int m2 = 0; // Contador para llevar las comparaciones en Digitar Vieja contrasenna
int t2= 0; // Contador para llevar el total de intentos en Digitar Vieja
contrasenna

int conta3 = 0; // El index global que se utiliza para ir insertando la


contrasenna nueva en la variable de contrasenna nueva

/// Estados / Login, Digitar vieja contra y digitar Nueva contra


int estado = 0; // 0 -> Login
// 1 -> Vieja Contrasenna
// 2 -> Nueva Contrasenna

void setup()
{
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Contrasena");
time = millis(); // variable para llevas un timer
}

void loop()
{

Login();

void Login(){

if (millis()-time > 10000) { // Si han pasado mas de 10 segundos apagamos la


luz
pinMode(10, OUTPUT);
digitalWrite(10, LOW);
luzEncendida=false;
}
if (millis()-time > 5000) { // Si han pasado mas de 5 segundos apagamos el
cursor
lcd.noBlink();
cursorActivo=false;
}

adc_key_in = analogRead(0); // Leemos el valor de la pulsacion


key = get_key(adc_key_in); // Obtenemos el boton pulsado

if (key != oldkey) // si se ha apretado una tecla


{
delay(50); // Espera para evitar los rebotes de las pulsaciones
adc_key_in = analogRead(0); // Leemos el valor de la pulsacion
key = get_key(adc_key_in); // Obtenemos el boton pulsado
if (key != oldkey)
{
time = millis(); // TODO: falta la comprobacion de si se ha desbordado
el tiempo
if (!luzEncendida) { // Al pulsar cualquier tecla encendemos la pantalla
pinMode(10, INPUT);
luzEncendida=true;
}
else { // si la pantalla esta encendida seguimos funcionando normalmente
lcd.setCursor(x, 1);
oldkey = key;
if (key >=0){ // Si se ha pulsado cualquier tecla
lcd.blink(); // Mostramos el cursor parpadeando
cursorActivo=true;
}
}

if ((key == 0) && (estado==0)){ // Se ha pulsado la tecla derecha en


login
char c = caracterActual;
if(c==contrasena[conta]){
m++;
}
else{
m--;
}
conta++;
x++;
if (x>15) x=15;
caracterActual='0';
}
else if ((key == 0) && (estado==1)){ // Se ha pulsado la tecla derecha
en digitar vieja contra

char c = caracterActual;
if(c==contrasena[conta2]){
m2++;
}
else{
m2--;
}
conta2++;
x++;
if (x>15) x=15;
caracterActual='0';
}

else if ((key == 0) && (estado==2)){ // Se ha pulsado la tecla derecha


en digitar nueva contrasenna

String c = String(caracterActual);

nuevaContra= nuevaContra+c;

//conta3++;
x++;
if (x>15) x=15;
caracterActual='0';
}

else if ((key == 1) && (estado==0)) { // Se ha pulsado la tecla arriba


en login
caracterActual++;
if (caracterActual > '9') caracterActual='9';
lcd.write(caracterActual);
}

else if ((key == 1) && (estado==1)) { // Se ha pulsado la tecla arriba


en digitar vieja contrasena
caracterActual++;
if (caracterActual > '9') caracterActual='9';
lcd.write(caracterActual);
}

else if ((key == 1) && (estado==2)) { // Se ha pulsado la tecla arriba


en digitar nueva contrasenna
caracterActual++;
if (caracterActual > '9') caracterActual='9';
lcd.write(caracterActual);
}

else if ((key == 2) && (estado==0)) { // Se ha pulsado la tecla abajo


en login
caracterActual--;
if (caracterActual < '0') caracterActual='0';
lcd.write(caracterActual);
}

else if ((key == 2) && (estado==1)) { // Se ha pulsado la tecla abajo


en digitar vieja contrasenna
caracterActual--;
if (caracterActual < '0') caracterActual='0';
lcd.write(caracterActual);
}

else if ((key == 2) && (estado==2)){ // Se ha pulsado la tecla abajo


en digitar nueva contrasenna
caracterActual--;
if (caracterActual < '0') caracterActual='0';
lcd.write(caracterActual);
}

else if((key == 3) && (estado==0)){ // Se ha pulsado la tecla


izquierda en login
lcd.clear();
lcd.setCursor(0,0);
lcd.clear();
lcd.print("Vieja Contra");

estado=1; // se cambia el estado a 1 indicando que ahora esta


digitando la vieja contrasenna

else if ((key == 4) && (estado==0)){ // Se ha pulsado la tecla de


seleccion en login

lcd.clear();

if(m==tam){
lcd.setCursor(4,1);
lcd.print("CORRECTO");
digitalWrite(12, HIGH); // enciende el led verde, indicando que
la puerta se ha abierto
delay(2000); // se espera por 2 segundos
digitalWrite(12, LOW); // apaga la luz
limpiar(); // limpia todos los contadores que se
utilizan para llevar la posicion actual,entre otros.
setup();
}
else{
lcd.setCursor(4,1);
lcd.print("INCORRECTO");
digitalWrite(13, HIGH); // enciente el led rojo,indicando que se
ha ingresado una contrasenna erronea
delay(2000); // se espera por 2 segundos
if(t==2){
for(int i=0; i<10; i++){ // for que se utiliza para encender
el led rojo intervitentemente
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
}
else{

lcd.clear();
t++;
conta=0;
x=0;
m=0;
caracterActual = '0';
setup();
}
}
}

else if((key==4) && (estado==1)){


// Se ha pulsado la tecla de seleccion en
digitar vieja contrassena
lcd.clear();

if(m2==tam){
lcd.setCursor(0,0);
x=0;
lcd.clear();
lcd.print("Nueva Contra");
estado=2; /// se cambia el estado a
2,indicando que ahora esta digitando nueva contrasenna

}
else{
lcd.setCursor(3,1);
lcd.print("Incorrecta");
digitalWrite(13, HIGH); // enciente el led rojo
delay(2000); // se espera por 2 segundos
if(t2==2){
for(int i=0; i<10; i++){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
}
else{

lcd.clear();
t2++;
conta2=0;
x=0;
m=0;
caracterActual = '0';
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Vieja Contra");
}
}

else if ((key == 4) && (estado==2)){ // Se ha pulsado la tecla de


seleccion en digitar nueva contrasena

lcd.clear();
lcd.print("Cambio Exitoso");
contrasena =nuevaContra;

delay(2000);
lcd.clear();
limpiar();
setup();

}
}
delay(100);
}

// Convertimos el valor leido en analogico en un numero de boton pulsado


int get_key(unsigned int input)
{
int k;

for (k = 0; k < NUM_KEYS; k++)


{
if (input < adc_key_val[k])
{
return k;
}
}

if (k >= NUM_KEYS)k = -1; // Error en la lectura


return k;
}

void limpiar(){ /// Funcion para limpiar todos los contadores


x=0;
t=0;
t2=0;
m=0;
m2=0;
conta=0;
conta2=0;
conta3=0;
estado=0;
}

S-ar putea să vă placă și