Utilizando um display de LCD com o arduino.

Teoria sobre displays de cristal líquido, LCD.
Os LCD são formados por um material que se denomina cristal líquido. As moléculas desse material são distribuídas entre duas lâminas transparentes polarizadas. Essa polarização é orientada de maneira diferente nas duas lâminas, de forma que estas formem eixos polarizadores perpendiculares, como se formassem um ângulo de 90º. As moléculas de cristal líquido são capazes de orientar a luz.
A base da iluminação de um LCD é a luz fornecida por uma lâmpada CCFL ou um conjunto de LEDS. Nos LCD monocromáticos, cada ponto da tela corresponde a um ponto da imagem.
Um pixel é a menor unidade de uma imagem, o número de pixels no display determina a resolução do LCD. 
LCD monocromático, Chinmayananda Das  - Monitor and Control of Greenhouse Environment

Os LCDs são amplamente usados em conjunto com micro controladores para mostrar a informação visualmente, os LCDs possuem uma tabela de caracteres ASCII e símbolos matemáticos em sua memória.

LCD com back light azul – 20 colunas e 4 linhas

Caracteres padrões contidos na memória do LCD – (Data Sheet MGD2004D-FL-YBS)


 Sinais Enviados para o LCD

O LCD requer três sinais de controle que devem ser enviados pelo micro controlador.
Enable (E) - Este sinal permite acessar o display através das instruções R/W e RS.
Quando enable tem nível lógico baixo o display ignora os sinais vindos de R/W e RS, quando enable tem nível lógico alto o display checa os estados desses dois controladores, e responde de acordo.

Read/Write (R/W) Ler e Escrever- Determina a direção em que os dados fluem entre o LCD e o micro controlador, quando R/W tem nível lógico baixo os dados enviados pelo micro controlador são escritos no LCD, quando R/W tem nível lógico alto os dados são lidos do LCD.

Register select (RS) Seletor de Registros - De acordo com os dados nesse controlador o LCD interpreta o tipo de dado que está sendo enviado pelo micro controlador.
Quando RS tem nível baixo uma instrução está sendo escrita no LCD, quando o nível é alto um caractere ou mais está sendo escrito.

E = 0 Acesso ao LCD desabilitado
  = 1 Acesso ao LCD habilitado
R/W = 0 Escrevendo dados no LCD
  = 1Lendo dados do LCD
RS= 0 Uma instrução foi enviada ao LCD
    = 1 Um caractere foi enviado ao LCD

Escrevendo dados no LCD

Enviar dados para o LCD requer alguns passos:
1) Setar o bit R/W bit como 0 (zero).
2) Setar o bit RS como 0 (zero) ou 1 (um) (instrução ou caractere).
3) Enviar dados para as linhas de dado.
4) Setar o bit E como 1 (um).
5) Setar o bit E como 0 (zero).

Lendo dados
1) Setar o bit R/W como 1 (um)
2) Setar o bit RS como 0 (zero) ou 1 (um) (instrução ou caractere).
3) Ler dados das linhas de dados
4) Setar o bit E como 1 (um).
5) Setar o bit E como 0 (zero).



Pinagem do LCD
Display LCD 20x4 dimensões e pinagem (Data Sheet MGD2004D-FL-YBS – 26 de junho de 2006)


Display LCD 20x4 – descrição dos pinos. (Data Sheet MGD2004D-FL-YBS – 26 de junho de 2006)


Inicialização do LCD
Antes de usar o display LCD para nosso objetivo, ele deve ser inicializado via reset interno ou pelo envio de um conjunto de instruções. Como nosso projeto foi concebido com a idéia de conectar o display a um micro controlador, escolhemos a inicialização por instruções.
Inicializar um display LCD com instruções é um processo simples, abaixo temos um fluxograma que indica todos os passos.
Fluxograma de inicialização por instruções do Display LCD (Ajay Bhargav - http://www.8051projects.net/)

De acordo com o fluxograma podemos observar que o display LCD é inicializado conforme a seguinte seqüência
1)    Enviar o comando 0x30 - Usando a interface de 8 bits
2)    Esperar 20ms
3)    Enviar o comando 0x30 – Usando a interface de 8 bits
4)    Esperar 20ms
5)    Enviar o comando 0x30 – Usando a interface de 8 bits
6)    Esperar 20ms
7)    Enviar o conjunto de instruções.
8)    Enviar o comando 0x01 para limpar o LCD
Definir o modo de incremento.




