#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
//pin untuk tombol dan buzzer
#define bUP 32
#define bDN 33
#define bOK 25
#define Buzzer 26
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
// Variabel waktu
int jam, menit, detik, tanggal, bulan, tahun;
// Variabel jadwal sholat
String jadwalSholat[] = {"Subuh: 06:30", "Dhuhur: 13:14", "Ashar: 15:30", "Maghrib: 18:00", "Isya: 20:30"};
void setup() {
// Inisialisasi serial monitor
Serial.begin(115200);
// Inisialisasi pin
pinMode(bUP, INPUT_PULLUP);
pinMode(bDN, INPUT_PULLUP);
pinMode(bOK, INPUT_PULLUP);
pinMode(Buzzer, OUTPUT);
// Inisialisasi LCD dan RTC
lcd.init();
lcd.backlight();
Wire.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
// Setup RTC waktu awal (hapus komentar jika ingin diatur)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Pesan awal pada LCD
lcd.setCursor(0, 0);
lcd.print("Alarm Sholat");
lcd.setCursor(0, 1);
lcd.print("Dengan ESP32");
delay(3000);
lcd.clear();
}
void loop() {
// Membaca waktu dari RTC
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
tanggal = now.day();
bulan = now.month();
tahun = now.year();
// Menampilkan waktu di LCD
lcd.setCursor(0, 0);
lcd.print("Waktu :");
lcd.print(konversi(jam) + ":" + konversi(menit) + ":" + konversi(detik));
lcd.setCursor(0, 1);
lcd.print("Tanggal:");
lcd.print(tanggal);
lcd.print("/");
lcd.print(bulan);
lcd.print("/");
lcd.print(tahun);
// Memeriksa jadwal sholat
for (int i = 0; i < 5; i++) {
if (isWaktuSholat(jadwalSholat[i])) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waktu Sholat!");
lcd.setCursor(0, 1);
lcd.print(jadwalSholat[i]);
alarmBuzzer();
delay(60000); // Tunggu selama 1 menit sebelum melanjutkan
}
}
delay(500); // Update setiap 500ms
}
// Fungsi untuk format waktu
String konversi(int angka) {
if (angka < 10) return "0" + String(angka);
return String(angka);
}
// Fungsi untuk memeriksa waktu sholat
bool isWaktuSholat(String jadwal) {
int jamSholat = jadwal.substring(jadwal.indexOf(":") - 2, jadwal.indexOf(":")).toInt();
int menitSholat = jadwal.substring(jadwal.indexOf(":") + 1, jadwal.indexOf(":") + 3).toInt();
return (jam == jamSholat && menit == menitSholat && detik == 0);
}
// Fungsi alarm buzzer
void alarmBuzzer() {
unsigned long startTime = millis();
while (millis() - startTime < 60000) { // Berjalan selama 60 detik (1 menit)
digitalWrite(Buzzer, HIGH);
delay(500);
digitalWrite(Buzzer, LOW);
delay(500);
}
}