27 agosto 2013

Shield LCD 16x2 com Keypad

O shield LCD 16x2 com Keypad (teclado) é um componente útil se quisermos montar algum tipo de painel que necessite de entrada de dados ou controle por meio de botões. Pode ser utilizado para digitar uma senha, selecionar uma opção em um menu ou até mesmo controlar os passos de um robô. As aplicações são diversas e você pode adquirir o seu diretamente na Loja FILIPEFLOP.

shield lcd 16x2 Arduino

Este shield possui um display LCD 16x2 com backlight (luz de fundo) azul, e 5 botões customizáveis, além de um botão de reset do Arduino. O ajuste do contraste é feito pelo parafuso do trimpot/potenciômetro acima do display, à esquerda (em azul). Além disso, a placa possui furos para soldagem de barras de pinos, cuja função veremos em breve.

O shield utiliza alguns pinos diferentes dos que usamos normalmente nos projetos para ligar um LCD. Se na ligação de um LCD 16x2, como mencionado no artigo Display Lcd Winstar WH1602A, eu tenho total liberdade para trocar as portas ligadas ao display, nesse shield teremos que usar a seguinte sequência ao inicializar a biblioteca LiquidCrystal :

LiquidCrystal lcd(8,9,4,5,6,7); 

Desta forma, temos a seguinte relação entre os pinos do Arduino e os sinais do display :

Ligacao Arduino - Display LCD Keypad

Os botões do shield usam uma única porta analógica, A0. Repare na ilustração abaixo que o shield usa uma associação de resistores para determinar qual botão foi pressionado, e com isso há uma grande economia de portas digitais do Arduino :
Circuito resistores - botões shield keypad

Isso tudo faz com que, obviamente, não possamos utilizar essas portas para outras funções enquanto estivermos utilizando o shield. Note no detalhe das imagens abaixo, que a placa possui furos que permitem a soldagem de uma barra de pinos ou conectores, com isso podemos usar os pinos que sobraram : 0, 1, 2, 3, 11, 12, 13 (digitais), e A1, A2, A3, A4, A5 (analógicos), além dos pinos de energia (5v, 3.3v, GND). O pino 10 também é utilizado pela placa para uma função específica, no caso o backlight, e não deve ser utilizado nos programas. 

Detalhe portas digitais

Detalhe portas analogicas e energia shield keypad

Para o programa de teste, não é necessário o uso de nenhuma biblioteca especial. Usaremos a já conhecida LiquidCrystal, e para determinar qual botão foi pressionado, faremos a leitura da porta analógica A0 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Programa : Teste LCD 16x2 com Keypad
// Autor : Arduino e Cia
  
#include <LiquidCrystal.h>  
  
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  
  
void setup()   
{  
 lcd.begin(16, 2);  
 lcd.setCursor(0,0);  
 lcd.print("Arduino e Cia");  
 lcd.setCursor(0,1);  
 lcd.print("Tecla :");  
}  
  
void loop()  
{  
 int botao;  
 botao = analogRead (0);  //Leitura do valor da porta analógica A0
 lcd.setCursor(8,1);  
 if (botao < 100) {  
  lcd.print ("Direita ");  
 }  
 else if (botao < 200) {  
  lcd.print ("Cima    ");  
 }  
 else if (botao < 400){  
  lcd.print ("Baixo   ");  
 }  
 else if (botao < 600){  
  lcd.print ("Esquerda");  
 }  
 else if (botao < 800){  
  lcd.print ("Select  ");  
 }  
}

