Componentes · 5 min de lectura

Cómo usar un teclado matricial (keypad): cerradura con clave 4x4 con Arduino

¿Cómo funciona un teclado matricial? Conexión de keypads 4x4 y 3x4, barrido de filas y columnas, librería Keypad, leer la tecla pulsada, introducir una clave y cerradura con servo, uso con LCD, ESP32 y Pico.

Un keypad (teclado matricial) es un elemento de entrada barato, parecido a las teclas de un teléfono, que te permite introducir números o letras en tu proyecto. Con un keypad se hacen cerraduras con clave, cajas fuertes, calculadoras, paneles de alarma y sistemas de menús. Los modelos más comunes son los teclados de membrana finos con parte trasera adhesiva, en formato 4x4 (16 teclas) y 3x4 (12 teclas).

Teclado de membrana 4x4
Teclado de membrana 4x4: números del 0 al 9, letras de la A a la D y las teclas * y #; el cable plano de abajo tiene 8 pines.

¿Cómo funciona un keypad? La matriz de filas y columnas

Si cada una de las 16 teclas tuviera su propio pin, harían falta 16 pines. En su lugar, el keypad organiza las teclas en una matriz: 4 filas y 4 columnas; cada tecla está donde se cruzan una fila y una columna y, al pulsarla, une esa fila con esa columna. Arduino pone las filas en LOW una a una y lee las columnas; la columna que lee LOW mientras una fila está en LOW indica qué tecla se ha pulsado. Como este barrido se hace cientos de veces por segundo, 16 teclas se leen con solo 8 pines.

