Quando fizemos nosso primeiro post da série sensores, prometemos que ensinaríamos a usar um display LCD (liquid crystal display). E já que promessa é dívida, hoje nosso tema é: Arduino e display LCD 20×4. Este tipo de dispositivo é geralmente usado para dar um diferencial em nossos projetos.Com ele é possível mostrar data, hora, temperatura, pressão e várias outras informações, deixando assim o projeto mais amigável.
Funcionamento do Display
Existem vários modelos de displays LCDs, porem o que vamos abordar aqui é o display matricial de 20 caracteres (ou células) por 4 linhas. Cada célula possui 40 pixeis, sendo que são dispostos em uma matriz de 8 linhas por 4 colunas. É através destes pontos que as imagens são formadas. O principio de funcionamento deste modelo que escolhemos é o mesmo para qualquer outro, servindo desde o display 8×2 até 40×4. Geralmente eles possuem 14 ou 16 pinos, sendo que os dois pinos a mais, é o cátodo e o ânodo dos LEDs do Back-Light. Para quem não conhece, o Back-Light é a iluminação de fundo do display, que serve para facilitar a leitura quando há baixa ou nenhuma luminosidade. Para entendermos melhor o funcionamento dos pinos, aqui vai uma lista de suas características:
- Pino 1 (VSS) → Terra
- Pino 2 (VDD) → Alimentação do dispositivo (5v)
- Pino 3 (Vo) → Contraste do LCD
- Pino 4 (RS) → Register Selector
- Pino 5 (RW) → Read/Write
- Pino 6 (E) → Enable
- Pino 7 (D0) → Pino de dados
- Pino 8 (D1) → Pino de Dados
- Pino 9 (D2) → Pino de Dados
- Pino 10 (D3) → Pino de Dados
- Pino 11 (D4) → Pino de Dados
- Pino 12 (D5) → Pino de Dados
- Pino 13 (D6) → Pino de Dados
- Pino 14 (D7) → Pino de Dados
- Pino 15 (A) → Ânodo do Back-Light
- Pino 16 (K) → Cátodo do Back-Light
Explicando o que cada pino faz:
- Os Pinos 1 e 2 servem para alimentar o dispositivo.
- O pino 3 serve para controlar o contraste da tela. Ele recebe um sinal de 0 a +5Vcc controlado por um potenciômetro de 10 KΩ ou 20KΩ.
- Os pinos 4 e 6, possuem a função de definir se o LCD vai receber um comando(setar cursor/ limpar) quando está em nível logico baixo (0) ou se vai receber um caractere(a,b…1,2…) podendo estar ativo ou inativo, isso quando está em nível logico alto (1). Mas isso não é um problema que devemos levar em consideração, pois a biblioteca que vamos utilizar na programação do Arduino fica responsável de fazer toda a parte de desenvolvimento de baixo nível.
- O pino 5, é responsável por controlar se a operação vai ler o dispositivo ou escrever no mesmo.
- Os pinos de 7 a 14, são responsáveis pelo barramento de dados. Exite duas formas de se utilizar esses 8 pinos: A primeira e menos usada, é quando se utiliza todos eles em paralelo para fazer a comunicação em 8 bits (ou 1 byte). A mais utilizada e que vai estar presente em nossa programação é a com 4 pinos, que transmite os dados em dois pacotes, sendo cada um com 4 bits (ou 1 nibble). O motivo de usarmos esse, é que reduz o numero de pinos de entrada de saída do Arduino, porem gasta mais memória.
- Os pinos 15 e 16, são responsáveis pelo acendimento do Back-Light.
Aplicação com Arduino
Comunicar o Arduino com display é fácil, pois já existe uma biblioteca chamada de LiquidCrystal.h, que facilita e muito a programação. Essa biblioteca é responsável por fazer toda a parte de programação de baixo nível, tornando mais fácil a utilização do display. Para fazer a importação da biblioteca, basta abrir o IDE do Arduino, selecionar o menu Sketch>> Import Library>> LiquidCrystal. O IDE também disponibiliza exemplos de códigos, para fazer isso basta abrir o IDE, selecionar o menu File>> Examples>> LiquidCrystal>> selecionar algum do exemplos. Dentro do código desses exemplos existe uma linha de comentários, onde tem um link para o diagrama de conexões do projeto.
O nosso projeto vai utilizar a biblioteca do Arduino, porem não utilizaremos um dos exemplos presentes na plataforma. A nossa programação vai mostrar como escrever caracteres simples e especiais no display. Para começarmos, é preciso entender como criar um caractere especial. Para isso listamos alguns passos:
- Primeiro: Devemos entender que nosso display possui 20 caracteres( ou células) em cada linha. Como temos 4 linhas, logo o nosso painel possui 80 células.
- Segundo: Cada célula possui 40 pixeis (ou pontos), divididos em 8 linhas por 5 colunas.
- Terceiro: O caractere seja simples ou especial, é formado através do acendimento desses pixeis. Para entender isso, vamos para o quarto passo.
- Quarto: Para acender ou apagar um pixel, é necessário criar no nosso código um vetor de 8 Bytes, onde este irá representar nosso desenho através de números binários. Sendo que quando o valor for (1) ele vai acender o pixel e quando for (0) vai apagar. Veja como fazer isso no quinto passo.
- Quinto: E para facilitar nossa vida na hora de desenhar o caractere, o site pplware disponibilizou um software que permite você fazer o esboço enquanto ele cria o código do vetor, e assim basta você copiar.
Pois bem, entendido isso é hora de colocar a mão na massa! Antes de ver a programação é necessário montar o circuito, e para isso vamos precisar de:
- Um Arduino UNO( R3 ou compatível);
- Um display LCD 20×4( se o display for diferente, bastar fazer alterações nos códigos);
- Um potenciômetro 10kΩ;
- Uma Protoboard;
- Jumpers para as conexões;
- Cabo USB para carregar o programa no Arduino;
Diagrama de Conexões
Código com Arduino
#include <LiquidCrystal.h>
//Inicializando as portas de dados do display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Criando o vetor de caractere especial para o simbolo do fazedores.com
//primeiro quadrante do desenho
byte primeiro[8] = {
B00000,
B00000,
B01000,
B00100,
B00010,
B00001,
B00010,
B00100
};
//Segundo quandrante do desenho
byte segundo[8] = {
B00000,
B00000,
B00000,
B00000,
B10000,
B01000,
B01100,
B10110
};
//terceiro quadrante do desenho
byte terceiro[8] = {
B01000,
B00100,
B00010,
B00001,
B00000,
B00000,
B00000,
B00000
};
//Quarto quadrante do desenho
byte quarto[8] = {
B00101,
B00010,
B00100,
B01000,
B10000,
B00000,
B00000,
B00000
};
//-----------------fim do caracter do fazedores.com------------------
//Criando um emoticon feliz
byte emoticon[8] = {
B00000,
B11011,
B11011,
B00100,
B00100,
B00000,
B10001,
B01110
};
//-----------------------------------------------------------------
//Criando simbolo do arduino
//Primeiro quadrante do desenho
byte arduino1[8] = {
B00000,
B00000,
B01110,
B10001,
B11111,
B10001,
B01110,
B00000
};
//Segundo quadrante do desenho
byte arduino2[8] = {
B00000,
B00000,
B01110,
B10101,
B11111,
B10101,
B01110,
B00000
};
//----------------fim da criação dos caracteres----------------------
void setup() {
//Criando o novo caractere simbolo do fazedores dentro de cada quadrante
lcd.createChar(1, primeiro);
lcd.createChar(2, segundo);
lcd.createChar(3, terceiro);
lcd.createChar(4, quarto);
//-----------------------------------------------------------------
//Criando o novo caractere do emoticon feliz-----------------------
lcd.createChar(5, emoticon);
//Criando o novo caractere simbolo do arduino----------------------
lcd.createChar(6, arduino1);
lcd.createChar(7, arduino2);
//-----------------------------------------------------------------
lcd.begin(20, 4); //inicializa o LCD 20x4
lcd.setCursor(2, 2); //aponta o cursor para coluna 3, linha 1
lcd.write(1); //escreve o primeiro quadrante do simbolo fazedores
lcd.write(2); //escreve o segundo quadrante do simbolo fazedores
lcd.setCursor(2, 3); //aponta o cursor para coluna 2, linha 3
lcd.write(3); //escreve o terceiro quadrante do simbolo fazedores
lcd.write(4); //escreve o quarto quadrante do simbolo fazedores
lcd.print("fazedores.com "); //escreve no display com caracteres simples
lcd.setCursor(3, 0); //aponta o cursor para coluna 3, linha 0
lcd.print("Display 20x4"); //escreve no display com caracteres simples
lcd.setCursor(5, 1); // aponta o cursor para coluna 5, linha 1
lcd.print("Arduino "); //escreve no display com caracteres simples
lcd.setCursor(8, 2); //aponta o cursor para coluna 8, linha 2
lcd.write(6); //escreve o primeiro quadrante do simbolo do arduino
lcd.write(7); //escreve o segundo quadrante do simbolo do arduino
lcd.setCursor(18, 2); //aponta o cursor para coluna 18, linha 2
lcd.write(5); //escreve o emoticon feliz :)
}
void loop() {
}
É possível notar que os códigos são simples. O que eles fazem é construir alguns caracteres especiais( podendo ser em uma única célula ou mais) e escrever caracteres simples no display. Todo código é executado apenas uma vez, deixando as mensagens fixas no display.
Bom, agora é com você! O display LCD é simples e com certeza será muito útil em seus projetos, então Mãos a Obra. É hora de botar em prática o que aprendeu sobre este dispositivo. E se tiver dúvidas, não deixe de ir até o nosso fórum para tirá-las.
Onde comprar?
Compre Arduino, componentes eletrônicos e ferramentas na FilipeFlop. Os preços são ótimos, a agilidade é matadora e as entregas são feitas para todo o Brasil. O Fazedores e a FilipeFlop estão juntos para fomentar a cultura maker no Brasil.










