Teclado matricial 4×4 y arduino

Indice

  1. 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() en loop()
  • 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á en loop()
  • Prueba con tone() básico para descartar problemas de hardware