Como usar o Teclado Matricial 4×4 com Arduino 54

Este Teclado Matricial 4×4 é um componente do Arduino muito utilizado para entrada de dados. Ele possui 16 teclas dispostas em 4 linhas x 4 colunas, e um conector de 8 pinos para ligação:

Teclado matricial membrana 4x4

Pinagem Teclado Matricial 4X4:

Internamente são 16 teclas push-buttons tipo membrana dispostos na configuração abaixo em um formato keypad. Conforme a tecla é pressionada, é feita a conexão entre a linha e a coluna correspondentes. Se pressionarmos a tecla A no teclado matricial, será feita a conexão entre os pinos 1 (linha 1) e 8 (coluna 4), se pressionarmos a tecla 7, será feita uma conexão entre os pinos 3 (linha 3)  e 5 (coluna 1), e assim por diante:

Teclado matricial - Linhas x Colunas

 Conectando Teclado Matricial ao Arduino:

Neste tutorial vamos utilizar 8 portas do Arduino para ligação ao teclado matricial, sendo 4 para as linhas, e 4 para as colunas. Os pinos das linhas deverão ser configurados como OUTPUT (Saída), e os pinos das colunas como INPUT (Entrada). Nos pinos referente às colunas, vamos utilizar 4 resistores pull-down, mantendo-as em nível baixo quando não houver acionamento das teclas:

Teclado matricial - Circuito

Programando o Arduino para mapeamento das teclas:

No programa, primeiro definimos todos os pinos das linhas como saída (pinos 3, 4, 5 e 6), e os pinos de colunas como entrada (pinos 8,9,10 e 11). Um loop se encarrega de colocar cada pino de saída (linhas) em estado alto (HIGH), e verificar se alguma tecla foi pressionada, por meio de um comando IF para cada coluna. Caso isso aconteça, é gerada uma saída no serial monitor com a informação correspondente à qual tecla foi pressionada no teclado matricial:

Configuramos o programa para mostrar a informação Linha x Coluna da tecla pressionada. Carregado o programa no Arduino, abra o serial monitor e acione as teclas, e você terá um resultado como esse abaixo:

Teclado matricial - Serial monitor

Com a posição das teclas, é possível configurar o teclado para exibir os caracteres que você desejar, ou até mesmo acionar outras portas do Arduino,  já que , como comentamos no início, o teclado nada mais é do que uma série de push-buttons dispostos em forma de matriz.

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP !

Posts Relacionados

