⬤ LCD · Referência fundamental
🖥️ Biblioteca LiquidCrystal_I2C
⏱️ 25 min📚 Referência completa de métodos · Anti-flickering · Formatação
🚀 Inicializar o LCD
lcd_init.ino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Construtor: endereço I2C, colunas, linhas
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
lcd.init(); // Inicializar o controlador I2C + HD44780
lcd.backlight(); // Ligar retroiluminação (padrão: apagada)
lcd.setCursor(0, 0);
lcd.print("LCD pronto!");
}
📍 setCursor() — Mapa das 4 Linhas
setCursor(0,0) → linsetCursor(0,1) → linsetCursor(0,2) → linsetCursor(0,3) → lin
ℹ️Coluna 0 é a mais à esquerda; linha 0 é a mais acima. setCursor(19,3) é o último caractere do ecrã. A contagem começa sempre em zero.
lcd_posicionar.ino
// Preencher as 4 linhas com rótulo + valor
void dashboard(float t, float h, int luz, int vel) {
lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(t,1); lcd.print(" C ");
lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(h,1); lcd.print(" % ");
lcd.setCursor(0, 2); lcd.print("Luz: "); lcd.print(luz); lcd.print(" ");
lcd.setCursor(0, 3); lcd.print("Motor:"); lcd.print(vel); lcd.print("/255 ");
}
📋 Tabela de Métodos
| Método | O que faz | Nota |
lcd.init() | Inicializa o controlador I2C + HD44780 | Chamar em setup() antes de tudo |
lcd.backlight() | Liga a retroiluminação | — |
lcd.noBacklight() | Desliga a retroiluminação (display continua visível) | Útil para poupança de energia |
lcd.setCursor(col, row) | Move o cursor para coluna 0–19, linha 0–3 | Próximo print() começa aqui |
lcd.print(x) | Escreve texto, int, float, char | lcd.print(3.14, 2) → "3.14" |
lcd.write(byte) | Escreve 1 byte (char custom ou ASCII) | lcd.write(0) → char CGRAM slot 0 |
lcd.clear() | Apaga todo o ecrã e volta cursor a (0,0) | Lento ~2ms — causa flickering se em loop() |
lcd.home() | Volta cursor a (0,0) sem apagar | Mais rápido que clear() |
lcd.cursor() | Mostra cursor sublinhado | Útil em menus |
lcd.noCursor() | Esconde cursor (comportamento padrão) | — |
lcd.blink() | Activa cursor piscante tipo block | — |
lcd.noBlink() | Desactiva cursor piscante | — |
lcd.createChar(slot, bitmap) | Define char personalizado na CGRAM | Slots 0–7; chamar antes de init() |
lcd.scrollDisplayLeft() | Desloca todo o conteúdo 1 pos à esquerda | Para scroll de mensagens longas |
✅ Técnica Anti-Flickering
⚠️Nunca uses lcd.clear() dentro do loop() — apaga e reescreve o ecrã a cada ciclo causando um cintilamento visível. Actualiza apenas a zona que mudou.
antiflicker.ino
// ❌ MAU — flickering: lcd.clear() no loop
void loop_mau() {
lcd.clear();
lcd.print(analogRead(A0));
delay(500);
}
// ✅ BOM — sobrescreve com espaços
void loop_bom() {
lcd.setCursor(0, 0);
lcd.print(analogRead(A0));
lcd.print(" "); // espaços apagam dígitos anteriores
delay(500);
}
// ✅ MELHOR — só atualiza se o valor mudou
int ultimo = -1;
void loop_melhor() {
int v = analogRead(A0);
if (v != ultimo) {
lcd.setCursor(0, 0);
lcd.print(v); lcd.print(" ");
ultimo = v;
}
}
lcd_formatar.ino
// Float com 1 decimal: "23.5 C"
lcd.print(temp, 1); lcd.print(" C ");
// Inteiro com largura fixa de 3 (ex: " 42")
void print3(int v) {
if(v < 100) lcd.print(" ");
if(v < 10) lcd.print(" ");
lcd.print(v);
}
// HH:MM:SS a partir de segundos totais
void printTempo(unsigned long s) {
int h = s/3600, m=(s%3600)/60, sec=s%60;
if(h<10) lcd.print("0"); lcd.print(h); lcd.print(":");
if(m<10) lcd.print("0"); lcd.print(m); lcd.print(":");
if(sec<10) lcd.print("0"); lcd.print(sec);
}
🏆 Para ir mais longe
- Cria um sketch que mostra A0 atualizado a cada 100ms sem flickering
- Divide as 4 linhas em rótulo (6 chars) + valor (8 chars) + unidade (6 chars)
- Faz a retroiluminação piscar 3× quando A0 > 800 — alerta visual sem parar o programa
- Usa lcd.cursor() para mostrar cursor piscante numa posição específica e esconde-o 2s depois