#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// Inisialisasi LCD dengan alamat I2C 0x27 dan ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inisialisasi RTC
RTC_DS3231 rtc;
// Buffer untuk menyimpan tanggal
char dateBuffer[11]; // format "DD/MM/YYYY"
int scrollIndex = 0;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi serial monitor
Serial.begin(9600);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
// Jika RTC kehilangan daya, atur waktu dengan default
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya, mengatur ulang waktu!");
// Atur waktu di sini (tahun, bulan, hari, jam, menit, detik)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// Format waktu
char timeBuffer[9];
snprintf(timeBuffer, sizeof(timeBuffer), "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
// Format tanggal
snprintf(dateBuffer, sizeof(dateBuffer), "%02d/%02d/%04d", now.day(), now.month(), now.year());
// Tampilkan waktu pada baris pertama
lcd.setCursor(0, 0);
lcd.print("Waktu:");
lcd.setCursor(7, 0);
lcd.print(timeBuffer);
// Scroll tanggal pada baris kedua
scrollDate();
// Tunda 1 detik
delay(1000);
}
void scrollDate() {
int len = strlen(dateBuffer);
char displayBuffer[17]; // Buffer untuk tampilan 16 karakter + null terminator
// Isi displayBuffer dengan spasi
memset(displayBuffer, ' ', sizeof(displayBuffer) - 1);
displayBuffer[sizeof(displayBuffer) - 1] = '\0';
// Salin karakter dari dateBuffer ke displayBuffer
for (int i = 0; i < 16; i++) {
int index = (scrollIndex + i) % (len + 1);
if (index < len) {
displayBuffer[i] = dateBuffer[index];
}
}
// Tampilkan displayBuffer pada baris kedua
lcd.setCursor(0, 1);
lcd.print(displayBuffer);
// Perbarui scrollIndex
scrollIndex = (scrollIndex + 1) % (len + 1);
}