Examinando a placa do adaptador, observamos que:
- Tem um trimpot para regular o contraste do display
- Tem um jumper para habilitar/inibir o backlight
- A conversão I2C paralelo é feita por um PCF8574
- Tem três ilhas de configuração marcadas com A0, A1 e A2
- O conector para ligação ao microcontrolador tem, como esperado, quatro sinais: GND, VCC, SDA e SCL.
O PCF8574 é um integrado bastante popular para expandir a capacidade de E/S e saída digital de microcontroladores. O seu endereço I2C é 0 1 0 0 A2 A1 A0. Ou seja, varia entre 0x20 e 0x27, dependendo dos pinos A2, A1 e A0. No caso da minha placa, as ilhas de configuração estão desconectadas e o endereço de fábrica é 0x27. A velocidade máxima no I2C é 100KHz.
O funcionamento do PCF8574 é muito simples: o valor escrito via I2C vai para os pinos P0 a P7; uma leitura via I2C retorna o valor nestes mesmos pinos.
Portanto, a única questão é saber a qual sinal do LCD corresponde cada um dos pinos P0 a P7 do PCF8574. Para isto eu liguei o display ao Arduino: GND em GND, VCC em 5V, SDA em A4 e SCL em A5 (Arduino UNO ou Nano, se for outra versão veja aqui) , carreguei no Arduino o programa abaixo e abri o Serial Monitor:
- // Programa para acionar uma a uma as saÃda do
- // conversor I2C / Paralelo PCF8574
- // DQ, Set/2015
- #include <Wire.h>
- void setup()
- {
- Serial.begin (9600);
- Wire.begin();
- }
- void loop()
- {
- byte x = 1;
- delay (10000);
- for (int i = 0; i < 8; i++)
- {
- Serial.println (i);
- Wire.beginTransmission(0x27);
- Wire.write(x);
- Wire.endTransmission();
- delay (3000);
- x = x << 1;
- }
- Serial.println();
- }
- RS = P0
- RW = P1
- E = P2
- A = P3 (backlight)
- D4 = P4
- D5 = P5
- D6 = P6
- D7 = P7
Existem algumas bibliotecas já prontas para displays com interface I2, mas nem todas tem a flexibilidade de configuração da conexão do PCF8574 ao display. Acabei usando a biblioteca NewLiquidCrystal de F Malpartida. É uma biblioteca que suporta vários tipos de conexão de display, o que pode ser confuso no início.
Após baixar o ZIP expanda a pasta NewliquidCrystal dentro da pasta libraries do diretório onde ficam os seus sketches e renomeie-a para LiquidCrystal_I2c (para não confundir a IDE).O programa abaixo mostra a biblioteca funcionando:
- // Exemplo simples de uso da biblioteca
- // NewliquidCrystal
- // (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads)
- // com um display com conexão I2C
- // (http://www.dx.com/p/i2c-iic-lcd-1602-display-module-with-white-backlight-4-pin-cable-for-arduino-raspberry-pi-374741)
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(
- 0x27, // Endereço do PCF8574
- 2, // bit que controla o sinal E(nable) do LCD
- 1, // bit que controla o sinal RW do LCD
- 0, // bit que controla o sinal RS do LCD
- 4, // bit que controla o sinal D4 do LCD
- 5, // bit que controla o sinal D5 do LCD
- 6, // bit que controla o sinal D6 do LCD
- 7, // bit que controla o sinal D7 do LCD
- 3, // bit que controla o Backlight do LCD
- POSITIVE // Backlight acende quando o sinal está em nível Alto
- );
- byte seg, minuto, hora;
- void setup()
- {
- lcd.begin(16,2); // Inicia o LCD
- DisplayWrite (0, 0, "DQSoft");
- DisplayWrite (1, 0, "00:00:00");
- }
- void loop()
- {
- if (++seg == 60)
- {
- seg = 0;
- if (++minuto == 60)
- {
- minuto = 0;
- if (++hora == 99)
- hora = 0;
- DisplayWriteDec (1, 0, hora);
- }
- DisplayWriteDec (1, 3, minuto);
- }
- DisplayWriteDec (1, 6, seg);
- delay (1000); // aguarda um segundo
- }
- // Mostra número decimal de 00 a 99
- void DisplayWriteDec (byte l, byte c, byte num)
- {
- char aux[3];
- aux[0] = 0x30 + num / 10;
- aux[1] = 0x30 + num % 10;
- aux[2] = 0;
- DisplayWrite (l, c, aux);
- }
- // Posiciona o cursor e mostra mensagem
- void DisplayWrite (int l, int c, char *msg)
- {
- lcd.setCursor(c,l);
- lcd.print(msg);
- }
Nenhum comentário:
Postar um comentário