Hi people, I am doing a project wich in a part of it involves the use of a matrix keypad 4x4 and an arduino nano, according the the input from the keypad (a password) the arduino nano must send a digital signal through the pin d13 for 3 seconds.
I can see the input i am writing at a lcd screen.
The problem is that the characters received by the nano does not match with the ones I press in the hard keyboard. For example if I press the "2" icon then the arduino marks it as "4". It only recognizes correctly the "1", "5","9" and "D" .
The code worked well with arduino uno.
It also worked using a different keyboard model.
This is the model it worked with
This is the model I want to work with
I am sharing the code too:
#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_PCF8574.h>
// Configura la dirección I2C y el tamaño del LCD
LiquidCrystal_PCF8574 lcd(0x27); // Cambia 0x27 por la dirección de tu pantalla
// Configuración del teclado matricial 4x4
const byte filas = 4; // Número de filas
const byte columnas = 4; // Número de columnas
// Mapeo de teclas (ajusta según tu teclado)
char teclas[filas][columnas] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Pines conectados al teclado (ajusta según tu conexión)
byte pinesFilas[filas] = {9, 8, 7, 6}; // Pines digitales del Arduino Nano para las filas
byte pinesColumnas[columnas] = {5, 4, 3, 2}; // Pines digitales del Arduino Nano para las columnas
Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);
// Configuración de la contraseña
String contrasena = "2016"; // Contraseña correcta
String entrada = ""; // Almacena la entrada del usuario
String entradaesp32 =""; // Almacena informacion serial desde ESP32
// Configuración de la salida digital
const int salida = 13; // Pin digital del Arduino Nano para la salida (ajusta según tu preferencia)
const unsigned long tiempoActivo = 3000; // Tiempo en milisegundos (3 segundos)
void setup() {
// Inicia la comunicación serial con el ESP32
Serial.begin(9600); // Comunicación a través de los pines RX y TX por defecto
// Configuración de la salida digital
pinMode(salida, OUTPUT);
digitalWrite(salida, LOW);
// Inicializa el LCD
Wire.begin(); // Inicia la comunicación I2C
lcd.begin(16, 2); // Inicializa el LCD con 16 columnas y 2 filas
lcd.setBacklight(255); // Activa la luz de fondo (0 para apagarla)
lcd.setCursor(0, 0); // Posiciona el cursor en la primera columna y fila
lcd.print("INGRESAR CLAVE:"); // Muestra un mensaje en la pantalla
}
void loop() {
// Verifica si hay datos disponibles desde el ESP32
if (Serial.available() > 0) {
// Lee la nueva contraseña enviada por el ESP32
entradaesp32 = Serial.readString();
entradaesp32.trim(); // Elimina espacios, saltos de línea y retornos de carro
contrasena = entradaesp32;
lcd.setCursor(0, 1);
lcd.print(contrasena); // Muestra la nueva contraseña
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" "); // Limpia la segunda línea
}
char tecla = teclado.getKey(); // Lee una tecla del teclado
if (tecla) {
if (tecla == '#') {
if (entrada == contrasena) {
lcd.setCursor(0, 1);
lcd.print("Abriendo puerta");
digitalWrite(salida, HIGH);
delay(tiempoActivo);
digitalWrite(salida, LOW);
lcd.setCursor(0, 1);
lcd.print("Puerta Cerrada");
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" ");
entrada = "";
} else {
lcd.setCursor(0, 1);
lcd.print("Clave incorrecta");
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" ");
entrada = "";
}
} else if (tecla == '*') {
entrada = "";
lcd.setCursor(0, 1);
lcd.print(" ");
} else {
entrada += tecla;
lcd.setCursor(0, 1);
lcd.print(entrada);
if (entrada.length() > 4) {
entrada = "";
lcd.setCursor(0, 1);
lcd.print("max.4 caracteres");
delay(3000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
}
}
}

