Código lcd y teclado matricial 4x3

Hola buenas a todos, estoy haciendo un proyecto de una cerradura media clave con un teclado matricial de 4x3 con una lcd tengo un problema y no se como hacerlo. Al arrancar el arduino con el código te aparece la lcd vacía pero si metes el código 1234 aparecen los asteriscos, lo que quiero es que ponga arriba introduzca clave y abajo salgan los asteriscos, que se vallan centrando mientras que vas metiendo la clave. He intentado todo pero no lo consigo ayuda por favor.

[code]
#include <Password.h> 
#include <Keypad.h> 
#include <LiquidCrystal.h>
#include <Wire.h>
Password password = Password( "1234" );
int salida =10;
const byte ROWS = 4; //NUMERO DE FILAS
const byte COLS = 3; //NUMEROS DE COLUMNAS
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {7,6,5,4};// PINES PARA LAS FILAS
byte colPins[COLS] = {3,2,11};// PINES PARA LAS COLUMNAS

LiquidCrystal lcd(8, 9, A2, A3, A4, A5);// PINES PARA LA LCD

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  pinMode(salida, OUTPUT);
  lcd.begin(16, 2);
  keypad.addEventListener(keypadEvent);
       }

void(* resetloop) (void) = 0; // RESETEA EL LOOP CUANDO LE LLAMA
void loop(){
  keypad.getKey();
}

void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED: 
          lcd.print("*");// AL PULSAR CUALQUIER TECLA MUESTA *
  switch (eKey){
  case '#': checkPassword(); // AL PRESIONAR # CONFIRMA LA CONTRASEÑA
          break;
  case '*': password.reset(); // AL PRESIONAR * BORRA LA CLAVE INTRODUCIDA
          lcd.clear(); break;
  default: password.append(eKey);
     }
  }
}

void checkPassword(){
  if (password.evaluate()){
    lcd.clear();              //MUESTRA EL MESAJE CLAVE CORRECTA, ACTIVA EL RELE Y REINICIA EL LOOP
    lcd.setCursor(5, 0);
    lcd.print("CLAVE");
    lcd.setCursor(4, 1);
    lcd.print("CORRECTA");
    delay(1500);
    digitalWrite(salida, HIGH);
    delay(2000);
    digitalWrite(salida, LOW);
    resetloop(); 
  }else{                     ////MUESTRA EL MESAJE DE CLAVE INCORRECTA Y REINICIA EL LOOP
    lcd.clear();
    lcd.setCursor(5, 0);
    lcd.print("CLAVE");
    lcd.setCursor(2, 1);
    lcd.print("INCORRECTA");
    delay(2000);
    resetloop();
    
  }
}

[/code]

Saludosssssss

Saludos
Este codigo es una version mas completa que lo que pretendes hacer, lo hice en mis inicios con Arduino asi que no la he probado desde entonces.

Usa:
Arduino UNO
Teclado 4x4
Pantalla LCD
Memoria 24C32

Password.ino (11.2 KB)

Hola buenas, muchas gracias, ahora lo que quiero es limitar el numero de caracteres máximos que pueda meter en la lcd, por ejemplo 4 si yo he metido la clave 1234 que ya no me deje meter mas caracteres. Como se podría hacer?

Saludossss

HOLA, A ALGUNO LES PASO EN UN TECLADO MATRICIAL QUE NO LES APAREZCA LOS NUMEROS DE LA COLUMNA 1 EN LA VENTANA SERIAL, YA REVISE PROGRAMA Y CONEXIONES Y NADA. AYUDA.

Irra. Por favor, lee las normas del foro. Si así lo haces, verás que no se debe escribir en MAYÚSCULAS, y que es más que recomendable aportar, además de la explicación del problema, tu esquema de conexiones y tu código.
Si con ello algún entendido consigue reproducir tu problema tendrás mucho ganado.