TipoTeclasPinesUso típico
Membrana 4x416 (0–9, A–D, *, #)8Claves, menús, calculadoras
Membrana 3x412 (0–9, *, #)7Introducir números como en un teléfono
Membrana 1x445Menús sencillos y teclas de selección

Pines y conexión del keypad

Con las teclas hacia ti, los pines del cable plano suelen ser, de izquierda a derecha, R1, R2, R3, R4, C1, C2, C3, C4: los cuatro primeros son filas y los cuatro últimos, columnas. No hacen falta resistencias; la librería usa las resistencias pull-up internas de Arduino en las columnas.

Pin del keypadFunciónArduino Uno
1R1 (1, 2, 3, A)D9
2R2 (4, 5, 6, B)D8
3R3 (7, 8, 9, C)D7
4R4 (*, 0, #, D)D6
5C1 (1, 4, 7, *)D5
6C2 (2, 5, 8, 0)D4
7C3 (3, 6, 9, #)D3
8C4 (A, B, C, D)D2
Si al pulsar el 1 sale una D y al pulsar el 4 sale una C, el orden de filas y columnas está invertido. En lugar de recablear, basta con invertir el orden de los arrays rowPins y colPins en el código.

Leer las teclas con la librería Keypad

En el Gestor de librerías busca Keypad e instala la librería de Mark Stanley y Alexander Brevig. El código siguiente escribe en el Monitor Serie cada tecla que pulses:

Arduino (C++)
1#include <Keypad.h>
2
3const byte ROWS = 4, COLS = 4;
4char keys[ROWS][COLS] = {
5  {'1', '2', '3', 'A'},
6  {'4', '5', '6', 'B'},
7  {'7', '8', '9', 'C'},
8  {'*', '0', '#', 'D'}
9};
10byte rowPins[ROWS] = {9, 8, 7, 6};     // R1–R4
11byte colPins[COLS] = {5, 4, 3, 2};     // C1–C4
12Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
13
14void setup() {
15  Serial.begin(9600);
16}
17
18void loop() {
19  char key = keypad.getKey();          // tuş yoksa 0 döner / returns 0 if no key
20  if (key) {
21    Serial.println(key);
22  }
23}

getKey() no detiene el programa: si en ese momento no hay ninguna tecla pulsada, devuelve 0 enseguida, así que puedes hacer otras cosas en loop(). La librería se encarga del rebote de las teclas y avisa de cada pulsación una sola vez. Si quieres esperar hasta que se pulse una tecla, usa waitForKey().

Hacer una cerradura con clave

Ahora vamos a juntar las teclas pulsadas en un texto y compararlo con una clave guardada. La tecla * borra lo escrito y la tecla # lo confirma. Si la clave es correcta, un servomotor abre la cerradura durante 3 segundos. Para conectar el servo, mira ¿Qué es un servomotor?

Arduino (C++)
1#include <Keypad.h>
2#include <Servo.h>
3
4const byte ROWS = 4, COLS = 4;
5char keys[ROWS][COLS] = {
6  {'1', '2', '3', 'A'},
7  {'4', '5', '6', 'B'},
8  {'7', '8', '9', 'C'},
9  {'*', '0', '#', 'D'}
10};
11byte rowPins[ROWS] = {9, 8, 7, 6};
12byte colPins[COLS] = {5, 4, 3, 2};
13Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
14
15Servo lock;
16const String PASSWORD = "1234";
17String input = "";
18
19void setup() {
20  Serial.begin(9600);
21  lock.attach(10);
22  lock.write(0);                        // kilitli / locked
23}
24
25void loop() {
26  char key = keypad.getKey();
27  if (!key) return;
28  if (key == '*') {                     // temizle / clear
29    input = "";
30  } else if (key == '#') {              // onayla / confirm
31    if (input == PASSWORD) {
32      Serial.println("Doğru, açılıyor / correct, opening");
33      lock.write(90);
34      delay(3000);
35      lock.write(0);
36    } else {
37      Serial.println("Yanlış şifre / wrong code");
38    }
39    input = "";
40  } else if (input.length() < 8) {
41    input += key;
42    Serial.print('*');                  // tuşu gizle / hide the key
43  }
44}
Esta cerradura es para aprender y para proyectos de afición. Para una puerta real, añade un tiempo de bloqueo tras varios intentos fallidos, guarda la clave en la EEPROM en lugar de escribirla tal cual en el código y coloca la electrónica donde nadie pueda llegar desde fuera.

Usarlo con una pantalla LCD

Una pantalla hace mucho más fácil ver lo que haces al escribir la clave. Una LCD I2C solo usa los pines A4 y A5, así que no toca los 8 pines digitales del keypad. Con cada pulsación escribe un asterisco en la fila inferior de la LCD y, tras confirmar, muestra «Abierto» o «Error» en la fila superior. La conexión y las órdenes de la pantalla se explican en Cómo usar una pantalla LCD I2C.

Menos pines: keypads I2C y analógicos

El keypad por sí solo ocupa 8 de los 20 pines del Uno. Si te faltan pines, hay dos soluciones: un adaptador I2C para keypad basado en el PCF8574 lo reduce a solo dos cables y comparte el bus con la LCD. En los keypads analógicos, cada tecla crea una resistencia distinta y todo el teclado se lee desde un solo pin analógico; necesita menos cables, pero no detecta dos teclas pulsadas a la vez.

Keypad con el ESP32 y la Raspberry Pi Pico

La librería Keypad también funciona en el ESP32. Como los pines de fila se usan como salidas y los de columna como entradas con pull-up, evita los GPIO 34–39, que no pueden dar salida ni tienen pull-up; por ejemplo, usa 13, 12, 14 y 27 para las filas y 26, 25, 33 y 32 para las columnas. En la Pico con MicroPython puedes programar tú mismo el barrido en pocas líneas:

MicroPython
1from machine import Pin
2import time
3
4KEYS = ["123A", "456B", "789C", "*0#D"]
5rows = [Pin(n, Pin.OUT, value=1) for n in (2, 3, 4, 5)]        # R1–R4
6cols = [Pin(n, Pin.IN, Pin.PULL_UP) for n in (6, 7, 8, 9)]     # C1–C4
7
8def scan():
9    for r, row in enumerate(rows):
10        row.value(0)                         # bu satırı etkinleştir / activate this row
11        for c, col in enumerate(cols):
12            if col.value() == 0:             # tuş basılı / key pressed
13                row.value(1)
14                return KEYS[r][c]
15        row.value(1)
16    return None
17
18last = None
19while True:
20    key = scan()
21    if key and key != last:                  # her basışı bir kez yaz / print each press once
22        print(key)
23    last = key
24    time.sleep_ms(50)

Ideas de proyectos con keypad

  • Caja fuerte con clave: una caja que se abre al introducir la clave, con servomotor, pantalla LCD y zumbador.
  • Calculadora: usa las teclas A–D como las cuatro operaciones y muestra el resultado en una LCD.
  • Selector de color: cambia el color de un LED RGB según el número introducido.
  • Panel de alarma: activa y desactiva con una clave una alarma con sensor PIR.
  • Juego de adivinar números: encuentra el número que ha pensado Arduino con las pistas «mayor» y «menor».
  • Teclado de atajos: convierte cada tecla en un atajo del ordenador con un Arduino Leonardo.

Errores comunes y cómo solucionarlos

  • Se lee una tecla distinta de la pulsada: el orden de filas y columnas está invertido; invierte el orden de los arrays rowPins y colPins.
  • No se lee ninguna tecla: el cable plano está conectado desplazado un pin, o los pines de filas y columnas no coinciden con el código.
  • Algunas teclas no funcionan nunca: un cable de fila o de columna hace mal contacto; si fallan todas las teclas de una fila o columna, esa es la señal.
  • Usar los pines 0 y 1: estos pines son para la comunicación serie por USB; cargar el programa con el keypad conectado puede dar error.
  • En el ESP32 algunas columnas parecen siempre pulsadas: se están usando los GPIO 34–39, que no tienen pull-up; pásalas a otros pines.
  • Esperar repeticiones al mantener pulsado: getKey() avisa una vez por pulsación; para detectar una tecla mantenida, usa el estado HOLD de la librería.

Un keypad no es más que botones dispuestos en matriz; la lógica de los botones la tienes en Cómo conectar un pulsador a Arduino. En la app BlueGrays encontrarás proyectos de uso de keypads 3x4 y 4x4, una aplicación de clave con LCD, una caja fuerte electrónica inteligente, una calculadora I2C y el control de un LED RGB con keypad, con esquemas y código.

Preguntas frecuentes

¿Cuántos pines usa un keypad 4x4?

Un keypad 4x4 usa 8 pines: 4 filas y 4 columnas. Uno de 3x4 usa 7 pines y uno de 1x4, 5. Si te faltan pines, puedes bajar a 2 cables con un adaptador I2C para keypad o a un solo pin analógico con un keypad analógico.

¿El keypad necesita resistencias?

No. La librería Keypad activa las resistencias pull-up internas de Arduino en los pines de columna, así que no hace falta añadir resistencias. Puedes conectar el keypad directamente a pines digitales.

¿A qué pines se conecta un keypad?

A cualquier grupo de 8 pines digitales; los analógicos también sirven como digitales. En el Uno evita los pines 0 y 1, que se usan para la comunicación serie por USB. En el ESP32 no uses los GPIO 34–39, que no pueden dar salida ni tienen pull-up.

¿Puedo detectar dos teclas pulsadas a la vez?

Sí, la función getKeys() de la librería Keypad detecta hasta 10 teclas pulsadas a la vez. Pero en los teclados de membrana sin diodos, algunas combinaciones de tres teclas pueden hacer que parezca pulsada una tecla que no lo está (ghosting).

Si cambio la clave, ¿se olvida cuando se va la luz?

Una clave guardada en una variable vuelve al valor por defecto del código cuando Arduino se reinicia. Si quieres que una clave nueva se mantenga, guárdala en la EEPROM y léela de allí al arrancar.

¿Cuánto dura un teclado de membrana?

Los teclados de membrana suelen aguantar alrededor de 1 millón de pulsaciones por tecla y, como son finos y ligeros, se pegan fácilmente en una caja o una tapa. No están totalmente protegidos contra el agua y el polvo; para exteriores se prefieren keypads con teclas metálicas o de silicona.

Ver todos los proyectos
Funcionamiento del teclado 3x4
#61Principiante
Premium

Funcionamiento del teclado 3x4

Proyecto básico que lee la tecla pulsada del teclado numérico 3x4 y la muestra en el Monitor Serie. Enseña el uso de la librería de teclado y el teclado matricial.

4.5(24)
31
Control de LED con teclado 3x4
#62Intermedio
Premium

Control de LED con teclado 3x4

Proyecto que puede encender y apagar 3 LEDs independientemente con 3x4 teclas de teclado y realizar control por lotes. Enseña el control de múltiples salidas con teclado.

4.6(29)
38
Funcionamiento del teclado 4x4
#63Principiante
Premium

Funcionamiento del teclado 4x4

Proyecto básico que lee la tecla pulsada del teclado 4x4 y la muestra en el Monitor Serie. Enseña la configuración del teclado extendido de 4 columnas.

4.5(27)
35
Cerradura con contraseña, teclado 4x4 y LCD
#64Avanzado
Premium

Cerradura con contraseña, teclado 4x4 y LCD

Proyecto de seguridad que abre la puerta con servo si es correcta introduciendo una contraseña con un teclado 4x4 y enciende un LED rojo si es incorrecta. Enseña la comparación de contraseñas y la int

4.8(57)
75
Teclado para desarrolladores de software Arduino
#65Intermedio
Premium

Teclado para desarrolladores de software Arduino

Proyecto de teclado programador que escribe bloques de código Arduino como if, for, digitalWrite al ordenador con un solo botón con Arduino Leonardo y teclado 4x4. Enseña emulación de teclado HID.

4.7(40)
52
Caja fuerte electrónica inteligente
#92Avanzado
Premium

Caja fuerte electrónica inteligente

Smart Electronic Safe es un sistema de seguridad protegido por contraseña basado en Arduino. Activa y desactiva el mecanismo de cierre controlado por servomotor con la contraseña de 4 dígitos introduc

4.7(42)
63
Calculadora Arduino I2C
#94Intermedio
Premium

Calculadora Arduino I2C

Se trata de un proyecto de calculadora basado en Arduino que realiza operaciones de suma, resta, multiplicación y división utilizando un teclado de membrana 4x4 y una pantalla LCD 16x2 I2C. Gracias a I2C, la conexión de la pantalla se realiza con sólo 2 cables, reduciendo así el desorden de cables y manteniendo más pines abiertos para su uso. También dispone de entrada de números decimales y soporte de números negativos.

5.0(31)
43
Control Led RGB con teclado
#95Intermedio
Premium

Control Led RGB con teclado

Este proyecto permite manejar el LED RGB entre modos y colores a través del Teclado 4x4. Gracias a la estructura millis(), los comandos se procesan sin retardo. 🎮 Guía del usuario: Tecla A: Velocidad fija Efecto fundido. Tecla B: Transición suave con velocidad ajustable. C / D: Aumenta / Disminuye la velocidad del efecto. 1 - 9: Selección rápida del color maestro. * / #: Colores intermedios especiales (rosa, verde claro, etc.). Tecla 0: Apaga el sistema.

5.0(32)
44

Aprende cómo se leen 16 teclas con solo 8 pines, a conectar un teclado matricial a Arduino, leer las pulsaciones y hacer una cerradura con clave que se abre con un servomotor, paso a paso.

Cómo usar un teclado matricial (keypad): cerradura con clave 4x4 con Arduino | BlueGrays