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