Como usar o Teclado Matricial 4×4 com Arduino

Como usar o Teclado Matricial 4×4 com Arduino

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:

//Programa : Teste teclado matricial 4x4
//Autor : FILIPEFLOP

void setup()
{
  //Pinos ligados aos pinos 1, 2, 3 e 4 do teclado - Linhas
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  
  //Pinos ligados aos pinos 5, 6, 7 e 8 do teclado - Colunas
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  
  Serial.begin(9600);
  Serial.println("Aguardando acionamento das teclas...");
  Serial.println();
}

void loop()
{
    for (int ti = 3; ti<7; ti++)
    {
    //Alterna o estado dos pinos das linhas
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(ti, HIGH);
    //Verifica se alguma tecla da coluna 1 foi pressionada
    if (digitalRead(8) == HIGH)
    {
      imprime_linha_coluna(ti-2, 1);
      while(digitalRead(8) == HIGH){}
    }

    //Verifica se alguma tecla da coluna 2 foi pressionada    
    if (digitalRead(9) == HIGH)
    {
      imprime_linha_coluna(ti-2, 2);
      while(digitalRead(9) == HIGH){};
    }
    
    //Verifica se alguma tecla da coluna 3 foi pressionada
    if (digitalRead(10) == HIGH)
    {
      imprime_linha_coluna(ti-2, 3);
      while(digitalRead(10) == HIGH){}
    }
    
    //Verifica se alguma tecla da coluna 4 foi pressionada
    if (digitalRead(11) == HIGH)
    {
      imprime_linha_coluna(ti-2, 4);
      while(digitalRead(11) == HIGH){} 
    }
   }
   delay(10);
}

void imprime_linha_coluna(int x, int y)
{
       Serial.print("Linha : ");
       Serial.print(x);
       Serial.print(" x Coluna : ");
       Serial.print(y);
       delay(10);
       Serial.println();
}

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 !

6
Como usar o Teclado Matricial 4×4 com Arduino
93 votos, 4.70 classificação média (93% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

53 Comentários

  1. Davi - 15 de fevereiro de 2017

    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); “

  2. Uellerson - 11 de novembro de 2016

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

  3. Daniel - 29 de setembro de 2016

    Bom dia!

    Esse teclado eh compativel com o Arduino Leonardo?

  4. Alexandre - 17 de maio de 2016

    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!

  5. João Bosco - 7 de abril de 2016

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

    • Jonathan Machado De Souza - 29 de agosto de 2016

      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

  6. Mauricio Alves - 1 de fevereiro de 2016

    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.

  7. Mauricio Alves - 29 de janeiro de 2016

    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.

  8. Diego Fernando - 19 de novembro de 2015

    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.

    • FILIPEFLOP - 20 de novembro de 2015

      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

  9. Gustavo Serra - 2 de novembro de 2015

    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???

  10. renato rodrigues - 2 de outubro de 2015

    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

  11. Victor Henrique - 14 de setembro de 2015

    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!

  12. michel ferrari - 26 de agosto de 2015

    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 !!!

    • FILIPEFLOP - 26 de agosto de 2015

      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

      • michel ferrari - 27 de agosto de 2015

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

        }
        }

        • FILIPEFLOP - 27 de agosto de 2015

          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

          • michel ferrari - 27 de agosto de 2015

            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 !!!

          • FILIPEFLOP - 27 de agosto de 2015

            Boa tarde Michel,

            Infelizmente não temos nada pronto nesse sentido.

            Abraço

            Adilson – Equipe FILIPEFLOP

      • Paiva - 30 de agosto de 2016

        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

  13. Victor Kawasaki - 16 de agosto de 2015

    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

    • FILIPEFLOP - 17 de agosto de 2015

      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

  14. JUNIOR - 14 de maio de 2015

    Qual resistor voce usa?
    Pode ser o 10K

  15. Nilton - 15 de abril de 2015

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

  16. Roger - 27 de março de 2015

    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?

  17. Braulio - 12 de fevereiro de 2015

    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?

  18. Enrico Leonardo Orlando - 3 de fevereiro de 2015

    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

  19. gabriel - 28 de janeiro de 2015

    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

  20. Lea - 23 de novembro de 2014

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

    • Igor Silva da Cruz - 24 de novembro de 2014

      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.

    • FILIPEFLOP - 27 de novembro de 2014

      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

  21. Igor Silva da Cruz - 12 de novembro de 2014

    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!

  22. Antônio Carlos - 29 de outubro de 2014

    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.

  23. Fernanda - 21 de outubro de 2014

    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.

  24. Marcos Paulo - 3 de outubro de 2014

    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()
    {
    }

    • FILIPEFLOP - 11 de outubro de 2014

      Boa tarde Marcos,

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

      http://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

    • Gustavo Serra - 7 de fevereiro de 2016

      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

  25. José Lucas de Lima Pereira - 13 de agosto de 2014

    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.

  26. luan medeiros - 13 de agosto de 2014

    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

Deixe uma resposta