.
Teclado matricial 4×4 y arduino
Indice
- teclado 4×4 con buzzer y arduino
1.Teclado 4×4 con buzzer y arduino

#include <Keypad.h> // Incluir librería para teclado matricial
#include <ezBuzzer.h> // Incluir librería para controlar el buzzer
const int PIN_BUZZER = 11; // Pin donde está conectado el buzzer
const int NUM_FILAS = 4; // Cuatro filas
const int NUM_COLUMNAS = 4; // Cuatro columnas
// Matriz que define los caracteres de cada tecla
char teclas[NUM_FILAS][NUM_COLUMNAS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Pines conectados a las filas del teclado
byte pines_filas[NUM_FILAS] = {9, 8, 7, 6};
// Pines conectados a las columnas del teclado
byte pines_columnas[NUM_COLUMNAS] = {5, 4, 3, 2};
// Crear objeto Keypad con la configuración definida
Keypad teclado = Keypad(makeKeymap(teclas), pines_filas, pines_columnas, NUM_FILAS, NUM_COLUMNAS);
// Crear objeto buzzer que se conecta al pin especificado
ezBuzzer buzzer(PIN_BUZZER);
void setup() {
Serial.begin(9600); // Inicializar comunicación serial
}
void loop() {
buzzer.loop(); // OBLIGATORIO: llamar a esta función en cada ciclo para que el buzzer funcione
char tecla = teclado.getKey(); // Leer la tecla presionada (si hay alguna)
if (tecla) { // Si se presionó una tecla...
Serial.print(tecla); // Mostrar la tecla en el monitor serie
buzzer.beep(100); // Generar un pitido de 100 milisegundos
}
}
Explicación del funcionamiento:
Teclado Matricial 4×4:
- Organizado en 4 filas y 4 columnas (total 16 teclas)
- Cuando se presiona una tecla, se conecta una fila con una columna específica
- La librería Keypad detecta qué combinación fila-columna se activó
Buzzer:
- Genera un pitido corto (100ms) cada vez que se presiona una tecla
- La librería ezBuzzer maneja la temporización sin bloquear el código
Salida en el Monitor Serie:
text
1 2 3 A 4 5 # (se presionó el numeral) D ...
Esquema de conexión:
text
TEclado Matricial 4x4 Arduino ┌─────────────┐ │ ROW1 (Fila1)│───────→ Pin 9 │ ROW2 (Fila2)│───────→ Pin 8 │ ROW3 (Fila3)│───────→ Pin 7 │ ROW4 (Fila4)│───────→ Pin 6 │ COL1 (Col1) │───────→ Pin 5 │ COL2 (Col2) │───────→ Pin 4 │ COL3 (Col3) │───────→ Pin 3 │ COL4 (Col4) │───────→ Pin 2 └─────────────┘ Buzzer: Pin positivo (+) ───────→ Pin 11 (con resistencia opcional) Pin negativo (-) ───────→ GND
Aplicaciones comunes:
- Cerraduras digitales con contraseña
- Controles para juegos
- Calculadoras simples
- Sistemas de control industrial
- Interfaces de usuario para proyectos
- Menús de selección en pantallas LCD
- Marcadores electrónicos
Mejoras posibles – Sistema de contraseña:
cpp
#include <Keypad.h>
#include <ezBuzzer.h>
const int PIN_BUZZER = 11;
const int NUM_FILAS = 4;
const int NUM_COLUMNAS = 4;
char teclas[NUM_FILAS][NUM_COLUMNAS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pines_filas[NUM_FILAS] = {9, 8, 7, 6};
byte pines_columnas[NUM_COLUMNAS] = {5, 4, 3, 2};
Keypad teclado = Keypad(makeKeymap(teclas), pines_filas, pines_columnas, NUM_FILAS, NUM_COLUMNAS);
ezBuzzer buzzer(PIN_BUZZER);
// Variables para sistema de contraseña
String contrasena = "";
String claveCorrecta = "1234";
const int PIN_LED_VERDE = 12;
const int PIN_LED_ROJO = 13;
void setup() {
Serial.begin(9600);
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
Serial.println("=== SISTEMA DE CLAVE ===");
Serial.println("Ingrese la clave de 4 dígitos:");
}
void loop() {
buzzer.loop();
char tecla = teclado.getKey();
if (tecla) {
buzzer.beep(50); // Pitido corto al presionar
if (tecla == '#') { // Tecla '#' para validar
if (contrasena == claveCorrecta) {
Serial.println("\n✅ ¡ACCESO CONCEDIDO!");
digitalWrite(PIN_LED_VERDE, HIGH);
buzzer.beep(500); // Pitido largo de éxito
delay(2000);
digitalWrite(PIN_LED_VERDE, LOW);
} else {
Serial.println("\n❌ ¡ACCESO DENEGADO!");
digitalWrite(PIN_LED_ROJO, HIGH);
for(int i = 0; i < 3; i++) { // 3 pitidos de error
buzzer.beep(150);
delay(200);
}
delay(2000);
digitalWrite(PIN_LED_ROJO, LOW);
}
contrasena = ""; // Reiniciar
Serial.println("\nIngrese nueva clave:");
} else if (tecla == '*') { // Tecla '*' para borrar
contrasena = "";
Serial.println("\n⌫ CLAVE BORRADA");
buzzer.beep(200);
} else {
contrasena += tecla;
Serial.print("*"); // Mostrar asteriscos por seguridad
// Si se alcanzaron 4 dígitos, validar automáticamente
if (contrasena.length() == 4) {
Serial.println(); // Salto de línea
// Simular presión de '#'
if (contrasena == claveCorrecta) {
Serial.println("✅ ¡ACCESO CONCEDIDO!");
digitalWrite(PIN_LED_VERDE, HIGH);
buzzer.beep(500);
delay(2000);
digitalWrite(PIN_LED_VERDE, LOW);
} else {
Serial.println("❌ ¡ACCESO DENEGADO!");
digitalWrite(PIN_LED_ROJO, HIGH);
for(int i = 0; i < 3; i++) {
buzzer.beep(150);
delay(200);
}
delay(2000);
digitalWrite(PIN_LED_ROJO, LOW);
}
contrasena = "";
Serial.println("\nIngrese nueva clave:");
}
}
}
}
Ejemplo de salida con sistema de contraseña:
text
=== SISTEMA DE CLAVE === Ingrese la clave de 4 dígitos: **** ✅ ¡ACCESO CONCEDIDO! Ingrese nueva clave: *** ⌫ CLAVE BORRADA Ingrese nueva clave: **** ❌ ¡ACCESO DENEGADO!
Notas importantes:
Para la librería Keypad:
- Instalación: Sketch → Incluir Librería → Administrar Librerías → buscar «Keypad»
- La función
getKey()no bloquea el programa - Es necesaria una resistencia pull-up interna o externa (las internas se activan automáticamente)
Para la librería ezBuzzer:
- Instalación: buscar «ezBuzzer» en el administrador de librerías
- IMPORTANTE: Siempre llamar a
buzzer.loop()enloop() - Permite múltiples buzzer y facilita la gestión de tiempos
Tipos de teclados comunes:
- 3×4 (12 teclas: dígitos 0-9, *, #)
- 4×4 (16 teclas: dígitos + letras A-D)
- Matricial de membrana (barato y fácil de usar)
- Teclado mecánico personalizado
¿Problema con el buzzer?
Si el buzzer no suena:
- Verifica la polaridad (algunos son polarizados)
- Asegúrate de que
buzzer.loop()está enloop() - Prueba con
tone()básico para descartar problemas de hardware