Componentes · 5 min de leitura

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).

Teclado matricial de membrana 4x4
Teclado de membrana 4x4: dígitos de 0 a 9, letras de A a D e as teclas * e #; o cabo flat na parte de baixo tem 8 pinos.

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.

TipoTeclasPinosUso típico
Membrana 4x416 (0–9, A–D, *, #)8Senhas, menus, calculadoras
Membrana 3x412 (0–9, *, #)7Digitação de números como no teclado de um telefone
Membrana 1x445Menus 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 tecladoFunçãoArduino 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
Se apertar 1 dá D e apertar 4 dá C, a ordem das linhas e colunas está invertida. Em vez de refazer a ligação, basta inverter a ordem dos arrays rowPins e colPins no código.

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:

C++ (Arduino IDE)
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?

C++ (Arduino IDE)
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 fechadura é para aprendizado e projetos de hobby. Para uma porta de verdade, adicione um tempo de bloqueio depois de algumas tentativas erradas, guarde a senha na EEPROM em vez de deixá-la como texto puro no código e coloque a eletrônica onde ninguém consiga alcançar pelo lado de fora.

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:

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)

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.

Ver todos os projetos
Uso do teclado matricial 3x4
#61Iniciante

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

4.5(24)
31
Controle de LEDs com teclado matricial 3x4
#62Intermediário
Premium

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

4.6(29)
38
Uso do teclado matricial 4x4
#63Iniciante
Premium

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,

4.5(27)
35
Fechadura com senha, teclado 4x4 e LCD
#64Avançado
Premium

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,

4.8(59)
75
Teclado para programar em Arduino
#65Intermediário
Premium

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

4.7(40)
52
Cofre eletrônico inteligente
#92Avançado
Premium

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

4.7(42)
63
Calculadora I2C com Arduino
#94Intermediário
Premium

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.

5.0(31)
43