Introdução
O Display LCD 16×2 é amplamente utilizado em projetos que requerem uma interface homem-máquina (IHM) eficiente. Com 16 colunas e 2 linhas, esse display exibe caracteres, letras e números com clareza e nitidez, graças à sua cor monocromática e backlight. Essa combinação melhora a visibilidade para quem recebe as informações.
O Display LCD 16×2 utiliza o controlador HD44780, que é amplamente adotado na indústria de LCDs como base de interface.
Neste artigo vamos utilizar um dos modelos de LCD que utilizam o módulo expansor de I/O I2C PCF8574 para interfacear com o display e para simplificar a interface de comunicação com o Franzininho WiFi.
Instalação da Biblioteca
Vamos instalar a biblioteca LiquidCrystal_I2C.h , para auxiliar na configuração do canal I2C e acessar os métodos que irão imprimir na tela letras e/ou números em nosso exemplo de projeto. Siga os passos abaixo para realizar a instalação.
Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools -> Manager Libraries)

Após acessar o Gerenciador de biblioteca (Manager Libraries) aguarde até que surja uma janela como mostrado na figura abaixo. Digite no campo de texto : liquidcrystal i2c e aguarde o resultado da pesquisa finalizar. Procure pela biblioteca LiquidCrystal I2C by Frank de Brabander e clique em Install para concluir a instalação e clique em Close. Pronto já estamos aptos a utilizar a biblioteca.
Biblioteca LiquidCrystal I2C
Após realizar a instalação da biblioteca vamos apresentar os métodos utilizados no exemplo de projeto. Para mais informações sobre a biblioteca, consulte o repositório no GitHub.
init()
Inicia a comunicação I2C e envia os comandos para o controlador informando o número de linhas e colunas (16×2, 16×4 ou 20×4).
void init(void);
clear()
Limpa todos os caracteres da tela.
void clear(void);
backlight()
Aciona a luz de fundo do display para visualizar os caracteres impressos.
void backlight(void);
noBacklight()
Desliga a luz de fundo do display, esse método é utilizado quando a aplicação precisa economizar energia ou diminuir a exposição a luz
void noBacklight(void);
home()
Posiciona o cursor para a posição de origem (0,0).
void home(void);
setCursor()
Posiciona o cursor na posição desejada.
void setCursor(uint8_t col, uint8_t row );
- col : coluna onde posiciona o cursor
- row : linha onde o cursor vai se posicionar
Lembre-se: Cada display possui um número máximo de linhas e coluna, caso o cursor seja posicionado fora desse limites os caracteres não serão visíveis, por exemplo 16×2 temos a linha 0 e linha 1.
scrollDisplayLeft()
Empurra os caracteres para o lado direito
void scrollDispalyLeft(void);
scrollDisplayRight()
Empurra os caracteres para o lado direito.
void scrollDispalyRight(void );
Materiais necessários
Os materiais necessários para desenvolver nossa aplicação são:
- Placa Franzininho WiFi
- Display LCD 16×2
- Módulo I2C PCF85740
- Jumpers
- Arduino IDE
Circuito
Abaixo temos a montagem do circuito. O módulo comunica-se via I2C, confira as conexões antes de ligar o display.
Observe na parte posterior do display temos o módulo I2C o qual vai facilitar a comunicação entre a Franzininho WiFi e o display LCD. Abaixo temos a imagem mostrando cada elemento.
- Jumper para acionar o backlight;
- Jumpers para selecionar o endereço I2C, por padrão não vem soldados;
- Trimpot para ajustar a nitidez dos caracteres, caso os caracteres não estejam visíveis, rotacione o eixo com auxílio de uma chave.
Código
/*
Autor: Equipe Embarcados
*/
//Incluir biblioteca
#include <LiquidCrystal_I2C.h>
#define COL 16 // Número de coluna
#define ROW 2 //Números de linhas
#define ADDR_I2C 0x27 // Endereço I2C
// Declarando construtor
LiquidCrystal_I2C lcd(ADDR_I2C,COL,ROW);
// Declarando váriaveis
const char sentence_cursor_on[] = "Cursor On";
const char sentence_cursor_off[] = "Cursor Off";
int i ;
size_t sz;
void setup()
{
//Inicia a comunicação I2C
lcd.init();
//Limpa a tela
lcd.clear();
//Habilita o backlight
lcd.backlight();
//Posiciona na coluna 2 e linha 0 o cursor na tela
lcd.setCursor(2,0);
//Imprime na tela a frase "Franzininho"
lcd.print("Franzininho");
//Posiciona na coluna 5 e linha 1 cursor na tela
lcd.setCursor(5,1);
//Imprime na tela a frase "WiFi"
lcd.print("WiFi");
delay(5000);
//Limpa a tela
lcd.clear();
//Habilita o curso para piscar na tela
lcd.blink();
//Recebe a quantidade de caracteres da frase
sz = strlen(sentence_cursor_on);
//Posiciona o cursor para a linha zero e coluna zero
lcd.home();
//Escreve caracter por caracter
for(i = 0; i<sz; i++)
{
lcd.print(sentence_cursor_on[i]);
delay(500);
}
delay(2000);
//Limpa a tela
lcd.clear();
//Desabilitar o cursor
lcd.noBlink();
//Recebe a quantidade de caracteres da frase
sz = strlen(sentence_cursor_off);
//Posiciona o cursor para a linha zero e coluna zero
lcd.home();
//Escreve caracter por caracter
for(i = 0; i<sz; i++)
{
lcd.print(sentence_cursor_off[i]);
delay(500);
}
delay(2000);
//Desabilita o backlight
lcd.noBacklight();
delay(1000);
//Habilita o backlight
lcd.backlight();
delay(2000);
//Limpa a tela
lcd.clear();
//Posiciona o cursor na tela
lcd.setCursor(1,0);
//Imprime na tela a frase "Fim Demo"
lcd.print("Fim Demo ;)");
}
void loop() {
}
Simule o exemplo no Wokwi: https://wokwi.com/projects/368696714054290433
Explicação do Código
Inclui a biblioteca para acessar os métodos e declarar o(s) objeto(s).
//Incluir biblioteca
#include <LiquidCrystal_I2C.h>Define o número de colunas e linhas de acordo com o modelo do display, em nosso projeto utilizamos o 16×2 e o endereço I2C padrão.
#define COL 16 // Número de coluna
#define ROW 2 //Números de linhas
#define ADDR_I2C 0x27 // Endereço I2CDeclara o construtor junto com os parâmetros de endereço, número de colunas e linhas. A partir dele vamos fazer a chamada dos métodos da biblioteca.
// Declarando construtor
LiquidCrystal_I2C lcd(ADDR_I2C,COL,ROW);Declara as variáveis do tipo char para receber as frases a serem impressas no display.
// Declarando váriaveis
const char sentence_cursor_on[] = "Cursor On";
const char sentence_cursor_off[] = "Cursor Off";
Declara as variáveis para percorrem caracter por caracter, um índice (i) e armazenar a quantidade de caracter em cada frase.
int i ;
size_t sz;No setup fazemos a configuração do display pelo método init(), internamente dele iniciamos a comunicação I2C com o módulo e logo envia-se os comandos do display. Após passar essa etapa limpamos a tela do display, garantindo que durante o processo de inicialização não impressos caracteres oriundo de ruídos ou interferências e por fim habilita a luz de fundo do display.
//Inicia a comunicação I2C
lcd.init();
//Limpa a tela
lcd.clear();
//Habilita o backlight
lcd.backlight(); A primeira etapa da demonstração inicia posicionando as frases por meio do curso (setCursor) e logo após imprimindo (print). Tenha em mente que antes de enviar algum caractere na tela é necessário posicionar no local desejado.
//Posiciona na coluna 2 e linha 0 o cursor na tela
lcd.setCursor(2,0);
//Imprime na tela a frase "Franzininho"
lcd.print("Franzininho");
//Posiciona na coluna 5 e linha 1 cursor na tela
lcd.setCursor(5,1);
//Imprime na tela a frase "WiFi"
lcd.print("WiFi");
delay(5000);
Após aguardar 5 segundo limpa a tela e habilita para visualizar o cursor na tela.
//Limpa a tela
lcd.clear();
//Habilita o curso para piscar na tela
lcd.blink();A segunda demonstração de uso vamos escrever caracter por caracter posicionando o cursor no canto esquerdo superior da tela (home) utilizando um laço de repetição, para isso é necessário um variável para percorrer o vetor (indice) e saber o comprimento do vetor pela função (strlen).
sz = strlen(sentence_cursor_on);
//Posiciona o cursor para a linha zero e coluna zero
lcd.home();
//Escreve caracter por caracter
for(i = 0; i<sz; i++)
{
lcd.print(sentence_cursor_on[i]);
delay(500);
}
delay(2000);Novamente limpa a tela e desabilita o curso para vizualização.
//Limpa a tela
lcd.clear();
//Desabilitar o cursor
lcd.noBlink();Utilizamos o mesmo procedimento do bloco de código anterior, agora escrevendo outra frase. Posiciona o cursor no home e escrevemos caractere por caractere na tela do display.
//Recebe a quantidade de caracteres da frase
sz = strlen(sentence_cursor_off);
//Posiciona o cursor para a linha zero e coluna zero
lcd.home();
//Escreve caracter por caracter
for(i = 0; i<sz; i++)
{
lcd.print(sentence_cursor_off[i]);
delay(500);
}
delay(2000);Na terceira demonstração como desabilitar e habilitar a luz de fundo do display.
//Desabilita o backlight
lcd.noBacklight();
delay(1000);
//Habilita o backlight
lcd.backlight();
delay(2000);Limpa a tela para remover os caracteres anteriores e por fim escrevemos na tela o fim da demo.
//Limpa a tela
lcd.clear();
//Posiciona o cursor na tela
lcd.setCursor(1,0);
//Imprime na tela a frase "Fim Demo"
lcd.print("Fim Demo ;)"); Conclusão
Ao concluir este artigo, aprendemos a configurar o display LCD 16×2 juntamente com o módulo I2C PCF 85740, e demonstramos, por meio de um exemplo de projeto, como utilizar os métodos da biblioteca. Foi observado que a simplificação das conexões liberou mais GPIOs que podem ser utilizados para a leitura de sensores ou ativação de atuadores. Outra vantagem é a facilidade de utilizar o mesmo código para displays LCD, bastando apenas alterar o número de linhas e colunas no início do código. Portanto, todas essas informações servem como base para criar projetos com a Franzininho WiFi, aproveitando ao máximo os recursos disponíveis do componente.





