Kode Progam Jadwal Sholat Arduino C++

Posted on

Saya mengajak teman-teman untuk dapat membuat jam sholat secara mandiri menggunakan Arduino. Di postingan saya memberikan kode program dasar untuk dapat menampilkan jadwal atau waktu sholat secara otomatis hanya dengan memasukkan koordinat, zona waktu, tanggal, bulan serta tahun seperti yang ditunjukkan pada gambar berikut ini:

Saya mendapatkan sebuah library yang sangat bagus di Github bernama Arduino-Prayer-Times yang di posting oleh asmaklad (tidak tahu apakah nama seseorang). Library merupakan hasil konversi dari http://praytimes.org/manual/. Terima kasih prayertimes.org dan asmaklad!

Setelah saya mencoba library , saya membandingkan dengan waktu sholat KEMENAG dan memiliki selisih perbedaan. Dari itu, saya sedikit memodifikasi library Prayer Times tersebut. Link Library yang sudah di edit dapat teman-teman download dengan klik tombol download berikut:



Kode Program

Contoh kode adalah sebagai berikut:

/* 
Library milik www.github.com/asmaklad
Kode dasar dari www.ElangSakti.com
Kode modifikasi oleh www.chippiko.com
*/

#include "PrayerTimes.h"

// Array untuk menyimpan waktu shalat
double waktu[sizeof(TimeName) / sizeof(char*)];

// Nama-nama waktu shalat
static const char* NamaWaktu[] = {
  "Imsak",
  "Subuh",
  "Terbit",
  "Dzuhur",
  "Ashar",
  "Terbenam",
  "Maghrib",
  "Isya'",
  "Count"
};

// Konstanta untuk jumlah waktu shalat default, jumlah waktu shalat, dan data waktu (jam dan menit)
const byte JUMLAH_WAKTU_DEFAULT = sizeof(waktu) / sizeof(double);
const byte JUMLAH_WAKTU = sizeof(NamaWaktu) / sizeof(char*);
const byte DATA_WAKTU = 2;  // jam dan menit
byte WaktuPenting[JUMLAH_WAKTU][DATA_WAKTU];

// Pengaturan tanggal, dan zona waktu
int _tahun = 2024;
int _bulan = 2;
int _hari = 8;  // tanggal

// Lintang dan bujur dapat diambil dari google maps
float _lat = 4.160260;   // lintang
float _lng = 96.132695;  // bujur
int _timezone = 7;       // zona waktu WIB=7, WITA=8, WIT=9

// Sudut subuh dan isyak Indonesia
int _sudut_subuh = 20;
int _sudut_isyak = 18;

// Koreksi waktu sholat dalam menit:
int koreksiImsak = 10;
int koreksiSubuh = 3;
int koreksiTerbit = -4;
int koreksiZuhur = 3;
int koreksiAshar = 3;
int koreksiTerbenam = -10;
int koreksiMagrib = 3;
int koreksiIsya = 2;

void setup() {
  Serial.begin(9600);

  // CalculationMethod:
  //  Jafari,    Ithna Ashari
  //  Karachi,   University of Islamic Sciences, Karachi
  //  ISNA,      Islamic Society of North America (ISNA)
  //  MWL,       Muslim World League (MWL)
  //  Makkah,    Umm al-Qura, Makkah
  //  Egypt,     Egyptian General Authority of Survey
  //  Custom,    Custom Setting
  set_calc_method(Makkah);
  //--------------------------------------------------

  // set_asr_method:
  //Shafii,    // Shafii (standard)
  //Hanafi,    // Hanafi
  set_asr_method(Shafii);
  //--------------------------------------------------

  // AdjustingMethod:
  //  None,        // No adjustment
  //  MidNight,   // middle of night
  //  OneSeventh, // 1/7th of night
  //  AngleBased, // angle/60th of night
  set_high_lats_adjust_method(AngleBased);
  //-------------------------------------------------

  set_fajr_angle(_sudut_subuh);  // sudut waktu subuh
  set_isha_angle(_sudut_isyak);  // sudut waktu isyak

  // Menghitung waktu shalat dan mencetaknya
  WaktuShalat(WaktuPenting);
  CetakWaktuShalat();
}

void loop() {
}

// Fungsi untuk mencetak waktu shalat ke Serial Monitor
void CetakWaktuShalat() {
  Serial.println("  ===========================");
  Serial.print("   Jadwal Sholat : ");
  Serial.print(_hari);
  Serial.print("/");
  Serial.print(_bulan);
  Serial.print("/");
  Serial.print(_tahun);
  Serial.println();
  Serial.println("  ===========================");

  for (byte i = 0; i < JUMLAH_WAKTU - 1; i++) {
    Serial.print("\t");
    Serial.print(NamaWaktu[i]);
    Serial.print("\t");
    Serial.print(DuaDigit(WaktuPenting[i][0]));
    Serial.print(":");
    Serial.println(DuaDigit(WaktuPenting[i][1]));
  }
  Serial.println();
}

// Fungsi untuk menghitung waktu shalat
void WaktuShalat(byte WaktuShalat[JUMLAH_WAKTU][DATA_WAKTU]) {
  get_prayer_times(_tahun, _bulan, _hari, _lat, _lng, _timezone, 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);

    // Menambahkan koreksi waktu sesuai dengan waktu shalat
    if (i == 0) {  // Subuh
      menit += koreksiSubuh;
      //Tampilkan waktu Imsak
      WaktuPenting[waktu_custom][0] = jam;
      WaktuPenting[waktu_custom][1] = menit - koreksiImsak;
    } else if (i == 1) {  // Terbit
      menit += koreksiTerbit;
    } else if (i == 2) {  // Dzuhur
      menit += koreksiZuhur;
    } else if (i == 3) {  // Ashar
      menit += koreksiAshar;
    } else if (i == 4) {  // Terbenam
      menit += koreksiTerbenam;
    } else if (i == 5) {  // Maghrib
      menit += koreksiMagrib;
    } else if (i == 6) {  // Isya
      menit += koreksiIsya;
    }

    // Jika menit melebihi 60, tambahkan satu jam
    if (menit >= 60) {
      jam++;
      menit -= 60;
    }

    waktu_custom++;
    WaktuPenting[waktu_custom][0] = jam;
    WaktuPenting[waktu_custom][1] = menit;
  }
}

// Fungsi untuk memastikan angka dua digit
String DuaDigit(byte angka) {
  if (angka > 9) {
    return String(angka);
  } else {
    String tmp = "0";
    tmp.concat(angka);
    return tmp;
  }
}


Hasil

Setelah kode di upload ke Arduino, buka serial monitor dan kita akan mendapatkan hasil sebagai gambar berikut:

Kode Progam Jadwal Sholat Arduino C++


Semoga artikel Kode Progam Jadwal Sholat Arduino C++ ini bermanfaat. Jika teman-teman ada saran dan kritikan, mohon komentar dibawah.