Interface com o Arduino
Prossiga montando seu circuito de acordo com o esquema abaixo.
LCD 16x2 ou 20x4 possuem físicamente os mesmos pinos, o que muda durante seu uso são as instruções enviadas aos mesmos e é claro o limite de linhas e colunas.
O potênciometro é utilizado para ajustar o contraste dos caracteres no display, o regule conforme seu próprio critério, as setas >> indicam para que pinos do arduino os pinos do LCD devem ser ligados, não se esqueça de verificar se o datasheet do seu LCD é compatível com o meu esquemático.
O código
 Código fonte: (em itálico)
 #include <LiquidCrystal.h>
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 /*
 Pino 12 = RS
 Pino 11 = EN
 Pino 05 = D4
 Pino 04 = D5
 Pino 03 = D6
 Pino 02 = D7
 */
 void setup()
 {
   //lcd.begin(cols, rows)
   lcd.begin(20, 4); // Tipo de LCD usado no meu caso de 20 colunas por 4 linhas
   lcd.setCursor(0, 0); // O Cursor iniciara na coluna zero linha 0
   lcd.print("    Central AVR!");
   lcd.setCursor(0, 1); // O Cursor iniciara na coluna zero linha 1
    }
 void loop()
 {
   //lcd.setCursor(col, row)
   lcd.setCursor(0, 2); // O Cursor iniciara na coluna zero linha 1
   lcd.print(millis()/1000); // Função para contar em segundos
   lcd.print("  segundos");  // Exibe e atualiza o tempo desde a entrada no loop
 }
O código acima é escrito em linguagem C, e faz uso de bibliotecas integradas do arduino como por exemplo a função LiquidCrystal lcd(); que seta os pinos do lcd que serão conectados ao arduino. 
Na pasta de instalação do arduino subpasta reference podemos consultar uma explicação básica em inglês de todas as funções padrões, vou pegar a referência LiquidCrystal função LiquidCrystal() para exemplificar.

LiquidCrystal()

Description

Creates a variable of type LiquidCrystal. The display can be controlled using 4 or 8 data lines. If the former, omit the pin numbers for d0 to d3 and leave those lines unconnected. The RW pin can be tied to ground instead of connected to a pin on the Arduino; if so, omit it from this function's parameters.

Syntax

LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

Parameters

rs: the number of the Arduino pin that is connected to the RS pin on the LCD

rw: the number of the Arduino pin that is connected to the RW pin on the LCD (optional)

enable: the number of the Arduino pin that is connected to the enable pin on the LCD

d0, d1, d2, d3, d4, d5, d6, d7: the numbers of the Arduino pins that are connected to the corresponding data pins on the LCD. d0, d1, d2, and d3 are optional; if omitted, the LCD will be controlled using only the four data lines (d4, d5, d6, d7).

 Neste procedimento foi utilizado um display de LCD de 20x4 com comunicação a 4 fios, portanto foi utilizada a função LiquidCrystal(rs, enable, d4, d5, d6, d7); Com os devidos valores substituídos pelos pinos do arduino.

LiquidCrystal(rs, enable, d4, d5, d6, d7);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
Sendo:
 Pino 12 = RS
 Pino 11 = ENABLE
 Pino 05 = D4
 Pino 04 = D5
 Pino 03 = D6
 Pino 02 = D7

O resultado final pode ser visto no vídeo abaixo


Interessado em entrar no mundo Arduino? Confira meus produtos no mercado livre:
http://produto.mercadolivre.com.br/MLB-231090632-arduino-duemilanove-microcontrolador-avr-_JM
http://produto.mercadolivre.com.br/MLB-231096670-sensor-de-fumaca-para-arduino-pic-avr-8051-_JM
http://produto.mercadolivre.com.br/MLB-231098016-matriz-de-led-8x8-para-arduino-pic-avr-8051-_JM