estoy elaborando una caja de seguridad en la cual tendre tres pantallas, una lcd a color para mostrar imagenes, una lcd para la contraseña con teclado y una matriz 8x8.
el problema que tengo por el momento es que cuando junto la tarea de la matriz que es mostrar cracteres, la parte del acceso con el teclado y la lcd deja de responder.
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //incluimos la libreria I2C para trabajar con la pantalla LCD
#include <Keypad.h> //incluir libreria para trabajar con teclado matricial
#include "LedControl.h" // incluye libreria LedControl
//comandos matriz 4x4
LedControl lc=LedControl(51,52,53,1); // crea objeto
unsigned long inicio;
unsigned long current;
const unsigned long period = 500;
byte Corazon_datos[]= { // array que contiene todos los elementos de las
B00000000, // filas necesarias por mostrar el digito cero
B01101100,
B11111110,
B11111110,
B01111100,
B00111000,
B00010000,
B00000000
};
byte Cara_datos[]= { // array que contiene todos los elementos de las
B11111110,
B11000011,
B11000011,
B11111110,
B11111110,
B11000011,
B11000011,
B11111110
};
byte Mensaje_datos[]= { // array que contiene todos los elementos de las
B11111111,
B11111111,
B00011000,
B00011000,
B11011000,
B11011000,
B11111000,
B01111000
};
LiquidCrystal_I2C lcd(0X27,16,2); //tamaño (#columnas, #filas) de la pantalla LCD que voy a usar
char contrasena[] = "1234"; //definimos una contraseña de 4 digitos para usuario root
char codigo[4]; //arreglo donde almacenaremos la contraseña digitada de los usuarios
int digito = 0; //variable que nos dira en que digito vamos
int usuario = 0; //variable que nos dira que usuario digitó la contraseña (0 = usuario root)
int tmp_intentos = 0; //variable temporal máximo de intentos para ingresar la clave correcta
int intentos = 3; //variable de máximo de intentos para ingresar la clave correcta
boolean contrasena_correcta = false;
int cerradura = 29;
const int pinBuzzer = 28;
const int foco_verde= 30;
const int foco_rojo= 31;
const byte filas = 4; //numero de filas del teclado
const byte columnas = 4; //numero de columnas del teclado
char teclas[filas][columnas] = //arreglo donde declaramos los caracteres que van en cada posicion fila-columna
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinsFilas[filas] = {32, 34, 36, 38}; //pines donde van conectadas las filas
byte pinsColumnas[columnas] = {33, 35, 37, 39}; //pines donde van conectadas las columnas
Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas); //creamos el objeto teclado
void setup()
{
Serial.begin (9600);
lcd.init();
lcd.backlight(); //Encender la luz de fondo.
pinMode(pinBuzzer, OUTPUT);
pinMode(cerradura, OUTPUT);
pinMode(foco_verde, OUTPUT);
pinMode(foco_rojo, OUTPUT);
digitalWrite(cerradura, LOW);
tmp_intentos=intentos; //Pasamos a la variable temporal intentos el valor de la variable intentos
lcd.clear(); //limpiamos la pantalla LCD
lcd.setCursor(2, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Digite Clave"); //imprimir mensaje
lc.shutdown(0,false); // enciende la matriz
lc.setIntensity(0,4); // establece brillo
lc.clearDisplay(0); // blanquea matriz
}
void loop()
{
Teclado();
// MATRIZ(500);
if (millis()-tiempo>=100){
Representar(Mensaje_datos,5000);
trans();
delay(500);
Representar(Corazon_datos,5000);
Representar (Cara_datos,3000);
lc.clearDisplay(0);
tiempo=millis();
}
}
void Teclado(){
char tecla = teclado.getKey(); //guardamos el caracter de la tecla presionada en la variable tecla
if (tecla != NO_KEY && tecla != '*') //si "tecla" es diferente de "no tecla" y diferente de * (si se presiona una tecla)
{
if (tecla != NO_KEY && tecla == '#') //si "tecla" es diferente de "no tecla" y es igual a #
{
digito = 0;
tone(pinBuzzer, 2000); //Tono de borrado
delay(250);
noTone(pinBuzzer);
lcd.setCursor(6, 1); //se posiciona el cursor convenientemente
lcd.print(" ");
lcd.setCursor(2, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Digite Clave"); //imprimir mensaje
delay(250); //esperamos
}
else{
tono_tecla();
codigo[digito] = tecla; //almacena en la posicion "digito" de "codigo" el caracter de la "tecla" presionada
lcd.setCursor(digito + 6, 1); //se posiciona el cursor convenientemente
lcd.print('*'); //se imprime "*" cada vez que se oprime una tecla
digito = digito + 1; //incrementar la variable digito para almacenar los 4 digitos presionados
if (digito == 4) //si ya se llenaron los 4 digitos de codigo...
{
verificar_contrasena();
if (contrasena_correcta==true)
{
tmp_intentos=intentos; //Reiniciamos la variable temporal de intentos
digitalWrite(foco_verde, HIGH); //encender el led verde
digitalWrite (cerradura, HIGH);
delay (5000);
lcd.clear(); //Limpiamos la pantalla
lcd.setCursor(3, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Bienvenido"); //imprimimos en pantalla
tone(pinBuzzer, 3000);
delay(3000); //esperamos 3 segundos
noTone(pinBuzzer);
lcd.clear(); //limpiamos la pantalla LCD
digitalWrite(foco_verde, LOW); //apagamos el led verde
digitalWrite (cerradura, LOW);
lcd.setCursor(2, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Digite Clave"); //imprimir mensaje
}
else //de lo contrario (si el "codigo" es diferente a la "clave")
{
digitalWrite(foco_rojo, HIGH); //encendemos el led rojo
lcd.setCursor(0, 1); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Clave incorrecta"); //imprimimos el letrero diciendo clave incorrecta
tone(pinBuzzer, 2000); //Tono de clave incorrecta
delay(500);
noTone(pinBuzzer);
delay(1000); //esperamos 1 segundos
lcd.clear(); //limpiamos la pantalla LCD
digitalWrite(foco_rojo, LOW); //apagamos el led rojo
if (tmp_intentos==1) { //Verificamos si alcanzamos la máxima cantidad de intentos
tmp_intentos=intentos; //Reiniciamos la variable temporal de intentos
lcd.clear();
lcd.setCursor(0, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Acceso bloqueado"); //imprimimos en pantalla
lcd.setCursor(3, 1); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Espere...."); //imprimimos en pantalla
delay(10000); //Esperamos 10 segundos
digito = 0; //reseteamos la variable digito
contrasena_correcta==false;
lcd.clear();
lcd.setCursor(2, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Digite Clave"); //imprimir mensaje
}
else{
tmp_intentos = tmp_intentos - 1; //Disminuyo la variable temporal de intentos
} //Fin de intentos
}
digito = 0; //reseteamos la variable digito
contrasena_correcta==false; //Aseguramos la bandera de contraseña correcta en false
lcd.setCursor(2, 0); //ubicamos el cursor en la (columna, fila) convenientemente
lcd.print("Digite Clave"); //imprimir mensaje
delay(250); //esperamos
} //Fin de ingreso de digitos de la clave
} //Fin de verificación de tecla # oprimida
} //Fin de verificación de tecla * oprimida
}
void verificar_contrasena(){
if (codigo[0] == contrasena[0] && codigo[1] == contrasena[1] && codigo[2] == contrasena[2] && codigo[3] == contrasena[3]) //si el "codigo" digitado es igual a la "contraseña"
{
contrasena_correcta = true;
}
else
{
contrasena_correcta = false;
}
}
void tono_tecla(){
tone(pinBuzzer, 2000); //Generamos un tono cada vez que oprimimos una tecla
delay(100); //esperamos 100 milisegundos
noTone(pinBuzzer);
}
// void MATRIZ(){
// Representar(Mensaje_datos,5000);
// trans();
// delay(500);
// Representar(Corazon_datos,5000);
// Representar (Cara_datos,3000);
// lc.clearDisplay(0);
// }
void trans(){
for (int row=0; row<8; row++){
for (int col=0; col<8; col++){
lc.setLed(0,col,row,true);
delay(25);
}
}
for (int row=0; row<8; row++){
for (int col=0; col<8; col++){
lc.setLed(0,col,row,false);
delay(25);
}
}
}
void Representar(byte *Datos,int retardo){
for (int i = 0; i < 8; i++){
lc.setColumn(0, i, Datos[7-i]);
}
delay (retardo);
}