Así, ejerciendo de adivino, podría decir por probar algo, que en un array la primera columna no es la 1, sino la 0; es decir, que las columnas no van de 1 a 3, sino de 0 a 2. Igual tiene algo que ver; pero como te dije sin código es imposible conocer tu problema.

IRRA no vayas de hilo en hilo preguntando lo mismo.
Ya tienes tu hilo sobre el problema de la columna 1 y estamos buscando la solución. Sigue las consultas en tu hilo por favor.

Hola me gustaria hacer un codigo con 3 contraseñas pero no me sale nada mas que 1 haber si me puede echar una mano por favor: Gracias de antemano.

#include <Keypad.h> // Controla el teclado
#include <LiquidCrystal.h> //controla el LCD
#include <Servo.h> //Control del servomotor
#include <EEPROM.h> //COntrola E/S EEPROM
#define CERRAR 90 //Calibrar a gusto la pos del servomotor cerrado
#define ABRIR 180 //Calibrar a gusto la pos del servomotor abierto

Servo seguro; //servomotor
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); //display LCD
const byte filas = 4;
const byte columnas = 4;
byte pinsFilas[filas] = {9, 8, 7, 6};
byte pinsColumnas[columnas] = {5, 4, 3, 2};
char teclas[filas][columnas] = {
{'1', '2', '3', 'A'}, // Declaración del teclado
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);
char password[5]; //almacena la contraseña en eeprom
char ingreso; //ingreso del usuario
char passUser[4];
char confirmPass[4]; //confirmacion de la contraseña

int i=0;
int a; //aux
void setup() {
pinMode(19, OUTPUT); // LEDS QUE INDICAN ABIERTO(13) O CERRADO(19)
pinMode(13, OUTPUT);
digitalWrite(19, HIGH); //enciende el led de cerrado
seguro.attach(18); // Pin del servomotor
seguro.write(CERRAR);
lcd.begin(16, 2); //Configuracion lcd 16X2 (columnas,fila)
seguro.write(90); //Cerrar puerta
lcd.setCursor(0, 0);
lcd.print(" PASSWORD ");
lcd.setCursor(5, 1);
lcd.print("____");
//LEER CONTRASEÑA DE LA EEPROM

;
if(EEPROM.read(4)!='Z'){
EEPROM.write(0,'1');
EEPROM.write(1,'2');
EEPROM.write(2,'3');
EEPROM.write(3,'4');
EEPROM.write(4,'Z');
}
for (int i = 0; i <= 4; i++) {
password = EEPROM.read(i);

  • } *

}//fin del setup
void loop() {

  • leerIngreso(1);*
    }

