#include <avr/wdt.h> //watchdog library, library bawaan
#include <avr/sleep.h>
#include <Wire.h>
#include <stdio.h>
#include <RTClib.h> // Library untuk RTC DS3231
#include "PrayerTimes.h" // Library waktu sholat
#include "formula.h"
RTC_DS1307 rtc; // Membuat objek RTC
double times[sizeof(TimeName) / sizeof(char*)];
int GMT = 7; // Zona waktu WIB=7, WITA=8, WIT=9, inisialisasi GMT
ISR(WDT_vect)
{
wdt_disable(); // disable watchdog
}
void myWatchdogEnable(const byte interval)
{
MCUSR = 0; // reset various flags
WDTCSR |= 0b00011000; // see docs, set WDCE, WDE
WDTCSR = 0b01000000 | interval; // set WDIE, and appropriate delay
wdt_reset();
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_mode(); // now goes to Sleep and waits for the interrupt
}
unsigned long previousMillis = 0; // Waktu terakhir pembaruan dilakukan
const unsigned long interval = 1000; // Interval 1 menit (60.000 ms)
void setup() {
Serial.begin(115200);
Wire.begin(); // Inisialisasi I2C
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
unsigned long currentMillis = millis(); // Dapatkan waktu saat ini
// Periksa apakah interval waktu 1 menit telah berlalu
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Perbarui waktu sebelumnya
displayTime();
}
}
void displayTime() {
float latitude = -7.817272;
float longitude = 110.3399212;
DateTime now = rtc.now(); // Ambil waktu sekarang dari RTC
int bulan = now.month();
uint16_t tgl = now.day();
hijri H = toHijri(tgl, bulan, now.year()); // Konversi tanggal sekarang ke Hijriah
Serial.print("Latitude: ");
Serial.println(latitude);
Serial.print("Longitude: ");
Serial.println(longitude);
Serial.print("GMT: ");
Serial.println(GMT);
Serial.print("Masehi: ");
Serial.println(String(tgl) + "/" + String(bulan) + "/" + now.year());
Serial.print("Hijriah: ");
Serial.print(H.date);
Serial.print("/");
Serial.print(hijriMonth[H.month - 1]);
Serial.print("/");
Serial.println(H.year);
set_calc_method(ISNA); // Metode kalkulasi
set_asr_method(Shafii); // Metode Asr
set_high_lats_adjust_method(AngleBased);
set_fajr_angle(20);
set_isha_angle(18);
get_prayer_times(int(now.year()), int(now.month()), int(now.day()), latitude, longitude, GMT, times);
for (int i = 0; i < sizeof(times)/sizeof(times[0]); i++) {
Serial.print("Time ");
Serial.print(i);
Serial.print(": ");
Serial.println(times[i], 6); // Cetak dengan 6 desimal untuk melihat nilai float
}
int hours, minutes;
// Koreksi waktu sholat masing-masing
int koreksiImsak = -5;
int koreksiSubuh = 0;
int koreksiDhuha = 0;
int koreksiDzuhur = 0;
int koreksiAshar = 0;
int koreksiMaghrib = 0;
int koreksiIsya = 0;
// Imsak
get_float_time_parts(times[0], hours, minutes);
minutes += koreksiImsak;
adjustTime(hours, minutes);
Serial.print("Imsak: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Subuh
minutes -= koreksiImsak; // Kembalikan ke waktu asli
minutes += koreksiSubuh;
adjustTime(hours, minutes);
Serial.print("Subuh: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Dhuha
get_float_time_parts(times[1], hours, minutes);
minutes += koreksiDhuha;
adjustTime(hours, minutes);
Serial.print("Dhuha: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Dzuhur
get_float_time_parts(times[2], hours, minutes);
minutes += koreksiDzuhur;
adjustTime(hours, minutes);
Serial.print("Dzuhur: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Ashar
get_float_time_parts(times[3], hours, minutes);
minutes += koreksiAshar;
adjustTime(hours, minutes);
Serial.print("Ashar: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Maghrib
get_float_time_parts(times[5], hours, minutes);
minutes += koreksiMaghrib;
adjustTime(hours, minutes);
Serial.print("Maghrib: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
// Isya
get_float_time_parts(times[6], hours, minutes);
minutes += koreksiIsya;
adjustTime(hours, minutes);
Serial.print("Isya: ");
Serial.print(hours);
Serial.print(":");
Serial.println(minutes);
Serial.println("---------------------------");
}
// Fungsi untuk menyesuaikan jam dan menit jika ada koreksi waktu
void adjustTime(int &hours, int &minutes) {
while (minutes >= 60) {
hours += 1;
minutes -= 60;
}
while (minutes < 0) {
hours -= 1;
minutes += 60;
}
// Pastikan jam berada dalam rentang 0-23
if (hours >= 24) {
hours -= 24;
}
if (hours < 0) {
hours += 24;
}
}