Um dos maiores problemas em utilizar um display sem um módulo como o I2C é o emaranhado de fios e conexões que devem ser feitas para comunicação entre o display e o microcontrolador. Uma maneira interessante de resolver esse problema é usarmos o módulo I2C, que utiliza a comunicação pelo protocolo I2C para controlar o display. Nesse tutorial iremos aprender como fazer as conexões entre o módulo I2C, o microcontrolador Arduino Uno e o display 16×2.
O módulo I2C pode ser considerado um conversor com função de manipular as conexões de um display, sendo ele de tamanho 16×2 ou 20×4. O módulo usa de um protocolo chamado I2C que faz a manipulação através de um chip que pode ser visto facilmente na interface do módulo. Normalmente, os módulos I2C possuem a mesma pinagem, conforme figura abaixo.
Ainda sobre o módulo I2C, é possível configurá-lo em endereços diferentes através das conexões definidas no próprio módulo como A0, A1 e A2. A tabela abaixo mostra a configuração de endereços possíveis com a manipulação das conexões descritas.
Endereço | A0 | A1 | A2 |
0x20 | 0 | 0 | 0 |
0x21 | 1 | 0 | 0 |
0x22 | 0 | 1 | 0 |
0x23 | 1 | 1 | 0 |
0x24 | 0 | 0 | 1 |
0x25 | 1 | 0 | 1 |
0x26 | 0 | 1 | 1 |
0x27 | 1 | 1 | 1 |
As conexões A0, A1 e A2 podem ser soldadas ligando o ponto de baixo com o de cima. Com essa configuração você vai obter sempre o endereço 0x20 ou 0x28 dependendo do chip do módulo.
O display 16×2 é bastante usado em projetos simples e até mais complexos de automação. No tutorial estaremos utilizando o display 16×2, mas as implementações aqui feitas podem também ser executadas no display 20×4.
A lista de componentes utilizados no tutorial é a seguinte:
-
Display 16×2**;
-
Protoboard (Opcional).
* O Arduino Uno pode ser substituído por qualquer outro microcontrolador da família Arduino sem prejudicar o funcionamento da implementação.
** O Display 16×2 pode ser substituído por um display 20×4 sem interferência na execução do projeto.
Montando o projeto
A implementação do projeto pode ser considerada simples e de fácil execução. O esquemático do projeto está abaixo para referência:
Mergulhando no projeto
Software
Utilizaremos a IDE do Arduino para programar e compilar o código. Primeiramente vamos compilar o código que pode ser encontrado na própria IDE do Arduino chamado I2CScanner. Faremos isso pois precisamos descobrir o endereço que está sendo utilizado pelo módulo para comunicação com o Arduino. O código pode ser visto abaixo:
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }
Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Vamos compartilhar conhecimento!
Após compilação e envio do código para o microcontrolador que estiver utilizando, abra o monitor serial e verifique o endereço encontrado.
Agora abra uma nova Sketch e vamos “codar” hehe!
Incluímos as bibliotecas wire.h, LCD.h e LiquidCrystal_I2C.h, responsáveis pelo funcionamento correto do código. Lembre-se de adicionar a biblioteca LiquidCrystal fazendo download pelo link https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/ e adicionando a IDE como já ensinado em outros tutoriais.
#include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h>
Utilizamos as #define para definir constantes no código e como uma boa prática de programação, pois, caso você deseje mudar essas informações, basta alterar as constantes.
#define addressI2C 0x27 //Endereço obtido a partir do código anterior #define BL 3 #define EN 2 #define RW 1 #define RS 0 #define D4 4 #define D5 5 #define D6 6 #define D7 7 #define col 16 #define lin 2
Inicializamos então o objeto LiquidCrystal com as constantes definidas anteriormente.
LiquidCrystal_I2C lcd(addressI2C, EN, RW, RS, D4, D5, D6, D7);
Podemos também definir uma mensagem para ficar passando no display em scroll. É exatamente o que vamos fazer. Para isso definimos uma string contendo a frase.
int Cursor = 16; int inicioFrase, fimFrase = 0; int tamanhoFrase = 0; String frase = "Portal do Arduino: www.portaldoarduino.com.br";
Na função setup() vamos inicializar o objeto criado através da função begin() passando como parâmetro o número de colunas e de linhas, respectivamente, do display. Inicializamos também o pino de luz de fundo e acendemos a mesma.
void setup(){ lcd.begin(col, lin); lcd.setBacklightPin(BL, POSITIVE); lcd.setBacklight(HIGH); }
Na função loop() e rolagem() iremos fazer um scroll com a frase definida acima.
void loop(){ lcd.setCursor(5,0); lcd.print("Lucas"); lcd.setCursor(0,1); lcd.print(frase.substring(inicioFrase,fimFrase)); delay(200); //Velocidade do scroll. Menor = mais rápido. rolagem(); tamanhoFrase = frase.length(); if(inicioFrase == tamanhoFrase){ inicioFrase = 0; fimFrase = 0; } } void rolagem(){ lcd.clear(); if(inicioFrase == 0 && Cursor > 0){ Cursor--; fimFrase++; } else if (inicioFrase == fimFrase){ inicioFrase = 0; fimFrase = 0; Cursor = 16; } else if(fimFrase == frase.length() && Cursor == 0){ inicioFrase++; } else { inicioFrase++; fimFrase++; } }
Hardware
Muita atenção ao Arduino que irá utilizar! No caso do Arduino Mega, os pinos SDA e SCL do Módulo I2C devem ser conectados as portas 20 e 21, respectivamente.
A intensidade de luz de fundo do display pode ser alterada através do potenciômetro localizado atrás do módulo I2C. No sistema utilizamos o display 16×2, mas, caso queiram, o display pode ser substituído por um maior como o display 20×4 (Lembrando sempre de alterar as constantes definidas no código). Mais sobre o protocolo I2C pode ser visto em https://pt.wikipedia.org/wiki/I²2C
Conclusão
A junção entre o módulo I2C e o display facilita muuuuito a utilização dos mesmos em sistemas de automação. Em breve, aqui mesmo, você poderá encontrar mais algumas funcionalidades que podem ser adicionadas a esse sistema, fazendo seu uso mais interessante ao nosso mundo Maker. Qualquer dúvida, sugestão ou crítica pode ser enviada diretamente por e-mail ou nos comentários abaixo. Obrigado e até a próxima 😀
Referências
https://pt.wikipedia.org/wiki/I²2C
estou com dificuldade de ajustar o I2C, no inicio funcinava bem agora ele fica tudo co 0 nos caracteres não escreve nada
Olá Edval.
Verifique se os jumpers estão bem conectados na protoboard, esse tipo der costuma acontecer quando as conexões não estão bem estabelecidas.
Abraço.