// ============================================================
// Exemplo: ESP32 + LCD 16x2 (HD44780) em modo 4 bits
// Ambiente: Arduino IDE
//
// Neste exemplo, o ESP32 escreve duas linhas no display:
//
// Linha 1: "ESP32 + LCD"
// Linha 2: contador em segundos
//
// ------------------------------------------------------------
// PINAGEM ESCOLHIDA ENTRE O ESP32 E O LCD
// ------------------------------------------------------------
//
// LCD 16x2 (pinos do módulo) -> ESP32
//
// 1 VSS (GND) -> GND
// 2 VDD (+5V) -> 5V
// 3 VO (contraste) -> pino central de um potenciômetro de 10k
// extremos do potenciômetro em 5V e GND
//
// 4 RS (Register Select) -> GPIO 21
// 5 RW (Read/Write) -> GND
// (mantido em escrita apenas)
//
// 6 E (Enable) -> GPIO 22
//
// 7 D0 (dado) -> NÃO USADO em modo 4 bits
// 8 D1 (dado) -> NÃO USADO em modo 4 bits
// 9 D2 (dado) -> NÃO USADO em modo 4 bits
// 10 D3 (dado) -> NÃO USADO em modo 4 bits
//
// 11 D4 (dado) -> GPIO 19
// 12 D5 (dado) -> GPIO 18
// 13 D6 (dado) -> GPIO 5
// 14 D7 (dado) -> GPIO 17
//
// 15 A ou LED+ (backlight +) -> 5V por resistor se o módulo não tiver resistor embutido
// 16 K ou LED- (backlight -) -> GND
//
// ------------------------------------------------------------
// OBSERVAÇÕES IMPORTANTES
// ------------------------------------------------------------
//
// 1) O LCD normalmente trabalha com alimentação de 5V.
// 2) O pino RW foi ligado ao GND para simplificar: assim o ESP32 só escreve no LCD.
// 3) No modo 4 bits, apenas D4, D5, D6 e D7 são usados para enviar os dados.
// 4) O potenciômetro de 10k ajusta o contraste do display.
// 5) Muitos módulos 16x2 já possuem resistor para o backlight.
// Se o seu display "nu" não possuir, use resistor em série no LED do backlight.
// 6) Os GPIOs escolhidos aqui são apenas uma sugestão. Você pode trocar,
// desde que altere a criação do objeto LiquidCrystal.
// ============================================================
#include <LiquidCrystal.h>
// ------------------------------------------------------------
// Definição dos pinos do ESP32 usados na conexão com o LCD
// ------------------------------------------------------------
// RS = seleciona se a informação enviada é comando ou dado.
// RS = 0 -> comando
// RS = 1 -> caractere/dado
const int LCD_RS = 21;
// E = enable. É o pulso de habilitação que faz o LCD capturar
// os sinais presentes nas linhas RS e de dados.
const int LCD_E = 22;
// Linhas de dados usadas no modo 4 bits.
// Apenas D4, D5, D6 e D7 do LCD são conectadas ao microcontrolador.
const int LCD_D4 = 19;
const int LCD_D5 = 18;
const int LCD_D6 = 5;
const int LCD_D7 = 17;
// ------------------------------------------------------------
// Criação do objeto do display
// Ordem dos parâmetros:
// LiquidCrystal(rs, enable, d4, d5, d6, d7)
// ------------------------------------------------------------
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
void setup() {
// Inicializa comunicação serial apenas para depuração
Serial.begin(115200);
// Inicializa o LCD com 16 colunas e 2 linhas
lcd.begin(16, 2);
// Escreve mensagem inicial
lcd.setCursor(0, 0); // coluna 0, linha 0
lcd.print("ESP32 + LCD");
lcd.setCursor(0, 1); // coluna 0, linha 1
lcd.print("Iniciando...");
delay(2000);
// Limpa o display antes de entrar no loop principal
lcd.clear();
}
void loop() {
// Tempo em segundos desde que o ESP32 foi iniciado
unsigned long segundos = millis() / 1000;
// Primeira linha
lcd.setCursor(0, 0);
lcd.print("Tempo ligado:");
// Segunda linha
lcd.setCursor(0, 1);
// Escreve os segundos
lcd.print(segundos);
// Completa com espacos para apagar caracteres antigos
// caso o valor diminua de tamanho visualmente em algum teste.
lcd.print(" s ");
delay(500);
}