Shield LCD 16×2 com Keypad e Arduino
O shield LCD 16×2 com Keypad (ou teclado, se preferir) é 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ô.
Este shield possui um display LCD 16×2 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.
Shield LCD 16×2 com Keypad: características e pinagem
O shield utiliza alguns pinos diferentes dos que usamos normalmente nos projetos para ligar um LCD. Se na ligação de um LCD 16×2, 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:
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:
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.
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:
//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 "); } }
Lembrando que neste post utilizamos o shield LCD 16×2 com Keypad e Arduino Uno, mas vocë pode usar com outras placas da linha como por exemplo com Arduino Mega.
No LCD quando eu aperto pra cima aparece -Direita-, o que está errado?
Bom dia. Provavelmente alguma ligação está invertida. O que acontece quando vc aperta a tecla da direita ? O que aparece ? Abraço.
Na linha 22 : if (botao < 100) { ;
Mudar p/: if (botao < 50) {
diminua o valor de 100 para 80 que funciona
isso e devido a oxidacao dos contatos internos das teclas.pode ser usado limpa contato.na maioria dos casos resolve o bug
Melhor verificar primeiro o que cada botão produz na entrada analógica A0. Tomar nota, e depois ajustar os limites conforme.
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!
Esquisito mesmo. O modelo do seu LCD é igual ao do post ?
Isso acontece comigo tbm usando a shield Lcd idêntico a esse da foto
diminua o valor de 100 para 80 que funciona
isso é um efeito de debouncing
O meu eu recebo o sinal dos botões mas não aparece nem uma letra se quer no display
Olá vc tentou ajustar o contraste da tela pois, se ele não tiver ajustado somente vai aparecer a luz de fundo
Olá vc tentou verificar o contraste da tela pois, se não tiver ajustado vai aparecer somente a luz de fundo.
Sim, exatamente igual.
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.
Fui tentar aqui e tbm deu este mesmo problema: a tecla de cima aparece ''direita''.
Boa tarde,
Tente alterar o valor do resistor, conforme eu mostrei acima.
Abraço !
diminua o 100 para 95 ou menos
if (botao < 100) {
lcd.print ("Direita ");
fiz isso e deu certinho , alterei o valor de 100 para 95 .vlw
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.
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 ?
Bom dia Tremendeiro. O que você quer dizer com "trocar de tela", e qual tecla você tem que manter apertada ? Abraço.
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
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 !
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
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 !
Precisa usar fios para conectar o LCD no arduino? Ou é só juntar os 2 e já posso fazer a programação?
Boa tarde,
Não precisa de fios. Esse LCD é um shield. Basta encaixar no Arduino e seguir com a programação.
Abraço !
bom dia.
Alguém sabe me informar aonde consigo a biblioteca LiquidCrystal.h?
Grato.
Bom dia,
A LiquidCrystal já está inclusa na IDE do Arduino.
Abraço !
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 ");
}
}
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 !
Pessoal, copiei o sketch do tutorial acima e esta dando ERROR COMPILING:
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp: In member function 'int I2CIO::begin(uint8_t)':
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp:61: error: 'Wire' was not declared in this scope
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp: In member function 'uint8_t I2CIO::read()':
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp:117: error: 'Wire' was not declared in this scope
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp: In member function 'int I2CIO::write(uint8_t)':
C:UsersservicosDocumentsArduinolibrariesLiquidCrystalI2CIO.cpp:140: error: 'Wire' was not declared in this scope
Alguem sabe o que pode ser?
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 !
Olá , como faço para desligar a luz de funda shield??
Boa tarde Daniel,
Estou sem o display aqui no momento, mas vou pesquisar e atualizar o post.
Abraço !
PinMode (10 ,OUTPUT);
digitalRead (10, LOW);
BOA TARDE, o comando '>' faz ir para direita e certamente '<' para esquerda como faço para parar ?
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 !
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!
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 !
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?
Boa tarde Wyllian,
Me parece algum tipo de curto no shield. Você consegue testar com um Arduino Uno ?
Abraço!
também uso no mega funciona normalmente, verifique se a solda não esta fechando curto no conector usb, pois fica bem próximo!!!
Os pinos deste shield D0 a D7 são para quê?
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!
olá existe alguma forma de programa em assembly, estudo sistemas de informação e o professor pediu pra que fosse em assmbly
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.
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??
Oi Gustavo,
Você chegou a regular o contraste usando o potenciômetro da placa ?
Abraço!
Ainda não, como faço isso??
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!!
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.
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???
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
Conseguiram resolver o problema, também acontece o mesmo comigo
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.
Estou usando essa montagem e mais os pinos 11, 12, 13, 5V e 2 GND para controlar um motor de passo, um pedal de acionamento e um relé para uma válvula. Estou com um problema bem estranho, tudo funciona perfeitamente mas depois de algum tempo começam a aparecer caracteres estranhos e sou obrigado a apertar o botão reset. Alguém tem alguma ideia???
Boa noite, meu programa esta funcionando corretamente, mas quando o LCD liga e aperto um push button na protoboard ele se apaga a cada click, alguma sujestão?
Boa noite,
Quando vc fala push button na protoboard você está falando dos botões do shield, ou vc fez uma ligação externa?
Abraço!
fiz uma ligação externa, abraços!
Boa noite, pode conectar o shield em portas diferentes da A0, A1…. etc?
Bom dia,
Você pode fazer algumas alterações de hardware para isso, já que ele usa normalmente as portas digitais e analógicas.
Abraço!
Boa noite Galera,
Da pra controlar a intensidade do backlight apenas tratando a Porta 10 como saída analógica.
Ex: analogWrite(10,50);
Opa, obrigado pela dica. 😉
Abraço!
Adilson
Bom dia, fiz todo o procedimento corretamente, porem no display aparece somente uns quadrados brancos na primeira linha. Pode ser problema na placa?!
Boa tarde,
Pode ser, mas pode ser também algum problema de conexão, configuração dos pinos, etc. Pela sua descrição, vc já mexeu no ajuste do potenciômetro, correto ?
Abraço!
Adilson
Bom dia, estou com esse display com shield tentando fazer um leitor de ruídos igual o que você fez em outro post com um display diferente, estou usando o mesmo código alterando apenas os pinos de entrada para o display a porta analógica para o modulo de som que estou usando A2, porem ele não esta variando as leituras de baixo, média e alta, o que pode ser? obrigado
Como faço para utilizar outros botoes ao invés dos que vieram no lcd keypad? Quero colocar botoes em uma caixinha em ABS.
Boa tarde,
No shield tem espaço para você soldar uma barra de pinos para ter acesso tantos aos pinos digitais como analógicos. Soldando uma barra desses, você consegue adicionar mais botões ao seu projeto.
Abraço!
Adilson
Oii, eu conectei no arduino uno, tudo direitinho, mas o display fica só aparecendo umas barras como se tivesse carregando, sabe oq pode ser??
Olá, sou iniciante, vejo que se apertar dois botões juntos e poderá mostrar uma terceira mensagem. Teria um código para para mostrar a mensagem de cada botão com intervalo de tempo entre as mensagens?
a tela so fica azul, alguem AJUDA AI, JA MECHEI NO POTECIOMETRO