void leerIngreso(int a) {

  • ingreso = teclado.getKey();*

  • if (ingreso != NO_KEY)*

  • switch (ingreso) {*

  • case 'A': // es como el "enter" para introducir la password*

  • if(evaluar(1)==1)*

  • correcto();*

  • else{*

  • msgError();*

  • }*

  • reset();*

  • break;*

  • case 'B':*

  • informacion(); //muestra en el lcd las opcionesde la caja fuerte*

  • reset();*

  • break;*

  • case 'C':*

  • cambioPass();*

  • reset();*

  • break;*

  • case 'D':*

  • lcd.setCursor(0, 0);*

  • lcd.print("Presionaste D");*

  • delay(300);*

  • seguro.write(CERRAR);*

  • reset();*

  • break;*
    _ case '*':_

  • lcd.setCursor(0, 0);*
    _ lcd.print("Presionaste *");_

  • delay(300);*

  • reset();*

  • break;*

  • case '#':*

  • lcd.setCursor(0, 0);*

  • lcd.print("Presionaste #");*

  • delay(300);*

  • reset();*

  • break;*

  • default: //si es un numero debe imprimirlo en el LCD y ademas guardarlo en el arreglo passUser*

  • if(a==1){*
    _ passUser = ingreso;_
    _ printPass(passUser*, 5 + i, 1);
    }
    if(a==2){
    confirmPass = ingreso;
    printPass(confirmPass, 5 + i, 1);
    }
    i++;
    if (i > 3)
    i = 0;*_

}
}
void cleanlcd() {
* lcd.setCursor(0, 0);*
* lcd.print(" ");*
* lcd.setCursor(0, 1);*
* lcd.print(" ");*
}
void printPass(char a, int columna, int fila ) {
* lcd.setCursor(columna, fila);*
* lcd.print(a);*
* delay(100);*
* lcd.setCursor(columna, fila);*
_ lcd.print("");
}
int evaluar(int a) {
int j = 0;
if (a==1){
for (int i = 0; i <= 3; i++) {_

if (password _== passUser) {
j++;
}
}
}
if(a==2){
for (int i = 0; i <= 3; i++) {_

if (passUser _== confirmPass) {
j++;
}
}
}
if (j == 4) {
return j=1;
}
else {
return j=0;
}
}
void reset() {
lcd.setCursor(0, 0);
lcd.print(" PASSWORD ");
lcd.setCursor(5, 1);_

lcd.print("");*
* for(int i =0;i<=3;i++){*

passUser*=NO_KEY;
confirmPass=NO_KEY;*

* }*

* i=0;*
}
void msgError(){

* lcd.setCursor(0, 0);*
* lcd.print(" ERROR ");*
* delay(500);*

* }*
void correcto(){

* lcd.setCursor(0, 0);*
* lcd.print(" CORRECTO ");*
* //Abrir servomotor*
* seguro.write(ABRIR);*
* delay(500);*
}

void informacion() {
* lcd.setCursor(0, 0);*
* lcd.print("'A' para introdu");*
* delay(200);*
* lcd.setCursor(0, 0);*
* lcd.print("cir la pass ");*
* delay(200);*
* lcd.setCursor(0, 0);*
* lcd.print("'C' para cambiar");*
* delay(200);*
* lcd.setCursor(0, 0);*
* lcd.print(" la pass ");*
* delay(200);*
}
void cambioPass() {
* lcd.setCursor(0, 0);*
* lcd.print("Cambio de pass ");*
* delay(200);*
* lcd.setCursor(0, 0);*
* lcd.print("Introduce pass ");*
* delay(200);*
* lcd.setCursor(0, 0);*
* lcd.print("anterior ");*
* delay(200); *
* reset();*
* while(passUser[3]==NO_KEY){
_ leerIngreso(1);}
if (evaluar(1) == 1) {
lcd.setCursor(0, 0);
lcd.print("Introduce ");
delay(200);
lcd.setCursor(0, 0);
lcd.print("la pass nueva ");
delay(200);
reset();_

while(passUser[3]==NO_KEY){
_ leerIngreso(1);
}
lcd.setCursor(0, 0);
lcd.print("Vuelve a intro ");
delay(200);
lcd.setCursor(0, 0);
lcd.print("cirla ");
delay(200);
lcd.setCursor(0, 0);
lcd.print(" PASSWORD ");
lcd.setCursor(5, 1);_

lcd.print("");*
* lcd.setCursor(0, 0);*

* i=0;*

* while(confirmPass[3]==NO_KEY){
_ leerIngreso(2);
}
if(evaluar(2)==1){
// funcion de EEPROM*

* for (int i = 0; i <= 3; i++) {
EEPROM.write(i, passUser);
}
for (int i = 0; i <= 3; i++) {
password = EEPROM.read(i);
}
lcd.setCursor(0, 0);
lcd.print("Contraseña cam ");
delay(200);
lcd.setCursor(0, 0);
lcd.print("biada ");
delay(200);
}
else{
lcd.setCursor(0, 0);
lcd.print("Error las pass ");
delay(200);
lcd.setCursor(0, 0);
lcd.print("no coinciden ");
delay(200);
}*_

* }*
* else {*
* msgError();*
* }*
* reset();*
}
void passChange(){
for(int i=0;i<=3;i++){
password_=passUser*;
}*_

}