#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include "font.h"
#include <RTClib.h>
#include "PrayerTimes.h"
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define DATA_PIN 5
#define CS_PIN 6
#define CLK_PIN 7
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
RTC_DS1307 rtc;
const char* hariID[] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
const char* blnID[] = {"Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des"};
String dot = "~";
String modeDisplay = "jam";
int counter = 0;
//parameter untuk waktu sholat
double waktu[sizeof(TimeName)/sizeof(char*)];
static const char* NamaWaktu[] ={"Imsak", "Subuh", "Syuruq", "Zuhur", "Ashar", "Terbenam", "Magrib", "Isya", "Count"};
const byte JUMLAH_WAKTU_DEFAULT = sizeof(waktu)/sizeof(double);
const byte JUMLAH_WAKTU = sizeof(NamaWaktu)/sizeof(char*);
const byte DATA_WAKTU = 2;
byte WaktuPenting[JUMLAH_WAKTU][DATA_WAKTU];
float _lat = -8.030118; //lokasi + jarak aman 2 menit
float _lng = 112.623029;
int _zona_waktu = 7;
int _sudut_subuh = 20;
int _sudut_isyak = 18;
const int setting = 12;
const int plus = 10;
const int minus = 11;
/*
bool set_thn_flag = true;
bool set_bln_flag = true;
bool set_tgl_flag = true;
*/
bool set_jam_flag = true;
bool set_mnt_flag = true;
/*
int thn = 0;
int bln = 0;
int tgl = 0;
*/
int jam = 0;
int mnt = 0;
void setup() {
P.begin();
P.setIntensity(7);
P.setFont(huruf);
rtc.begin();
//setup waktu sholat
set_calc_method(ISNA);
set_asr_method(Shafii);
set_high_lats_adjust_method(AngleBased);
set_fajr_angle(_sudut_subuh);
set_isha_angle(_sudut_isyak);
pinMode(setting, INPUT_PULLUP);
pinMode(plus, INPUT_PULLUP);
pinMode(minus, INPUT_PULLUP);
}
void loop() {
//mendapatkan perhitungan waktu sholat
DateTime now=rtc.now();
WaktuShalat(WaktuPenting, now.year(), now.month(), now.day());
//looping tampilan utama
view_display();
//interupsi tombol setting
if(digitalRead(setting) == LOW) {
delay(500);
while(set_jam_flag){
String jamnya = "jam:" + String(jam);
P.setTextAlignment(PA_LEFT);
P.print(jamnya);
delay(100);
if (digitalRead(plus) == LOW) {
jam = jam + 1;
if (jam > 23) jam = 0;
delay(100);
}
if (digitalRead(minus) == LOW) {
jam = jam - 1;
if (jam < 0) jam = 23;
delay(100);
}
if (digitalRead(setting) == LOW) {
set_jam_flag = false;
delay(250);
}
}
while(set_mnt_flag){
String mntnya = "mnt:" + String(mnt);
P.setTextAlignment(PA_LEFT);
P.print(mntnya);
delay(100);
if (digitalRead(plus) == LOW) {
mnt = mnt + 1;
if (mnt > 59) mnt = 0;
delay(100);
}
if (digitalRead(minus) == LOW) {
mnt = mnt - 1;
if (mnt < 0) mnt = 59;
delay(100);
}
if (digitalRead(setting) == LOW) {
set_mnt_flag = false;
delay(250);
}
}
rtc.adjust(DateTime(2024, 03, 17, jam, mnt, 0));
//view_display();
}
}
//fungsi looping tampilan utama
void view_display(){
DateTime now=rtc.now();
//display info jam
if(modeDisplay == "jam"){
if(dot == "~"){
dot = ":";
} else {
dot = "~";
}
String jam = String(printDigits(now.hour())) + dot + String(printDigits(now.minute()));
P.setTextAlignment(PA_CENTER);
P.print(jam);
counter++;
if(counter == 10){
modeDisplay = "tanggal";
counter = 0;
}
delay(1000);
//display info tanggal dan jadwal waktu sholat
}else if(modeDisplay == "tanggal"){
String txtHari = String(hariID[now.dayOfTheWeek()]) + " " + String(printDigits(now.day())) + " " + String(blnID[now.month()-1])+ " " + String(now.year());
String subuh = String(printDigits(WaktuPenting[1][0])) + ":" + String(printDigits(WaktuPenting[1][1]));
String zuhur = String(printDigits(WaktuPenting[3][0])) + ":" + String(printDigits(WaktuPenting[3][1]));
String ashar = String(printDigits(WaktuPenting[4][0])) + ":" + String(printDigits(WaktuPenting[4][1]));
String maghrib = String(printDigits(WaktuPenting[6][0])) + ":" + String(printDigits(WaktuPenting[6][1]));
String isya = String(printDigits(WaktuPenting[7][0])) + ":" + String(printDigits(WaktuPenting[7][1]));
String isiPesan = String(txtHari) + " Subuh " + String(subuh) + " Zuhur " + String(zuhur) + " Ashar " + String(ashar) + " Magrib " + String(maghrib) + " Isya " + String(isya);
const char* charPesan = isiPesan.c_str();
if (P.displayAnimate()){
P.displayText(charPesan, PA_LEFT, 70, 50, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
counter++;
if(counter == 2){
modeDisplay = "jam";
counter = 0;
}
}
}
/*
bool set_thn_flag = true;
bool set_bln_flag = true;
bool set_tgl_flag = true;
*/
bool set_jam_flag = true;
bool set_mnt_flag = true;
}
//fungsi perhitungan waktu sholat
void WaktuShalat(byte WaktuShalat[JUMLAH_WAKTU][DATA_WAKTU], int tahun, int bulan, int tanggal){
get_prayer_times(tahun, bulan, tanggal, _lat, _lng, _zona_waktu, waktu);
byte waktu_custom = 0;
for(byte i=0; i<JUMLAH_WAKTU_DEFAULT-1; i++){
int jam, menit;
get_float_time_parts(waktu[i], jam, menit);
if( i == 0 ){
WaktuPenting[waktu_custom][0] = jam;
WaktuPenting[waktu_custom][1] = menit - 10;
waktu_custom++;
WaktuPenting[waktu_custom][0] = jam;
WaktuPenting[waktu_custom][1] = menit;
} else {
WaktuPenting[waktu_custom][0] = jam;
WaktuPenting[waktu_custom][1] = menit;
}
waktu_custom++;
}
}
//fungsi prefix nol pada angka dibawah 10
String printDigits(int digits) {
if (digits < 10) {
return "0" + String(digits);
} else {
return String(digits);
}
}