Membuat Jam Digital Masjid dengan Arduino tanpa EEPROM - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

Membuat Jam Digital Masjid dengan Arduino tanpa EEPROM

Tidak ada komentar
Kali ini ElangSakti.com akan berbagi source code / coding jadwal shalat dengan Arduino. Source code ini menjadi jantung dari jam digital masjid yang biasanya dipasang di dinding masjid untuk menampilkan jadwal shalat secara otomatis, atau ada juga yang menyebutnya alarm sholat otomatis. Gambar di bawah ini hanya ilustrasi. :)

Membuat Jam Digital Masjid dengan Arduino tanpa EEPROM

Otomatis Update Selamanya tanpa EEPROM

Berbeda dengan beberapa jadwal sholat menggunakan EEPROM untuk menyimpan jadwal sholat tahunan. Source code ini sangat fleksibel dan tidak perlu update jadwal secara rutin, sebab jadwal sholat dihasilkan dari proses perhitungan sebagaimana hisab yang biasanya dilakukan oleh kementrian agama. Ada rumus yang ditanam dalam program ini. Sehingga alat ini tidak memerlukan EEPROM untuk menyimpan jadwal sholat yang biasanya hanya berisi 1 tahun saja.

Misal Anda menjual alat dengan teknik penentuan jadwal sholat ini, ada beberapa kelebihan atau kekurangan yang akan Anda alami :
  • Customer tidak perlu repot update jadwal setiap bulan atau setiap tahun
  • Anda sebagai penjual alat juga tidak perlu repot melakukan update jadwal sholat secara berkala
  • Tapi Anda sebagai penjual alat tidak akan mendapat tip tambahan karena customer tidak perlu jasa update jadwal dari Anda lagi :D
  • Alat bisa dikirim ke mana saja, yang penting Anda tahu titik lintang bujurnya, Anda tidak direpotkan dengan tabel jadwal tahunan yang angkanya banyak berbaris-baris itu. :)
  • Customer juga bisa dengan mudah mengganti lokasi lintang bujur apabila customer tiba-tiba berubah menjadi reseller atau agen Anda, enak kan?
  • Tidak perlu ada software untuk memprogram jadwal dari komputer karena data yang dimasukkan simpel.
  • Perhitungan jadwal sholat ini berlaku di seluruh kota dan kabupaten se-Indonesia!

Hanya Source Code Menghitung Jadwal Sholat

Source code yang kita bagikan hanya untuk menghitung jadwal sholat dalam 1 hari. Jika Anda berharap bahwa source code ini sudah diintegrasikand dengan RTC, LED P10, bluetooth, suara MP3, dan sebagainya dan sebagainya, maka Anda salah kamar. Jika Anda ingin belajar, coba kembangkan source code ini. Jika Anda ingin jualan, silakan kembangkan source code ini juga, Hehehe. Berikut ini adalah contoh outputd dari source code yang kita buat :

Jadwal Sholat Sepanjang Masa dengan Arduino tanpa EEPROM

Silakan dikembangkan! Jika dalam pengembangannya Anda menemukan masalah, silakan tanyakan di komentar.

Coding Arduino dan Penjelasannya

Setelah Anda copas atau melihat source code di bawah ini, silakan lanjutkan dengan membaca penjelasannya. Sebab, ada beberapa hal yang perlu Anda perhatikan agar mudah jika ingin melakukan modifikasi.

Pada dasarnya nama waktu sholat adalah bahasa Inggris, namun kita modifikasi agar yang muncul bahasa Indonesia. Lalu, sebenarnya dalam library tidak dihitung waktu imsak, tapi kita modifikasi juga agar bisa menampilkan waktu imsak. Source code lengkapnya seperti ini.

  #include "PrayerTimes.h"
  
  /*
   * Program Menentukan Waktu Shalat
   * Berdasarkan lokasi lintang dan bujur.
   * 
   * Explored by www.ElangSakti.com
   * 
   */
  
  double waktu[sizeof(TimeName)/sizeof(char*)];
  
  static const char* NamaWaktu[] ={
      "Imsak",
      "Subuh",
      "Syuruq",
      "Dzuhur",
      "Ashar",
      "Terbenam",
      "Maghrib",
      "Isya'",
      "Count"
    };
  
  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 jam dan tanggal
  int _tahun = 2017;
  int _bulan = 11;
  int _hari = 19; // tanggal
  
  // pengaturan bujur lintang (Malang)
  float _lat = -7.9786395;    // lintang
  float _lng = 112.5617424;   // bujur
  
  // timezone
  int _timezone = 7; // zona waktu WIB=7, WITA=8, WIT=9
  
  // sudut subuh dan maghrib Indonesia
  int _sudut_subuh = 20;
  int _sudut_isyak = 18;
  
  
  void setup() {
    
      Serial.begin(19200);
  
      set_calc_method(ISNA);  // metode perhitungan
      set_asr_method(Shafii); // madzhab?
      set_high_lats_adjust_method(AngleBased);
      set_fajr_angle(_sudut_subuh);     // sudut waktu subuh
      set_isha_angle(_sudut_isyak);     // sudut waktu isyak
      
  }
  
  void loop() {
      
      WaktuShalat(WaktuPenting);
      CetakWaktuShalat();
      
      delay(60000L);
      
  }
  
  
  void CetakWaktuShalat(){
      
      Serial.println("  ===========================");
      Serial.print("   Imsakiyah Tgl. ");
      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++){
          
          if( i == 5 ) continue;
          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();
  }
  
  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);
          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++;
      }
  }
  
  String DuaDigit(byte angka){
      if( angka > 9 ){
          return String(angka);
      } else {
          String tmp = "0";
          tmp.concat(angka);
          return tmp;
      }
  }


