Como usar um teclado matricial: fechadura com senha 4x4 com Arduino
Como funciona um teclado matricial? Ligação de teclados 4x4 e 3x4, varredura de linhas e colunas, a biblioteca Keypad, leitura das teclas, entrada de senha e fechadura com servo, uso com LCD, além de ESP32 e Pico.
O teclado matricial (keypad) é um dispositivo de entrada barato, parecido com as teclas de um telefone, que permite digitar números ou letras no seu projeto. Fechaduras de porta com senha, cofres, calculadoras, painéis de alarme e sistemas de menu são feitos com teclados assim. Os modelos mais comuns são os teclados de membrana finos, com verso adesivo, nos formatos 4x4 (16 teclas) e 3x4 (12 teclas).

Como funciona um teclado matricial? A matriz de linhas e colunas
Se cada uma das 16 teclas tivesse o próprio pino, você precisaria de 16 pinos. Em vez disso, o teclado organiza as teclas em uma matriz: há 4 linhas e 4 colunas, cada tecla fica onde uma linha e uma coluna se cruzam, e apertá-la liga aquela linha àquela coluna. O Arduino coloca as linhas em LOW uma de cada vez e lê as colunas; a coluna que estiver em LOW enquanto uma certa linha está em LOW diz qual tecla foi apertada. Como essa varredura acontece centenas de vezes por segundo, 16 teclas são lidas com só 8 pinos.
| Tipo | Teclas | Pinos | Uso típico |
|---|---|---|---|
| Membrana 4x4 | 16 (0–9, A–D, *, #) | 8 | Senhas, menus, calculadoras |
| Membrana 3x4 | 12 (0–9, *, #) | 7 | Digitação de números como no teclado de um telefone |
| Membrana 1x4 | 4 | 5 | Menus simples e teclas de seleção |
Pinagem e ligação do teclado matricial
Com as teclas viradas para você, os pinos do cabo flat costumam ser, da esquerda para a direita, R1, R2, R3, R4, C1, C2, C3, C4: os quatro primeiros são as linhas e os quatro últimos, as colunas. Não precisa de resistores extras; a biblioteca usa os resistores de pull-up internos do Arduino nas colunas.
| Pino do teclado | Função | Arduino Uno |
|---|---|---|
| 1 | R1 (1, 2, 3, A) | D9 |
| 2 | R2 (4, 5, 6, B) | D8 |
| 3 | R3 (7, 8, 9, C) | D7 |
| 4 | R4 (*, 0, #, D) | D6 |
| 5 | C1 (1, 4, 7, *) | D5 |
| 6 | C2 (2, 5, 8, 0) | D4 |
| 7 | C3 (3, 6, 9, #) | D3 |
| 8 | C4 (A, B, C, D) | D2 |
Lendo as teclas com a biblioteca Keypad
No Gerenciador de Bibliotecas, busque Keypad e instale a biblioteca de Mark Stanley e Alexander Brevig. O código abaixo mostra no Monitor Serial cada tecla que você aperta:
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}O getKey() não bloqueia o programa: se nenhuma tecla estiver apertada naquele momento, ele retorna 0 na hora, então você pode fazer outras tarefas no loop(). A própria biblioteca cuida do repique das teclas e informa cada toque uma única vez. Se você quiser esperar até uma tecla ser apertada, use waitForKey().
Montando uma fechadura com senha
Agora vamos juntar as teclas apertadas em uma string e compará-la com uma senha guardada. A tecla * apaga o que foi digitado e a tecla # confirma. Se a senha estiver certa, um servo motor abre a fechadura por 3 segundos. Para a ligação do servo, veja O que é servo motor?
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}Usando com um LCD
Um display deixa muito mais fácil ver o que você está fazendo ao digitar a senha. Um LCD I2C usa só os pinos A4 e A5, então não mexe nos 8 pinos digitais do teclado. Mostre um asterisco na linha de baixo do LCD a cada tecla apertada e exiba “Open” (aberto) ou “Wrong” (errado) na linha de cima depois de confirmar. A ligação e os comandos do display estão em Como usar um display LCD I2C.
Menos pinos: teclados I2C e analógicos
Sozinho, o teclado ocupa 8 dos 20 pinos do Uno. Quando faltam pinos, há duas soluções: um adaptador I2C para teclado baseado no PCF8574 reduz o teclado a só dois fios e compartilha o barramento com um LCD. Nos teclados analógicos, cada tecla cria uma resistência diferente e o teclado inteiro é lido por um único pino analógico; ele precisa de menos fios, mas não detecta duas teclas apertadas ao mesmo tempo.
Teclado matricial com ESP32 e Raspberry Pi Pico
A biblioteca Keypad também funciona no ESP32. Como os pinos das linhas são usados como saídas e os das colunas como entradas com pull-up, evite os GPIO 34–39, que não funcionam como saída e não têm resistores de pull-up; por exemplo, escolha 13, 12, 14 e 27 para as linhas e 26, 25, 33 e 32 para as colunas. No Pico com MicroPython, você mesmo pode escrever a varredura em poucas linhas:
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)Ideias de projetos com teclado matricial
- Cofre com senha: uma caixa que abre quando o código é digitado, com servo motor, LCD e buzzer.
- Calculadora: use as teclas de A a D como as quatro operações e mostre o resultado em um LCD.
- Seletor de cores: mude a cor de um LED RGB de acordo com o número digitado.
- Painel de alarme: ative e desative com um código um alarme com sensor PIR.
- Jogo de adivinhar o número: descubra o número que o Arduino escolheu com as dicas “maior” e “menor”.
- Teclado de atalhos: transforme cada tecla em um atalho do computador com um Arduino Leonardo.
Erros comuns e como corrigir
- É lida uma tecla diferente da apertada: a ordem das linhas e colunas está invertida; inverta a ordem dos arrays rowPins e colPins.
- Nenhuma tecla é lida: o cabo flat está encaixado um pino deslocado, ou os pinos das linhas e colunas são diferentes dos do código.
- Algumas teclas nunca funcionam: um fio de linha ou de coluna está com mau contato; se todas as teclas de uma linha ou coluna falham, esse é o sinal.
- Usar os pinos 0 e 1: esses pinos são da comunicação serial pela USB; carregar o código com o teclado ligado pode falhar.
- No ESP32, algumas colunas parecem sempre apertadas: estão sendo usados os GPIO 34–39, que não têm pull-up; mude para outros pinos.
- Esperar repetição ao segurar a tecla: o getKey() informa cada toque uma vez; use o estado HOLD da biblioteca para detectar uma tecla segurada.
No fundo, um teclado matricial é só um conjunto de botões organizados em matriz; a lógica dos botões está em Como ligar um botão no Arduino. No app BlueGrays você encontra o básico dos teclados 3x4 e 4x4, um app de senha com LCD, um cofre eletrônico inteligente, uma calculadora I2C e controle de LED RGB pelo teclado, com esquemas do circuito e código.
Perguntas frequentes
Quantos pinos um teclado 4x4 usa?
Um teclado 4x4 usa 8 pinos: 4 linhas e 4 colunas. Um teclado 3x4 usa 7 pinos, e um 1x4, 5. Se faltarem pinos, você pode chegar a 2 fios com um adaptador I2C para teclado ou a um único pino analógico com um teclado analógico.
O teclado matricial precisa de resistores?
Não. A biblioteca Keypad ativa os resistores de pull-up internos do Arduino nos pinos das colunas, então você não precisa adicionar nenhum resistor. Dá para ligar o teclado direto nos pinos digitais.
Em quais pinos devo ligar o teclado?
Ele pode ir em quaisquer 8 pinos digitais; os pinos analógicos também podem ser usados como digitais. No Uno, evite os pinos 0 e 1, que são usados na comunicação serial pela USB. No ESP32, não use os GPIO 34–39, que não funcionam como saída e não têm resistores de pull-up.
Dá para detectar duas teclas apertadas ao mesmo tempo?
Sim, a função getKeys() da biblioteca Keypad detecta até 10 teclas apertadas de uma vez. Mas, em teclados de membrana sem diodos, algumas combinações de três teclas podem fazer uma tecla parecer apertada sem estar (ghosting).
Se eu mudar a senha, ela some quando faltar energia?
Uma senha guardada em uma variável volta ao valor padrão do código quando o Arduino reinicia. Se você quer que a senha nova permaneça, salve-a na EEPROM e leia de volta da EEPROM na inicialização.
Quanto dura um teclado de membrana?
Os teclados de membrana costumam durar cerca de 1 milhão de toques por tecla e, como são finos e leves, colam facilmente em uma caixa ou tampa. Eles não são totalmente protegidos contra água e poeira; ao ar livre, prefira teclados com teclas de metal ou de silicone.
Projetos para montar depois desta leitura
Ver todos os projetos
Uso do teclado matricial 3x4
O Arduino identifica na hora qual tecla você pressiona em um teclado de 12 teclas parecido com o de um telefone e a mostra na tela do computador. Os números, o asterisco e a cerquilha ficam em uma gra

Controle de LEDs com teclado matricial 3x4
Com um teclado parecido com o de um telefone, você controla três luzes separadas. As teclas 1, 2 e 3 acendem os LEDs verde, azul e amarelo; as teclas 4, 5 e 6 apagam essas mesmas luzes. O asterisco ac

Uso do teclado matricial 4x4
No teclado matricial 4x4, parecido com as teclas de um telefone, o Arduino identifica na hora qual tecla você pressionou e a mostra na tela do computador. Além dos números, ele reconhece as letras A,

Fechadura com senha, teclado 4x4 e LCD
Uma pequena fechadura eletrônica que impede a entrada de quem não sabe a senha. Você pressiona a cerquilha e digita a senha no teclado. Se estiver correta, o display indica que o acesso foi permitido,

Teclado para programar em Arduino
Se você se cansou de digitar as mesmas linhas várias vezes ao programar, este pequeno teclado matricial vira seu teclado de atalhos. Conectado ao computador, o Arduino Leonardo se apresenta como um te

Cofre eletrônico inteligente
Um pequeno cofre para guardar seus objetos de valor, que abre com uma senha. Você digita sua senha de quatro dígitos no teclado; se estiver correta, o servo motor abre a trava, a luz verde acende e o

Calculadora I2C com Arduino
Projeto de calculadora com Arduino que faz operações de adição, subtração, multiplicação e divisão usando um teclado de membrana 4x4 e um display LCD I2C 16x2. Com I2C, a conexão do display usa apenas 2 fios, reduzindo a quantidade de cabos e deixando mais pinos livres. Também permite inserir números decimais e negativos.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

