Konversi Hijriah ke masehi di Arduino

 

source image https://apprecs.com/android/com.nom.dateconverterfull/date-calendar-converter-full

Berhubung kali ini bulan ramadhan, mungkin  sebagian teman-teman ada yang sedang mengerjakan atau tertarik untuk membuat project jam digital yang menampilkan bulan hijriah.

Ok, untuk mempersingkat waktu, langsung saja kita masuk ke pokok pembahasannya. artikel ini terinspirasi dari rumus berikut Konversi-Hijriyah-Masehi-Algoritma-Jean-Meeus-v1 source artikel nya saya lupa lagi, jadi mohon maaf untuk penulis, saya tidak bisa mencantumkan link langsung ke website beliau.

berikut adalah source yang saya buat


static const char* hijriMonth[] = {"Muharram", "Safar", "Rabi'ul Awwal", "Rabi'ul Akhir", "Jumadal Ula", "Jumadal Akhira", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhul Qa'ada", "Dhul Hijja"};
struct hijri {
int year;
int month;
int date;
};
int getMonth(uint8_t m) {
if (m < 3) {
return m + 12;
}
return m;
}
int getYear(uint16_t y, uint8_t m) {
if (m < 3) {
return y - 1;
}
return y;
}
String yearType(uint8_t d, uint8_t m, uint16_t y) {
if (y > 1582) {
return "GREGORIAN";
} else if (y < 1582) {
return "JULIAN";
} else if (m > 10) {
return "GREGORIAN";
} else if (m < 10) {
return "JULIAN";
} else if (d >= 15) {
return "GREGORIAN";
} else if (d <= 4) {
return "JULIAN";
} else {
return "SALAH";
}
}
hijri toHijri(uint8_t d, uint8_t m, uint16_t y) {
float around = 365.25;
uint8_t bulan = getMonth(m);
//Serial.print("bulan: ");
//Serial.println(bulan);
int tahun = getYear(y, m);
//Serial.print("tahun: ");
//Serial.println(tahun);
int alpha = tahun / 100;
//Serial.print("alpha: ");
//Serial.println(alpha);
int beta = 2 - alpha + (alpha / 4);
//Serial.print("beta: ");
//Serial.println(beta);
uint32_t b = uint32_t(around * tahun) + int(30.6001 * (bulan + 1)) + d + 1722519 + beta;
//Serial.print("b: ");
//Serial.println(b);
int c = uint16_t((b - 122.1) / around);
//Serial.print("c: ");
//Serial.println(c);
uint32_t _d = uint32_t(around * c);
//Serial.print("_d: ");
//Serial.println(_d);
int e = int((b - _d) / 30.6001);
//Serial.print("e: ");
//Serial.println(e);
String Cal = yearType(d, bulan, tahun);
int D, M, X;
if (Cal == "GREGORIAN") {
D = (b - _d) - int(30.6001 * e);
//Serial.print("D: ");
//Serial.println(D);
//Serial.println(int(30.6001 * e));
M = (e < 14) ? e - 1 : e - 13;
//Serial.print("M: ");
//Serial.println(M);
X = M < 3 ? c - 4715 : c - 4716;
//Serial.print("X: ");
//Serial.println(X);
}
int W = (X / 4 == 0) ? 1 : 2;
//Serial.print("W: ");
//Serial.println(W);
int N = int(275 * M / 9) - W * int((M + 9) / 12) + D - 30;
//Serial.print("N: ");
//Serial.println(N);
int A = X - 623;
//Serial.print("A: ");
//Serial.println(A);
int B = A / 4;
//Serial.print("B: ");
//Serial.println(B);
int C = A % 4;
//Serial.print("C: ");
//Serial.println(C);
float C1 = around * C + 0.01;
//Serial.print("C1: ");
//Serial.println(C1);
int C2 = C1 - int(C1) > 0.5 ? int(C1) + 1 : int(C1);
//Serial.print("C2: ");
//Serial.println(C2);
uint32_t Del = (1461UL * 349) + 170 + C2;
//Serial.print("DEL: ");
//Serial.println(Del);
int Q = int(Del / 10631UL);
//Serial.print("Q: ");
//Serial.println(Q);
int R = Del % 10631UL;
//Serial.print("R: ");
//Serial.println(R);
int J = int(R / 354);
//Serial.print("J: ");
//Serial.println(J);
int K = R % 354;
//Serial.print("K: ");
//Serial.println(K);
int O = int((11 * J + 14) / 30);
//Serial.print("O: ");
//Serial.println(O);
int H = 30 * Q + J + 1; //islamic year
//Serial.print("H: ");
//Serial.println(H);
int JJ = K - O + N - 1;
//Serial.print("JJ: ");
//Serial.println(JJ);
int CL = H % 30;
//Serial.print("CL: ");
//Serial.println(CL);
float DL = (11 * CL + 3) % 30;
//Serial.print("DL: ");
//Serial.println(DL);
int JJ_ = JJ;
if (JJ > 354) {
JJ_ = DL < 19 ? JJ - 354 : JJ - 355;
}
//Serial.print("JJ_: ");
//Serial.println(JJ_);
int JJ__ = JJ_ == 0 ? 355 : JJ_;
//Serial.print("JJ__: ");
//Serial.println(JJ__);
int S = int((JJ__ - 1) / 29.5);
//Serial.print("S: ");
//Serial.println(S);
int isM = JJ__ == 355 ? 12 : (S + 1); //islamic month
//Serial.print("islamic Month: ");
//Serial.println(isM);
int isD = JJ__ == 355 ? 30 : int(JJ__ - 29.5 * S);
//Serial.print("islamic Dat: ");
//Serial.println(isD);
hijri result = {H,isM, isD };
return result;
}

Sekian artikel ini, semoga bisa bermanfaat



Comments