// ============================================================
// 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;
#define B1 27
#define B2 26
#define B3 25
#define LED 2
// ------------------------------------------------------------
// 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);
pinMode(B1, INPUT_PULLUP);
pinMode(B2, INPUT_PULLUP);
pinMode(B3, INPUT_PULLUP);
pinMode(LED, OUTPUT);
digitalWrite(LED,1);
// 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(1000);
// Limpa o display antes de entrar no loop principal
lcd.clear();
// Primeira linha
lcd.setCursor(0, 0);
lcd.print("Me transforme");
// Segunda linha
lcd.setCursor(0, 1);
lcd.print("em um relogio!");
}
void loop() {
}B1
B2
B3