54 Comentários

  1. Comprei esse teclado do seu site, um display 16×2 e um leitor rfid. Gostaria de saber se vc tem alguma imagem e programação de como poderia ligar o teclado e o display ao arduino,para quando apertasse no teclado, o texto fosse mostrado no display. Agradecido

    1. Boa tarde Luan,

      Você pode juntar o post do RFID com esse explicando como mostrar informações no display LCD : http://blog.filipeflop.com/display/mostrando-informacoes-de-temperatura-no-lcd-16×2-com-o-dht11.html

      Use os comandos lcd.print para enviar as informações para o display também, tanto as informações do teclado, como as informações do RFID. Experimente colocar os comandos lcd.print logo depois dos comandos Serial.print, por exemplo.

      Abraço.

      Adilson – Equipe FILIPEFLOP

      1. Olha, muito obrigado viu, vou tentar unir esses dois projetos em um só. Preciso que funcione assim: Digitando um valor nesse teclado o valor seja mostrado no lcd conectado ao arduino, e quando uma TAG RFID passe pelo leitor tambem conectado ao arduino ele vá mostrando no display tambem, mas armazenando no arduino para ir somando os valores da TAG. VocÊ sabe como poderia ser feito esse armazenamento?
        Obrigado pela ajuda, continuarei comprando e lendo do Felipeflop

        1. Boa noite Luan,

          Você pode gravar esses dados num cartão SD. Dê uma olhada nesse artigo : http://blog.filipeflop.com/modulos/modulo-cartao-sd.html

          Abraço.

          Adilson – Equipe FILIPEFLOP

  2. Felipe,

    Eu gostaria de saber como formar e armazenar em uma variável um número composto (4 dígitos). Por favor, é muito importante e parabéns pelo post.

    Abraços,

    José Lucas.

    José Lucas de Lima Pereira
    1. Boa tarde,

      Você está usando esse teclado e quer armazenar os 4 números que foram digitados em uma variável ?

      Adilson – Equipe FILIPEFLOP

      1. Boa Tarde,

        Eu preciso exatamente da resposta a essa pergunta que você fez…..

        Estou fazendo um código usando o ATMEGA32 para configurar um teclado matricial onde preciso armazenar 3 valores em uma variavel a ser apresentada em um LCD….

        Pode me ajudar???

    2. Voce pode tentar concatenar uma variavel que recebe o valor digitado com a que vai armazenar o valor total

  3. Boa Tarde!
    Comprei um kit arduino Uno, teclado membrana 4×4, lcd 16×2 e sensores pid com vcs para fazer um sistema de alarme, mas estou com algumas dificuldades. Será q vcs podem me ajudar?

    1- Tenho um código (abaixo) que era para comparar uma senha digitada e liberar o acesso, mas não está aceitando a senha correta, só da senha incorreta.

    2- Queria que verificasse a senha digitada com uma gravada na EEPROM e liberasse o acesso e também que pudesse altera-lá.

    3- Como faço para o Arduino enviar uma mensagem de alerta para um celular?

    Código:

    #include
    #include
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //three columns
    char keys[ROWS][COLS] = {{‘1′,’2′,’3′,’A’},
    {‘4′,’5′,’6′,’B’},
    {‘7′,’8′,’9′,’C’},
    {‘*’,’0′,’#’,’D’}};
    byte rowPins[ROWS] = {5, 3, 4, 6}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {15, 16, 14, 19}; //connect to the column pinouts of the keypad

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    LiquidCrystal lcd(12, 11, 2, 7, 8, 9);
    int contador = 0;
    char senha [] = {‘2′,’5′,’4′,’3’,”};
    char teste[] = {‘0′,’0′,’0′,’0’,”};
    void setup()
    {
    lcd.begin(16, 2);
    lcd.print(“Digite a Senha”);
    }
    void loop()
    {
    char key = keypad.getKey();
    if(key == ‘*’)
    {
    limpaLinha(1);
    contador=0;
    }
    else if(key)
    {
    lcd.setCursor(0,0);
    lcd.print(“Digite a Senha”);
    lcd.setCursor(contador,1);
    lcd.print(‘*’);
    delay(500);
    teste[contador] = key;
    contador++;
    }
    if (contador == 4)
    {
    teste[contador] = ”;
    if ((teste[1]== senha[1]) && (teste[2]== senha[2]) && (teste[3]== senha[3])&& (teste[4]== senha[4]))
    {
    lcd.clear();
    lcd.print(“Senha correta”);
    delay(2000);
    contador = 0;
    lcd.clear();
    lcd.print(“Digite a Senha: “);
    delay(2000);
    LigaAlarme();
    }
    else
    {
    lcd.clear();
    lcd.print(“Senha incorreta”);
    delay(2000);
    contador = 0;
    lcd.clear();
    lcd.print(“Digite a Senha: “);
    }
    }

    }
    void limpaLinha(byte linha)
    {
    lcd.setCursor(0, linha);
    lcd.print(” “);
    }
    void LigaAlarme()
    {
    }

    void DesligaAlarme()
    {
    }

    1. Boa tarde Marcos,

      Para enviar a mensagem para um celular, você precisa de um módulo GSM como esse :

      https://www.filipeflop.com/pd-77833-gsm-gprs-shield-para-arduino-efcom-sim900-antena.html

      Quantos aos outros itens, faça um teste enviando para o Serial Monitor a senha digitada, assim você consegue verificar o que está acontecendo.

      Com relação à EEPROM, por favor verifique esse artigo no site oficial do Arduino, que fala sobre ler e gravar informações na EEPROM :

      http://arduino.cc/en/Reference/EEPROM

      Abraço.

      Adilson – Equipe FILIPEFLOP

    2. Boa noite amigo,

      Estudei e fiz teste no seu código e descobri que o valor do contador está errado; quando se aperta um botão (KEY) ele automaticamente está começando com o valor correspondente ao caractere digitado e vai somando um (++) normalmente; por exemplo, se a primeira tecla apertada for “1”, o contador será 48, 49, 50……etc; se a primeira tecla apertada for o 3, ele ficará, 50, 51, 53……etc. Como isso, sua comparação de senha não funciona.

      Eu ainda não consegui arrumar isso, caso vc ache o problema, por favor, me avise que precisarei também.

      att,
      Gustavo

  4. Boa Tarde, estou tentando fazer um controle de acesso pelo teclado, porém não estou obtendo sucesso, vocês poderiam me ajudar? Estou fazendo me baseando no circuito desse site http://arduinobymyself.blogspot.com.br/2012/03/arduino-sistema-de-seguranca-controle.html
    Obrigada.

    1. Boa noite Fernanda,

      Podemos tirar dúvidas relacionadas ao circuito e programa apresentados aqui no site.

      Grato.

      Adilson – Equipe FILIPEFLOP

  5. Me ajudem por favor….

    Estou fazendo um sistema onde deverá solicitar ao usuário um valor de distância em cm via teclado matricial. No projeto deve ser usado um sensor LV MaxSonar EZ1, um display LCD e um teclado matricial 4×3. Usando um microcontrolador ATmega16, me ajudem com a linguagem de programação.

    1. Boa tarde Antônio,

      Não temos nenhum artigo abordando essa configuração.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  6. Olá pessoal, como o blog mesma fala esse teclado eh uma sequencia de push-buttons, entao estou tentando montar um mural de 8 linhas x 16 colunas com switchs.

    # esse mesmo codigo acima pode ser usado nesse meu mural?
    # esse codigo suportaria informar caso tivesse mais de uma botao precionado?
    # tem algum codigo que vcs conheçam que faça isso?

    # comprei alguns CIs 4051 Mux/Dex para diminuir a quantidade de pinos, se alguem tiver uma sujestao de codigo ou esquema ..
    Grato!

  7. olá, como faço para ligar o fio azul da entrada digital 8? preciso colocar dois fios no mesmo buraco da protoboard?

    1. a imagem eh so uma representação da protoboard…
      os pinos de (energia fazem contatos horizontais) e os (demais na vertical), sendo assim no pino onde o fio azul se encontra pode estar armengado os dois fios no mesmo pino ou simplesmente no primeiro e saindo de qualquer um dos 4 pinos respectivos abaixo dele.

    2. Boa noite Leandro,

      Não, utilize as “linhas” da protoboard para fazer a conexão. Coloque os 2 fios na mesma linha vertical.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  8. ola sou novo em arduino queria saber como eu faço para cadastra mais de um cartão,isso sera utilizado para entra e saída de um condomínio junto com teclado com senha

    1. Boa noite Gabriel,

      Você está utilizando qual tipo de cartão ?

      Adilson – Equipe FILIPEFLOP

  9. Cara vc poderia me explicar uma coisa? pq um eh INPUT e o outro eh OUTPUT e não somente INPUT?

    É só uma dúvida mesmo

    Muito obrigado, seu blog está me ajudando bastante

    Enrico Leonardo Orlando
    1. Boa noite Enrico,

      As teclas funcionam como “chaves”, conectando uma saída (OUTPUT) à uma entrada (INPUT).

      Abraço.

      Adilson – Equipe FILIPEFLOP

  10. Ola, fiz conforme tutorial e a unica coisa que aparece é o numero 1….mesmo apertando outras teclas nao aparece nada. Alguem sabe o que pode ser?

    1. Bom dia,

      Tente inverter a linha 1 com a 2 e a coluna 5 com a 6 para ver se o problema permanece.

      Grato.

      Adilson – Equipe FILIPEFLOP

  11. Olá! Eu comprei esse teclado na loja para utilizar juntamente com a Raspberry, mas estou com dúvidas. Lá é só converter essas ligações para os pinos correspondentes no Rasp?

    1. Boa noite Roger,

      Sim, ele funciona no esquema de acionamento linhas x colunas. Você só precisa setar os pinos correspondentes no Raspberry.

      Grato.

      Adilson – Equipe FILIPEFLOP

  12. Ola muito interessante o post …
    Mas como faço para definir o valor do resistor “push down” ?

    1. Boa noite Nilton,

      Isso vai depender do circuito utilizado. Recomendo a leitura deste artigo : http://www.resistorguide.com/pull-up-resistor_pull-down-resistor/

      Grato.

      Adilson – Equipe FILIPEFLOP

  13. Qual resistor voce usa?
    Pode ser o 10K

  14. Olá,

    Realizei o circuito acima e funcionou perfeitamente. Parabéns pelo post.

    Gostaria de saber se é possível ler o acionamento de duas teclas ao mesmo tempo, por exemplo: se eu manter pressionado a tecla 1 e apertar a tecla 5 , o valor que retorna é só o da primeira tecla, enquanto não soltá-la nenhum outro valor é mostrado. Quero que apareça valor 1 e 5, tem como?

    Obrigado,

    Victor Kawasaki

    1. Bom dia Victor,

      Realmente o programa fica parado, usei o comando while(digitalRead(porta) == HIGH){} para isso.

      Você pode retirar esse while, e alterar o programa para que ele leia, por exemplo, 2 teclas, e depois pare o processamento enquanto as teclas não forem liberadas.

      Abraço

      Adilson – Equipe FILIPEFLOP

  15. Olá Amigos !!! tenho um teclado do tipo membrana e preciso de ajuda em um código. O código acima funciona perfeitamente para número de 0 até 9, porém quando eu quero digitar por exemplo 123, estes ficam separados, tipo, 1, 2 e 3. Como eu faria para agrupar esses números e colocá-los numa variável que possa ser lida posteriormente como número ? Aguardo a ajuda de algum iluminado. Grande Abraço à todos !!!

    1. Boa tarde Michel,

      Você pode simplesmente “somar” o valor lido de cada tecla, usando strings, por exemplo:

      String1 = “1”;
      String2 = “2”;
      String3 = “3”;
      String_agrupada = String1 + String2 + String3;
      Serial.println(String_agrupada);

      O resultado final exibido no Serial Monitor será 123, como você precisa. Claro, você precisa programar quantos dígitos você vai precisar, porque nesse exemplo que eu mostrei, para obter o número 1 você vai precisar de 3 digitos: 001. Outra opção é você utilizar um caractere para indicar o final do número que você está digitando, como a cerquilha (#), por exemplo.

      Abraço

      Adilson – Equipe FILIPEFLOP

      1. Olá Adilson !!! Muito obrigado pela pronta resposta. Veja, testei o código que você me indicou mas obtive um problema. Eu peguei a variável que armazena o valor em número e coloquei no lugar dos valores 1, 2 e 3 que você me indicou. Quanto subi o programa quando eu pressiono a tecla 1 do teclado não acontece nada, porém quando eu pressiono as outras teclas, elas geram múltiplos de 3, por exemplo se eu pressiono 2, aparece sempre 6 e se eu pressiono 9 aparece sempre 27. Não sei se fiz errado, mas segue o código que eu fiz, se você puder me ajudar eu agradeceria muito pois estou há vários dias me matando com isso hauhauhau. Grande Abraço !!!

        #include
        const byte ROWS = 4; //quatro linhas
        const byte COLS = 4; //quatro colunas
        //define simbolos do teclado
        char hexaKeys[ROWS][COLS] =
        {
        {‘1’, ‘2’, ‘3’, ‘A’},
        {‘4’, ‘5’, ‘6’, ‘B’},
        {‘7’, ‘8’, ‘9’, ‘C’},
        {‘*’, ‘0’, ‘#’, ‘D’}
        };
        byte rowPins[ROWS] = {2, 3, 4, 5}; //ligar as linhas do teclado
        byte colPins[COLS] = {6, 7, 8, 9}; //ligar as colunas do teclado
        //inicie o NewKeypad
        Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

        void setup()
        {
        Serial.begin(9600);
        }

        void loop() {

        char customKey = customKeypad.getKey();
        int numero;
        if (customKey != NO_KEY)
        {
        numero = customKey – 48; // converte o texto em número.
        //Serial.print(customKey);
        // Serial.print (numero);

        int String1 = numero;
        int String2 = numero;
        int String3 = numero;
        int String_agrupada = String1 + String2 + String3;

        Serial.println(String_agrupada);

        }
        }

        1. Bom dia Michel,

          O problema é que você está atribuindo à String1, 2 e 3 o mesmo valor, o mesmo número que você está lendo do teclado, então ele está fazendo a soma dos 3 valores. Por exemplo, se vc digitar 2 no teclado, na saída irá gerar o número 6. Se digitar 4, vai aparecer 12. Você também está misturando o char que é lido do teclado, com um número inteiro, e precisa definir com qual vai trabalhar: char, string ou inteiro.

          E essa atribuição do numero à string tem que ser feita uma à uma. Quando vc digita o primeiro caractere, ele atribui à String1, quando vc digita o segundo caractere, ele atribui à String2, faça a mesma coisa com a String3 e depois efetue a “soma” das strings. Elas não podem ficar todas dentro de um IF só, como você fez no programa.

          Abraço

          Adilson – Equipe FILIPEFLOP

          1. Olá Adilson !!! Infelizmente não consigo entender como posso fazer isso. Já tentei de tudo o que é jeito mas tem coisas que pra mim realmente são difíceis. Meus conhecimentos são limitados e não estou achando outra maneira de conseguir o que preciso para esse projeto. Será que você não tem nenhum exemplo prático e bem simples para postar aqui para que eu possa rodar e entender melhor o que preciso fazer ? Por favor, preciso muito resolver esse problema.
            Grande Abraço !!!

            michel ferrari
          2. Boa tarde Michel,

            Infelizmente não temos nada pronto nesse sentido.

            Abraço

            Adilson – Equipe FILIPEFLOP

      2. Boa Noite! E se for um número quebrado? estou tentando desenvolver uma fonte digital de bancada, e preciso digitar valores como 3.3, 9.7, e etc… Como fazer isso? E a segunda pergunta Nesse código diz como mostrar o valor de cada tecla. Como faço pra digitar um VALOR qualquer e usar ele numa variável? exemplo: 3.3

  16. Cara, muito boa sua explicação! ja dei 5 estrelas!
    Mas sou novo usando o arduino… Teria como você me passar um exemplo de como usar esse teclado para acionar um led por exemplo ? Tipo você apero o numero 1 e ele liga uma porta do arduino, deve ser simples mais não consigo… Obrigado!

  17. boa noite eu preciso informar ao arduino um numero digitado em um teclado para controle de passos em um motor de passo, mas estou com duvidas de como irei fazer, vcs podem me informar alguma programação que faca algo parecido?? obrigado

  18. Oi 🙂

    Eu comprei vários equipamentos com vocês, incluindo este teclado de membrana (matriz); eu consegui fazer rodar seu código corretamente, mas eu não consigo transformar o valor impresso no seria no valor correto, ou seja, de “linha 1 coluna 1” em “1”; de “linha 1 coluna 2” em “2”. ETC
    Eu preciso criar uma variável de matriz para transformar no valor real do teclado no monitor do serial e ,depois, utilizar esse valor como variável em outras funções/cálculos.
    Aqui nos comentários tem alguns exemplos dessas “variáveis matrizes”, só que nenhum funciona, todas dão erro programa do Arduíno.

    Vocês conseguem me ajudar em como montar essa “variável matriz” e depois em como utilizar esses valor em outras funções/cálculo???

  19. Ola. Eu queria saber se você tem um programa que funcione com um teclado matricial 4×4 e 2 led sendo um deles vermelho e um verde, para entrada de senha de quatro dígitos?
    Seria muito bom se resolvesse essa pra mim pois estou usando a mesma montagem do site e não consigo o programa. Obrigado.

    1. Boa tarde Diego,

      Não temos um programa pronto para essa configuração. A nossa sugestão é que você utilize as informações do post, fazendo as adequações ao seu projeto.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  20. ola, muito bom esse projeto!.
    preciso de ajuda.
    estou com um projeto meio complicado e estou com dificuldade no código. Poderia me informar como faço para fazer um teclado matricial com uma porta analógica? usando 8 pinos digitais como saída e um analógico como entrada. na porta analógica lerá três tipos diferentes de tensão. preciso fazer a varredura nas portas digitais e quando chegar a tensão no pino analógico ao apertar o botão saber qual pino digital estar sendo usado.
    parece meio esquisito, mas é só nessa parte que estou com dificuldade. o teclado que estou fazendo tem mais de 80 teclas e essa duvida acima é só a parte que preciso saber, pois a parti dela consigo desenvolver o resto.
    se puder me ajudar ficarei muito agradecido.

  21. ola, bom dia!
    Felipe! você teria alguma dica ou algum post para um teclado matricial analógico que usa 4 pinos digitais como saída (ou mais de 1 ) e dois pinos analógico como entrada( ou mais)?? tipo cada pino digitai é ligado em três botoes e na saída de cada um deles sai um valor de tensão diferente por causa do divisor de tensão, e será lido pelo pino analógico correspondente. não estou conseguindo fazer a alternância nas saídas dos pinos digitais de forma que o pino analógico leia e mande algo na serial.
    se puder me ajudar agradeço muito.

  22. Boa noite!
    Estou utilizando o mesmo código o mesmo teclado, porem só funciona quando eu tiro o resistor. alguém sabe me dizer o por que? corro o risco de queimar meu arduivo se não utilizar os resistores?

    agradeço desde já pela atenção.!!!

    1. Esses sao resistores de PULL DOWN (procure pra ver o que são melhores) , eles ervem pra garantir que tera 0 na entrada quando nao estiverem acionadas , geralmente são de valores altos, de 10k pra cima, as vezes o valor estava muito baixo

      Jonathan Machado De Souza
  23. Estou querendo usar o teclado matricial 4×4 pra entrar variáveis num PIC que programarei em linguagem ladder através do ldmicro. Alguém pode me dizer como configuro o teclado para tal tarefa?
    Obrigado!

  24. Bom dia!

    Esse teclado eh compativel com o Arduino Leonardo?

  25. Por que não foi necessário utilizar um debouncer?

  26. Uma observação no começo deste esta escrito ” No programa, primeiro definimos todos os pinos das linhas como entrada (pinos 3, 4, 5 e 6), e os pinos de colunas como saídas (pinos 8,9,10 e 11). ”
    Mas na programação esta :
    “void setup()
    {
    //Pinos ligados aos pinos 1, 2, 3 e 4 do teclado – Linhas
    pinMode(3, OUTPUT); //O correto nao seria INPUT(ENTRADA)?
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);

    //Pinos ligados aos pinos 5, 6, 7 e 8 do teclado – Colunas
    pinMode(8, INPUT);//OUTPUT(SAIDA)?
    pinMode(9, INPUT);
    pinMode(10, INPUT);
    pinMode(11, INPUT); “

    1. Boa tarde Davi,

      O programa está correto. Estava invertido no texto. Já corrigi. Obrigado! 🙂

      Abraço.

      Adilson – Equipe FILIPEFLOP

  27. olá amigo, estou iniciando com arduino ,
    vi que na imagem vc usa um arduino uno, aqui estou usando o mega2560. estou usando pin33,34,35,36 como output e pin38,39,40,41 como input.
    a pergunta é: quando eu vou compilar me aparece a mensagem ,
    “‘PinMode’ não pode ser usado como uma função”
    tem alguma coisa que estou fazendo errado , ou que falta na programação.
    obrigado.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *