Keypad y matriz 8x8

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);
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @jesus18le.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

@jesus18le Por favor edita tu post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.

#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);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.