Cumprimentos.
A Pinagem desse display está correta? Os pinos 15 e 16 no Esquemático não estão invertidos?
Tenho um display desse, com tela azul e letras brancas mas, não consigo fazer funcionar, só aparece o brilho na tela; estou usando potenciômetro de 10K. Há alguma maneira de fazer algum teste de funcionamento?
Obrigado
Daniel, os pinos 15 e 16 são apenas da luz de fundo, se seu display está acendendo esta luz então é pq está correto.
Quanto a não aparecer caracteres, pode ser por causa do contraste. Já tentou variar o potenciômetro para ver se aparecem ao menos os quadradinhos no display?
Boa noite, sou aluna da PUC também e preciso fazer a programação de um arduino nano junto do display 16×2, e preciso que o display passe as informações que o arduino chama. Você alguma biblioteca nesse estilo?
Parabéns Thayron e, obrigado pelo tutorial!
Posso substituir o pino 7 do lcd pelo 2 do mesmo?
Os displays I2C são lentos se comparados aos com conexões 4 e 8 bits
Boa tarde,
Não conheço muito essa área e estou desenvolvendo um projeto e necessito de um Display LCD com comunicação I2C que funcione com o arduíno e que possua no mínimo 5 linhas. Você sabe onde posso encontrar?
Atenciosamente,
Kelly Santos