#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD 20x4 I2C
const int buzzerPin = 8;
const int alarmHour = 6;
const int alarmMinute = 55;
bool alarmTriggered = false;
unsigned long alarmStartTime = 0;
// Untuk deteksi perubahan
int lastSecond = -1;
int lastMinute = -1;
int lastDay = -1;
int lastGreetingHour = -1; // agar ucapan tidak ditulis ulang terus
void setup() {
Wire.begin();
rtc.begin();
lcd.begin(20, 4);
lcd.backlight();
pinMode(buzzerPin, OUTPUT);
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// Tanggal (baris 0)
if (now.day() != lastDay) {
lastDay = now.day();
lcd.setCursor(0, 0);
lcd.print(" "); // clear baris
lcd.setCursor(0, 0);
lcd.print(getDayName(now.dayOfTheWeek()));
lcd.print(" ");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
}
// Jam (baris 1)
if (now.second() != lastSecond) {
lastSecond = now.second();
int hour = now.hour();
bool isPM = false;
if (hour >= 12) {
isPM = true;
if (hour > 12) hour -= 12;
} else if (hour == 0) {
hour = 12;
}
lcd.setCursor(0, 1);
if (hour < 10) lcd.print("0");
lcd.print(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());
lcd.print(isPM ? " PM " : " AM ");
}
// Alarm (baris 2)
if (now.minute() != lastMinute) {
lastMinute = now.minute();
lcd.setCursor(0, 2);
lcd.print("Alarm: ");
if (alarmHour < 10) lcd.print("0");
lcd.print(alarmHour);
lcd.print(":");
if (alarmMinute < 10) lcd.print("0");
lcd.print(alarmMinute);
lcd.print(" ");
}
// Ucapan waktu (baris 3)
if (now.hour() != lastGreetingHour) {
lastGreetingHour = now.hour();
lcd.setCursor(0, 3);
lcd.print(" "); // clear baris
lcd.setCursor(0, 3);
lcd.print(getGreeting(now.hour()));
}
// Alarm bunyi 5 detik
if (now.hour() == alarmHour && now.minute() == alarmMinute && !alarmTriggered) {
tone(buzzerPin, 1000);
alarmStartTime = millis();
alarmTriggered = true;
}
if (alarmTriggered && millis() - alarmStartTime >= 5000) {
noTone(buzzerPin);
alarmTriggered = false;
}
delay(100);
}
// Nama hari
String getDayName(int day) {
switch (day) {
case 0: return "Minggu";
case 1: return "Senin";
case 2: return "Selasa";
case 3: return "Rabu";
case 4: return "Kamis";
case 5: return "Jumat";
case 6: return "Sabtu";
default: return "";
}
}
// Ucapan sesuai jam
String getGreeting(int hour) {
if (hour >= 4 && hour <= 10) {
return "Selamat Pagi ";
} else if (hour >= 11 && hour <= 14) {
return "Selamat Siang ";
} else if (hour >= 15 && hour <= 17) {
return "Selamat Sore ";
} else {
return "Selamat Malam ";
}
}