#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// Endereço do LCD I2C (no Wokwi, o endereço é 0x3F por padrão)
LiquidCrystal_I2C lcd(0x3F, 20, 4); // LCD 20x4 I2C, endereço pode ser 0x3F ou 0x27
RTC_DS1307 rtc; // Instância do RTC DS1307
const int ledPin = 0; // Pino do LED (GPIO0)
void setup() {
// Inicializar comunicação I2C para o RTC (SDA no pino 19 e SCL no pino 18)
Wire.begin(19, 18); // SDA no pino 19 e SCL no pino 18 do ESP32
// Inicializar comunicação I2C para o LCD (SDA no pino 21 e SCL no pino 22)
Wire.begin(21, 22); // SDA no pino 21 e SCL no pino 22 para o LCD
// Inicializar o RTC
if (!rtc.begin()) {
lcd.clear();
lcd.print("Erro no RTC");
while (1); // Se o RTC não funcionar, o sistema trava aqui
}
// Verificar se o RTC perdeu a hora e configurar se necessário
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ajusta para o horário de compilação
}
// Configurar pino do LED como saída
pinMode(ledPin, OUTPUT);
// Inicializar o LCD
lcd.init();
lcd.backlight(); // Acende o fundo do LCD
// Teste inicial do LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LCD Funcionando!");
delay(2000); // Exibe por 2 segundos
}
void loop() {
// Obter a hora atual do RTC
DateTime now = rtc.now();
// Exibir hora no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hora: ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print("0");
}
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) {
lcd.print("0");
}
lcd.print(now.second());
// Exibir data no LCD
lcd.setCursor(0, 1);
lcd.print("Data: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
// Controle do LED: acende se o minuto for par, apaga se for ímpar
if (now.minute() % 2 == 0) {
digitalWrite(ledPin, HIGH); // Acende o LED
} else {
digitalWrite(ledPin, LOW); // Apaga o LED
}
// Atraso de 1 segundo
delay(1000);
}