49 comentários:

  1. No LCD quando eu aperto pra cima aparece -Direita-, o que está errado?

    ResponderExcluir
    Respostas
    1. Bom dia. Provavelmente alguma ligação está invertida. O que acontece quando vc aperta a tecla da direita ? O que aparece ? Abraço.

      Excluir
    2. diminua o valor de 100 para 80 que funciona

      Excluir
  2. A ligação do LCD eu coloquei encaixado direto em cima do arduino UNO R3. Quando eu aperto pra cima aparece -direita- e quando eu aperto o botão da direita aparece -direita- mesmo, só o botão pra cima que está dando errado, muito esquisito, não vejo sentido, e testei com dois LCDs novinhos do modelo LCD1602 e deu a mesma coisa, esquisito isso, abraço!

    ResponderExcluir
    Respostas
    1. Esquisito mesmo. O modelo do seu LCD é igual ao do post ?

      Excluir
    2. Isso acontece comigo tbm usando a shield Lcd idêntico a esse da foto

      Excluir
    3. diminua o valor de 100 para 80 que funciona

      Excluir
  3. Sim, exatamente igual.

    ResponderExcluir
    Respostas
    1. Entendi. Pode estar ocorrendo alguma diferença de valor nos resistores internos. O ideal seria você ir alterando o programa até achar o valor ideal para o seu display. Tente alterar esse valor de "200" nessa parte do programa :

      else if (botao < 200) {
      lcd.print ("Cima ");
      }

      Abraço.

      Excluir
    2. Fui tentar aqui e tbm deu este mesmo problema: a tecla de cima aparece ''direita''.

      Excluir
    3. Boa tarde,

      Tente alterar o valor do resistor, conforme eu mostrei acima.

      Abraço !

      Excluir
    4. diminua o 100 para 95 ou menos

      if (botao < 100) {
      lcd.print ("Direita ");

      Excluir
    5. fiz isso e deu certinho , alterei o valor de 100 para 95 .vlw

      Excluir
    6. Galera, pelo fato de estar utilizando uma porta analógica, no caso A0, o que determina a valor, é a diferença de resistência. Nesse caso, quando os microbotoes ficam um tempo parados, eles acabam criando uma película de oxidação, fazendo com que a a resistência se altere. Há 3 maneiras de resolver.
      1. Limpa contatos. Esse produto remove a película e oxidação.
      2. Alterar o valor no sketch: funciona mas não é recomendável, tendo em vista que você está apenas se adaptando ao problema e não resolvendo, a resistência da oxidação varia com o tempo e você sempre terá que alterar o sketch.
      3. substitua os microswitches por outros, dê preferência que venham novos e bem condicionadas, essa é a prática correta.
      Vale lembrar que quando falamos de microcontroladores, não devemos pensar apenas como programadores, mas temos que ter uma visão da hardware, principalmente.
      Abraços.

      Excluir
  4. Cara tenho o display ele funciona tudo certinho
    mais pra trocar de tela eu tenho que fica com o botao apertado , e eu soltar ele some

    alguem sabe o que e ?

    ResponderExcluir
    Respostas
    1. Bom dia Tremendeiro. O que você quer dizer com "trocar de tela", e qual tecla você tem que manter apertada ? Abraço.

      Excluir
  5. Boa noite amigo
    tenho um lcd keypad shield igual a sua, comprada no dx. estava pesquisando sobre ela e achei uma discussão que fiquei em duvida, você sabe algo sobre esse defeito da shield?

    http://forum.arduino.cc/index.php?PHPSESSID=vo7ar5ar8rajnlpg55keonqng2&topic=96747.0

    ResponderExcluir
    Respostas
    1. Boa tarde José. Sim, eu já tinha visto isso, inclusive no artigo eu menciono que o pino 10 não deve ser utilizado. Abraço !

      Excluir
  6. O meu não faz absolutamente nada, tentei mudar as portas e nada! Conecto ele sobre o arduino mega 2560 ele liga mas não tem mensagem nenhuma, fica somente umas barras como se ele estivesse carregado. sabe o que é?
    abracos

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Por ser um shield, não tem muita coisa que se possa mexer em termos de pinos. Você consegue testar esse LCD em um Arduino Uno ?

      Abraço !

      Excluir
  7. Precisa usar fios para conectar o LCD no arduino? Ou é só juntar os 2 e já posso fazer a programação?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Não precisa de fios. Esse LCD é um shield. Basta encaixar no Arduino e seguir com a programação.

      Abraço !

      Excluir
  8. bom dia.

    Alguém sabe me informar aonde consigo a biblioteca LiquidCrystal.h?
    Grato.

    ResponderExcluir
    Respostas
    1. Bom dia,

      A LiquidCrystal já está inclusa na IDE do Arduino.

      Abraço !

      Excluir
  9. Fiz o seguinte código no entanto as leituras ficam estáticas alguma dica ?

    #include
    #include
    #include
    DS1307 rtc(A14, A15);
    #define DHTPIN A8
    #define DHTTYPE DHT11
    DHT dht(DHTPIN, DHTTYPE);
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    byte grau[8] ={ B00001100,
    B00010010,
    B00010010,
    B00001100,
    B00000000,
    B00000000,
    B00000000,
    B00000000,};

    void setup()
    {
    lcd.begin(16, 2);
    lcd.setCursor(0,0);
    lcd.print("Kalmmon");
    lcd.setCursor(0,1);
    lcd.print("Tecla :");
    rtc.halt(false);
    rtc.setSQWRate(SQW_RATE_1);
    rtc.enableSQW(true);
    lcd.createChar(0, grau);
    }

    void loop()
    {
    int botao;
    botao = analogRead (0); //Leitura do valor a porta analógica A0
    lcd.setCursor(8,1);
    if (botao < 100) {
    lcd.clear(); //Limpa o LCD
    lcd.setCursor(0,0);
    lcd.print("Hora : ");
    lcd.print(" ");
    lcd.print(rtc.getTimeStr());
    lcd.setCursor(0,1);
    lcd.print("Data : ");
    lcd.print(" ");
    lcd.print(rtc.getDateStr(FORMAT_SHORT));
    lcd.print(" ");
    lcd.println(rtc.getDOWStr(FORMAT_SHORT));

    }
    else if (botao < 200) {
    lcd.print ("Cima ");
    }
    else if (botao < 400){
    lcd.print ("Baixo ");
    }
    else if (botao < 600){
    lcd.clear(); //Limpa o LCD
    float h = dht.readHumidity(); //Le o valor da umidade
    float t = dht.readTemperature(); //Le o valor da temperatura
    lcd.setCursor(0,0);
    lcd.print("Temp : ");
    lcd.print(" ");
    lcd.setCursor(7,0);
    lcd.print(t,1);
    lcd.setCursor(12,0);

    //Mostra o simbolo do grau formado pelo array
    lcd.write((byte)0);

    //Mostra o simbolo do grau quadrado
    //lcd.print((char)223);

    lcd.setCursor(0,1);
    lcd.print("Umid : ");
    lcd.print(" ");
    lcd.setCursor(7,1);
    lcd.print(h,1);
    lcd.setCursor(12,1);
    lcd.print("%");
    }
    else if (botao < 800){
    lcd.print ("Select ");
    }

    }

    ResponderExcluir
    Respostas
    1. Boa noite Kalmmon,

      Ele não atualiza nada ? Tente separar o programa em partes menores, testando cada componente de forma isolada, para ver qual dele está interferindo no funcionamento.

      Abraço !

      Excluir
  10. Pessoal, copiei o sketch do tutorial acima e esta dando ERROR COMPILING:

    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp: In member function 'int I2CIO::begin(uint8_t)':
    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp:61: error: 'Wire' was not declared in this scope
    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp: In member function 'uint8_t I2CIO::read()':
    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp:117: error: 'Wire' was not declared in this scope
    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp: In member function 'int I2CIO::write(uint8_t)':
    C:\Users\servicos\Documents\Arduino\libraries\LiquidCrystal\I2CIO.cpp:140: error: 'Wire' was not declared in this scope

    Alguem sabe o que pode ser?

    ResponderExcluir
    Respostas
    1. Boa tarde Adilson,

      Essa biblioteca que você está usando é a da I2C. Tente usar a biblioteca LiquidCrystal que ja vem com o Arduino.

      Abraço !

      Excluir
  11. Olá , como faço para desligar a luz de funda shield??

    ResponderExcluir
    Respostas
    1. Boa tarde Daniel,

      Estou sem o display aqui no momento, mas vou pesquisar e atualizar o post.

      Abraço !

      Excluir
  12. BOA TARDE, o comando '>' faz ir para direita e certamente '<' para esquerda como faço para parar ?

    ResponderExcluir
  13. Boa tarde,

    você pode configurar a tecla SELECT para fazer isso ou ainda programar as teclas '>' e '<' para funcionarem somente enquanto o botão estiver sendo pressionado.

    Abraço !

    ResponderExcluir
  14. Olá amigos!

    Meu nome é Vinicius gostaria de saber se consigo utilizar o controle de motor L298N junto com esse shield?
    A ideia é controlar o giro e a direção motor pelos botoes do lcd e exibir o numero de voltas do motor no display.

    É possivel isso?

    Abraco a todos!

    ResponderExcluir
    Respostas
    1. Boa noite Vinicius,

      Consegue sim, solde uma barra de pinos no display, como eu mostro no post, e utilize as portas restantes para acionar o L298N.

      Abraço !

      Excluir
  15. Bom dia amigo eu tenho um shield desse toda vez que conecto ele no arduino mega o arduino para de funcionar e perde a conexão com o notebook.
    O que pode estar acontecendo?

    ResponderExcluir
    Respostas
    1. Boa tarde Wyllian,

      Me parece algum tipo de curto no shield. Você consegue testar com um Arduino Uno ?

      Abraço!

      Excluir
    2. também uso no mega funciona normalmente, verifique se a solda não esta fechando curto no conector usb, pois fica bem próximo!!!

      Excluir
  16. Os pinos deste shield D0 a D7 são para quê?

    ResponderExcluir
    Respostas
    1. Bom dia Alexandre,

      O Shield usa os pinos de 4 a 9 para se comunicar com o display. Teoricamente, o restante está "livre" para ser usado como portas de entrada/saída comuns.

      Abraço!

      Excluir
  17. olá existe alguma forma de programa em assembly, estudo sistemas de informação e o professor pediu pra que fosse em assmbly

    ResponderExcluir
  18. Boa tarde. Gostaria de fazer um contador que, ao atingir determinada contagem, desligue um motor. Como faço para alterar uma variável via teclado do display? Exemplo: Pressiona Select para habilitar o ajuste através de Up e Down. Pressiona Select novamente grava na variável.

    ResponderExcluir
  19. Boa noite, tenho a mesma placa utilizada no exemplo e upei o código fornecido. Entretanto, meu LCD está inteiro azul, não mostra nada nem mesmo um caractere quadrado. Alguém teve o mesmo problema e conseguiu solucionar??

    ResponderExcluir
    Respostas
    1. Oi Gustavo,

      Você chegou a regular o contraste usando o potenciômetro da placa ?

      Abraço!

      Excluir
    2. Boa noite, consegui resolver o problema, era isso mesmo, não sabia que a placa tinha um potenciômetro digital. Regulei ele com uma pequena chave de fendas e funcionou perfeitamente. Obrigado!!

      Excluir
    3. Boa tarde.
      Tambem estou com este problema. Não aparece o texto. Já tentei regular utilizando o potenciômetro da placa. Mas não mudou nada.

      Excluir
    4. Tenho o mesmo problema, a shield é nova, o arduino, uno, também. o display acende, o programa compila e carrega sem erros, mas não acontece nada, aperto nos botões e nada!!! precisa usar uma biblioteca especial para este display???

      Excluir
    5. Também estou com o mesmo problema, comprei o kit na Santa Efigenia (SP) e me venderam um paralelo sem eu perceber. Tem alguma relação entre isso e o LCD não funcionar? lembrando que o Arduino está funcionando normalmente

      Excluir
  20. To com o mesmo problema do Gustavo...
    Minha tela acende mas não aparece nenhum caracter, quadrado ou nada.. só acende a luz de fundo e o led vermelhor do Power.

    ResponderExcluir