#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
// Inisialisasi RTC dan LCD
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C, 16 kolom, 2 baris
// Pin untuk push button
const int button1Pin = 2; // Tombol untuk mengatur jam
const int button2Pin = 4; // Tombol untuk mengatur menit
const int ledPin = 19; // Pin LED sebagai pengganti servo
// Variabel alarm
int alarmHour = 0; // Menyimpan jam alarm
int alarmMinute = 0; // Menyimpan menit alarm
bool alarmSet = false; // Apakah alarm aktif
bool settingMode = false; // Mode pengaturan
// Status button
int lastButton1State = LOW;
int lastButton2State = LOW;
unsigned long debounceDelay = 50;
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
unsigned long buttonPressStart = 0;
// Alamat EEPROM untuk jam dan menit
const int alarmHourAddr = 0; // Alamat untuk jam
const int alarmMinuteAddr = 1; // Alamat untuk menit
void setup() {
lcd.begin(16, 2); // Inisialisasi LCD dengan 16 kolom dan 2 baris
lcd.backlight();
pinMode(ledPin, OUTPUT); // Set pin LED sebagai output
digitalWrite(ledPin, LOW); // Pastikan LED mati
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
// Inisialisasi RTC
if (!rtc.begin()) {
lcd.print("RTC not found!");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Atur waktu awal dari waktu kompilasi
}
// Muat alarm dari EEPROM
loadAlarm();
}
void loop() {
DateTime now = rtc.now();
// Tampilkan jam digital
lcd.setCursor(0, 0);
lcd.print("Time: ");
printTime(now.hour(), now.minute(), now.second());
// Tampilkan alarm yang disetel
lcd.setCursor(0, 1);
if (settingMode) {
lcd.print("Set Alarm: ");
printTime(alarmHour, alarmMinute, 0);
} else {
lcd.print("Alarm: ");
printTime(alarmHour, alarmMinute, 0);
}
// Baca input button untuk pengaturan alarm
handleButtonInput();
// Cek apakah alarm aktif
checkAlarm(now.hour(), now.minute());
}
void printTime(int hour, int minute, int second) {
if (hour < 10) lcd.print("0");
lcd.print(hour);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second);
}
void handleButtonInput() {
int button1State = digitalRead(button1Pin);
int button2State = digitalRead(button2Pin);
// Cek untuk masuk ke mode pengaturan
if (button1State == LOW && button2State == LOW) {
if (buttonPressStart == 0) {
buttonPressStart = millis(); // Catat waktu saat tombol ditekan
} else if (millis() - buttonPressStart >= 2000) {
settingMode = !settingMode; // Toggle mode pengaturan
buttonPressStart = 0; // Reset waktu tekan
}
} else {
buttonPressStart = 0; // Reset jika salah satu tombol dilepas
}
// Jika dalam mode pengaturan
if (settingMode) {
// Tombol 1 untuk mengatur jam
if (button1State != lastButton1State) {
if ((millis() - lastDebounceTime1) > debounceDelay) {
if (button1State == LOW) {
alarmHour = (alarmHour + 1) % 24; // Tambah jam
saveAlarm(); // Simpan alarm ke EEPROM
}
lastDebounceTime1 = millis();
}
}
// Tombol 2 untuk mengatur menit atau konfirmasi
if (button2State != lastButton2State) {
if ((millis() - lastDebounceTime2) > debounceDelay) {
if (button2State == LOW) {
alarmMinute = (alarmMinute + 1) % 60; // Tambah menit
saveAlarm(); // Simpan alarm ke EEPROM
}
lastDebounceTime2 = millis();
}
}
}
lastButton1State = button1State;
lastButton2State = button2State;
}
void checkAlarm(int currentHour, int currentMinute) {
if (currentHour == alarmHour && currentMinute == alarmMinute) {
triggerAlarm();
}
}
void triggerAlarm() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarm Active!");
digitalWrite(ledPin, HIGH); // Hidupkan LED
delay(3000); // Tunggu 3 detik
digitalWrite(ledPin, LOW); // Matikan LED
}
// Fungsi untuk menyimpan alarm ke EEPROM
void saveAlarm() {
EEPROM.write(alarmHourAddr, alarmHour); // Simpan jam
EEPROM.write(alarmMinuteAddr, alarmMinute); // Simpan menit
EEPROM.commit(); // Komit perubahan ke EEPROM
}
// Fungsi untuk memuat alarm dari EEPROM
void loadAlarm() {
alarmHour = EEPROM.read(alarmHourAddr); // Muat jam
alarmMinute = EEPROM.read(alarmMinuteAddr); // Muat menit
}