Konversi penanggalan Masehi ke Hijriah menggunakan Arduino

Penanggalan masehi mengacu pada peredaran matahari, satu tahun masehi terhitung sebesar 365,25 hari, sedangkan Kalender hijriah mengacu pada peredaran bulan, waktu 12 kali peredaran bulan terhitung sebesar 354,367068 hari.
Untuk konversi masehi ke hijriah mengikuti kaidah berikut ini :

  1. Basis perhitungan Masehi ditetapkan pada 18 April 1999.
  2. Basis perhitungan Hijriah ditetapkan pada 1 Muharram 1420.
  3. Jumlah hari dalam satu bulan Hijriah adalah: 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29(30).
  4. Berlaku dari jam 00.00 hingga waktu Maghrib karena penanggalan Hijriah berganti hari pada waktu Maghrib

penerapan dalam Arduino bisa menggunakan program/sketch berikut ini:

double tahunBulan = 354.367068;
double tahunMatahari = 365.25;

String namaBulanHijriah[] = {"Muharram","Safar","Rabiul awal","Rabiul akhir","Jumadil awal","Jumadil akhir","Rajab","Sya'ban","Ramadhan","Syawal","Dzulkaidah","Dzulhijjah"};
String namaBulanMasehi[] = {"Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"};
uint16_t jumlahHariPerBulanHijriah[] = {0,30,59,89,118,148,177,207,236,266,295,325,354};
uint16_t jumlahHariPerBulanMasehi[]={0,31,59,90,120,151,181,212,243,273,304,334};

void setup() {
  Serial.begin(9600);
  Serial.println("Konversi Penanggalan Masehi ke Hijriah");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  uint32_t jumlahHari;
  double jumlahHariMatahari;
  
  byte tanggalMasehi = 16;
  byte bulanMasehi = 3;
  uint16_t tahunMasehi = 2018;

  byte tanggalHijriah;
  byte bulanHijriah;
  uint16_t tahunHijriah;

  jumlahHari = jumlahHariDariTanggal(tanggalMasehi, bulanMasehi, tahunMasehi - 2000);
  masehiKeHijriah(jumlahHari, &tanggalHijriah, &bulanHijriah, &tahunHijriah);

  Serial.print(tanggalMasehi);
  Serial.print(" ");
  Serial.print(namaBulanMasehi[bulanMasehi-1]);
  Serial.print(" ");
  Serial.print(tahunMasehi);

  Serial.print(" == ");

  Serial.print(tanggalHijriah);
  Serial.print(" ");
  Serial.print(namaBulanHijriah[bulanHijriah-1]);
  Serial.print(" ");
  Serial.println(tahunHijriah);

  while(1);
}

//tanggal mulai dari 1
//bulan mulai dari 1
//tahun dua digit
//minggu = 1, sabtu = 7
//base 18 April 1999
uint32_t jumlahHariDariTanggal(byte tanggal, byte bulan, uint16_t tahun)
{
  uint32_t jumlahHari = (uint32_t)tahun * 365;
  for (uint16_t i = 0; i < tahun; i++) 
  {
    if (!(i%4))
    {
      jumlahHari++;
    }
  }
  jumlahHari += jumlahHariPerBulanMasehi[bulan-1];
  if ( (bulan >= 2) && !(tahun % 4)) 
  { 
    jumlahHari++;
  }
  jumlahHari+= tanggal;
  return jumlahHari + 259;// base 18 April 1999
}

void masehiKeHijriah(uint32_t HariMasehi, byte *tanggal, byte *bulan, uint16_t *tahun)
{
  uint16_t sisaHari;
  *tahun = floor(HariMasehi/tahunBulan);
  sisaHari = HariMasehi - (tahunBulan * *tahun);

  for(byte i=0;i<sizeof(jumlahHariPerBulanHijriah);i++)
  {
    if(sisaHari <= jumlahHariPerBulanHijriah[i])
    {
      sisaHari -= jumlahHariPerBulanHijriah[i-1];
      *bulan = i;
      break;
    }
  }
  *tanggal = sisaHari;
  *tahun += 1420;
}

hasil keluaran di serial monitor:

Catatan : metode ini memiliki kekurangan yaitu menghitung penanggalan Hijriah dengan jumlah bulan yang tetap (hanya bagus untuk mengenal prinsip konversi) untuk konversi yang lebih presisi bisa menggunakan metode Julian Date :
Konversi masehi ke Pasaran Jawa dan Hijriah dengan metode Julian Date

5 thoughts on “Konversi penanggalan Masehi ke Hijriah menggunakan Arduino

Leave a Reply

Your email address will not be published. Required fields are marked *