Como usar o Teclado Matricial 4×4 com Arduino 79

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 : MakerHero

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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

79 Comentários

  1. Excelente artigo. Obrigado. Estou iniciando com o arduino e gostaria de saber se é possivel utilizar esse programa no Leonardo e atribuir scancodes ás teclas e alem de verificar no monitor serial, enviar esses códigos ao PC através da porta USB, Funcionaria como um telado de PC.

    1. Olá Cláudio,

      É preciso alterar o programa, mas existe essa possibilidade sim.

      Abraços!
      Vinícius – Equipe MakerHero

  2. Muito bom!!!

    Como montar um circuito que acionado pelo teclado mostre em um display números de 1 a 9 e teclas A B C D. E com uma tecla para correção.
    Não sei se estou sendo claro? Vou dar uma exemplo: O operador digita: 1204B, essa informação aparece no display. Aí ele (operador) apaga pela tecla de correção.

    1. Olá Marcondes,

      Dá uma olhadinha nesse post aqui, ele ensina a usar o teclado junto com um display.

      Abraço!
      Rosana – Equipe MakerHero

  3. QUERO UM CIRCUITO COM UM TECLADO DE MEMBRANA PARA ACIONAR DOIS DISPLAY SIMULTANEAMENTE.

    NO TECLADO TERIA OS NÚMERO DE 0 A 9, AS LETRAS: A, B, C, D E UMA TECLA PARA CORREÇÃO

    MEU NUMERO DE CONTATO TELEFONE COM WA: (31) 99 7777 500

    MARCONDES

  4. Preciso da config para aparecer os numeros e letras do teclado, ao inves da linhaxcoluna.

  5. Primeiramente, tenho visto seus posts e realmente são práticos e muito úteis.

    Poderia ajudar-me com uma dúvida: Há um módulo que reduz a quantidade de pinos a conectar no arduino para o teclado 4×4?

    1. Paulo,

      Infelizmente é preciso utilizar os pinos completos, devido ao próprio funcionamento do teclado.

      Abraços!
      Diogo – Equipe MakerHero

  6. Top
    me ajudou muito para fazer jig para teste de tecladinho de equipamento.

    Parabéns pelos projetos que você desenvolve

    Alberto Oliveira

    Alberto Barbosa de Oliveira
  7. Será que podia programar uma bin. para mim??? ou pelo menos me xdar um caminho para eu ir replicando?

  8. amigo não entendo onde fica o positivo e negativo nesta ligação desculpa sou leigo no assunto😊mais quero aprender!

    1. Olá, Hercules!

      Basta você seguir exatamente a ligação que está lá em cima na imagem do circuito! Não tem erro 🙂

      Abraços!
      Diogo – Equipe MakerHero

  9. Você pode me explicar o que significa essa linha da programação “for (int ti = 3; ti<7; ti++)", não consegui entender

    1. Olá Rariane,

      O valor de “ti” vai ser incrementado em 1 a partir de 3 até 7.
      As linhas de código abaixo dessa vão ser aplicadas enquanto esse incremento acontecer.

      Abraço!
      Rosana – Equipe MakerHero

  10. Fiquei com uma duvida, porque a função ” imprime_linha_coluna(ti-2, 1); ” sempre vai ser ti-2 ?

    1. Olá Gustavo!

      Ali na lógica do programa a variável ti começa em 3 (por causa dos pinos que são colocados).
      Aí se ti = 3 for pressionado, na verdade foi a linha =1, que é igual a ti -2.

      Sacou?

      Abraços!

      André – Equipe MakerHero

      1. Não entendi ainda, como funciona a lógica do ti-2 quando pressiono a linha 2 ou 3 ou 4 ?

        1. Olá, Gustavo. Observe a linha “for (int ti = 3; ti<7; ti++)". Isso quer dizer que o ti começa em 3, e enquanto for menor que 7, terá o incremento de uma unidade a cada ciclo, de modo que nas linhas e colunas analisadas (como por exemplo "imprime_linha_coluna(ti-2, 1);") , a coluna se mantém e a linha vai aumentando (3-2 = 1ª linha; 4-2 = 2ª linha ; 5-2 = 3ª linha ; 6-2 = 4ª linha).

  11. É possível ligar um teclado nas portas analógicas do arduíno?

    1. Olá Edson!

      É possível sim, só é meio diferente. Ele só tem 2 estados, alto ou baixo então uma porta digital é suficiente.

      Abraços!

      André – Equipe MakerHero

  12. Muito obrigada! Você me ajudou a ganhar 35 pontos.
    Deus abençoe você.

  13. É normal ficar rodando infinita vezes no monitor serial
    linha 1 x coluna 1
    linha 1 x coluna 1
    linha 1 x coluna 1
    ?

  14. Qual foi a data de publicação deste post? gostaria de saber, pois queria colocar no tcc, seria interessante vocês colocarem a data dos post’s

  15. parabens pelo post e obrigado . gostaria de instalar igreja que vou um sistema de display 7 segmentos 3 digitos arduino + teclado matricial , colocaria 3 display em paralelo , pois quando algum irmão pede um hino, digitariamos para ficar facil , vi no mercado livre, porem se eu conseguir montar daria para igreja sem custo . vc conhece algum esquema ? eu digitaria no techado os numeros, 3 digitos e no displa 7 segmentos aparecia o numero digitado . achei alguns esquema mas com soma de numeros, acrescenta + 1 para fila, diferente do que preciso . desde ja agradeco pela atenção. Deus abencoe.

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

  17. 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 MakerHero

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

  19. Bom dia!

    Esse teclado eh compativel com o Arduino Leonardo?

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

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

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

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

  24. 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 MakerHero

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

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

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

  28. 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 MakerHero

      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 MakerHero

          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 MakerHero

      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

  29. 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 MakerHero

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

  31. 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 : https://www.resistorguide.com/pull-up-resistor_pull-down-resistor/

      Grato.

      Adilson – Equipe MakerHero

  32. 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 MakerHero

  33. 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 MakerHero

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

    1. Boa noite Enrico,

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

      Abraço.

      Adilson – Equipe MakerHero

  35. 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 MakerHero

  36. 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 MakerHero

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

  38. 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 MakerHero

  39. 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 https://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 MakerHero

  40. 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.makerhero.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 :

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

      Abraço.

      Adilson – Equipe MakerHero

    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

  41. 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 MakerHero

      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

  42. 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 : https://www.makerhero.com/display/mostrando-informacoes-de-temperatura-no-lcd-16×2-com-o-dht11/

      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 MakerHero

      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 : https://www.makerhero.com/blog/modulo-cartao-sd/

          Abraço.

          Adilson – Equipe MakerHero

Trackbacks and Pingbacks

  1. […] 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:? […]

    Como usar o Teclado Matricial 4×4 com Arduino – Eletrôinoblog