Cerita tentang Library dan Perhitungannya

Library yang kita gunakan untuk perhitungan adalah PrayerTimes buatan asmaklad (bisa didownload dari https://github.com/asmaklad/Arduino-Prayer-Times). Sebenarnya saya mencoba untuk mengonversi program PrayTimes buatan Hamid Zarraby - Zadeh dkk yang bisa bisa didownload di http://praytimes.org/code/. Akan tetapi proses konversi menjadi mandeg, sebab hasil perhitungan tanggal Juliannya overflow. :P

Tanggal julian mencapai 2 juta lebih, sedangkan itu sudah batas atas untuk tipe data float. Pakai double juga tidak mungkin. Jadi, sempat frustasi karena nilai tanggalnya selisih 0.5 an. Hehe, memang tabiat penulis, jika ada proses yang salah, kalau dilanjutkan hasilnya akan tetap salah. Supaaya tidak buang-buang waktu, maka kita memutuskan untuk menghentikan proses konversi.

Setelah proses konversi dihentikan, selanjutnya adalah googling contoh library yang sudah jadi. Bertemulah dengan PrayerTimes buatan si asmaklad. Langsung dicoba mengubah tanggal, sudut subuh dan isyak, lalu mengubah timezone, dan yang terakhir mengubah lintang dan bujur. Hasilnya, cocok!

Kita cocokkan dengan beberapa jadwal milik kemenag di alamat http://sihat.kemenag.go.id/waktu-sholat, hasilnya lebih cepat 2 menit. Berarti dalam program sudah diberi batas aman 2 menit, atau memang yang di kemenag yang diberi batas aman 2 menit. Jadi, hasil perhitungan jadwal sholat dengan library ini sudah bagus.

Akan tetapi, ternyata ketika kita cek tanggal juliannya juga sama, hasil perhitungannya  tanggal Juliannya juga overflow. Jadi, kelkeliruan data sedikit pada tanggal Julian tidak berpengaruh banyak ya... :D

Akan tetapi, selisih 2 menit bisa "diakali" dengan fasilitas untuk mengoreksi data, itu bukan masalah serius bagi Anda yang sudah terbiasa membuat program. Akhirnya, library ini sudah kita pakai untuk mengembangkan alarm adzan otomatis yang sedang kita ujicoba. :)

Keterangan Program

Saat Anda mulai memodifikasi program di atas, silakan perhatikan baik-baik variabel ini:

// pengaturan jam dan tanggal
int _tahun = 2017;
int _bulan = 11;
int _hari = 19; // tanggal

// pengaturan lintang bujur (Malang)
float _lat = -7.9786395;    // lintang
float _lng = 112.5617424;   // bujur

// timezone
int _timezone = 7; // zona waktu WIB=7, WITA=8, WIT=9

// sudut subuh dan Isya' Indonesia
int _sudut_subuh = 20;
int _sudut_isyak = 18;

Pengaturan Tanggal

Untuk coba-coba, Anda bisa mengisi tanggal (hari, bulan, dan tahun) secara manual. Akan tetapi, jika ingin otomatis, silakan kombinasikan dengan RTC. Anda bisa mencoba RTC DS1307 atau DS1302. Jika ingin digunakan dalam jangka panjang dan lebih valid, gunakan RTC DS3231.

Pengaturan Lintang dan Bujur

Lintang dan bujur bisa Anda cari di google maps. Atau, beberapa website di internet juga menginformasikan lintang dan bujur kota dan kabupaten di Indonesia. Anda bisa mengacu pada lintag dan bujur tersebut. Cara lain untuk mengetahui lintang dan bujur adalah dengan aplikasi WA (Whatsapp), silakan aktifkan GPS Anda, lalu kirim lokasi Anda ke temannya. Nanti lokasi yang terkirim bisa digunakan untuk mengetahui lintang dan bujur posisi Anda saat ini.

Jika Anda bingung, silakan tanyakan di komentar ya.

Pengaturan Timezone

Zona waktu di Indonesia ada 3, yaitu WIB (Waktu Indonesia Barat), WITA (Waktu Indonesia Tengah), dan WIT (Waktu Indonesia Timur). WIB, WITA, dan WIB memiliki nilai masing-masing. WIB = 7, WITA = 8, dan WIT = 9. Jika Anda di posisi WITA, silakan isi _timezone dengan angka 8.

Jika ada yang kurang jelas, Anda boleh bertanya di komentar.

Pengaturan Sudut Subuh dan Isya'

Berdasarkan ketetapan (ini juga dipakai oleh kemenag), bahwa sudut subuh dan isyak untuk seluruh Indonesia sudah ditetapkan. Jadi, jika Anda membuat alat yang akan digunakan di seluruh Indonesia, Anda tidak perlu mengganti nilai _sudut_subuh dan _sudut_isyak.


Written by Hari Santoso
Membuat Jam Digital Masjid dengan Arduino tanpa EEPROM
Bahasan: Kali ini ElangSakti.com akan berbagi source code / coding jadwal shalat dengan Arduino . Source code ini menjadi jantung dari jam digital ...
Published at Minggu, 19 November 2017, Updated at Minggu, 19 November 2017
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar