Membuat Jam Waktu Shalat dengan Arduino

di masjid – masjid /atau mushola kita mungkin sering melihat jam digital yang menunjukkan jadwal shalat yang dapat berganti secara otomatis dan akan berbunyi ketika waktu shalat sudah tiba, saya sempat penasaran menegenai jam seperti ini, dulu setau saya jika kita ingin membuat jam seperti ini, kita harus menginputkan jadwal shalat tersebut secara manual kedalam EEPROM dan biasanya akan dirubah setahun sekali. Jadi saya sempat malas juga untuk mempelajarinya, karena saya rasa cara seperti ini sangat rumit, dan tidak efektif.
Kemudian saya terpikir untuk mempelajari bagaimana cara menentukan waktu shalat dengan metode hisab, dan setelah saya searching banyak artikel yang membahas ini, setelah saya sedikit memahami metode ini, kemudian saya coba mencari lagi library untuk menentukan waktu shalat, kemudian saya menemukan libraray prayertimes.h, setelah saya coba, ternyata memang bisa, hasilnya adalah seperti Gambar berikut :





Gambar diatas, adalah hasil dari example bawaan yang disediakan oleh library, jadi hasilnya belum terlihat rapih.
*** Untuk menampilkan waktu shalat yang akurat dibutuhkan latitude dan longitude posisi kita, atau posisi tempat yang ingin dipasangkan jam waktu shalat.
///


OK, saya rasa basa-basinya cukup ya :D , Untuk membuat jam waktu shalat ini, bahan-bahan yang dibutuhkan adalah sebagai berikut:
Hardware
Arduino
RTC DS3231
LCD 16x2

Software
Arduino IDE,

Library RTC DS3231

Library Prayertimes.h

kemudian untuk rangkaian hardware nya dapat dilihat pada Gambar berikut





kemudian jika rangkaiannya sudah, kita lanjut pada pemrograman nya, berikut adalah program yang saya gunakan
/*............................................................................................................*/
#include <LiquidCrystal.h>
#include <DS3231.h>
#include "PrayerTimes.h"
#define Ihtiyat 2 // sebagai waktu ihtiyat (untuk berhati-hati)
#define buzzer 13
#define LampuUtama 10
#define LampuTidur 9
#define JendelaOpen 7
#define JendelaClose 6
/*
* Urutan program
* 1. atur waktu dengan perintah double waktu[ sizeof( TimeName)/ sizeof( char*)];
* 2. jika ingin menambahkan waktu-waktu lain dapat mengubah array berikut : static const char *NamaWaktu [] ={ //array untuk waktu-waktu shalat
*
*/
double waktu[ sizeof(TimeName)/ sizeof( char*)]; //0.00
static const char *NamaWaktu [] ={ //array untuk waktu-waktu shalat
"Imsak" ,
"Subuh" ,
"Sunrise" ,// matahari terbit
"Dzuhur" ,
"Ashar" ,
"Sunset" ,
"Maghrib" ,
"Isya'"
};
const byte JUMLAH_WAKTU = sizeof( NamaWaktu )/ sizeof( char*); // = jumlah waktu (9)
// pengaturan bujur lintang (Malangbong)
float Latitude = -7.0642465 ; // lintang
float Longitude = 108.08357829999999 ; // bujur
int GMT = 7 ; // zona waktu WIB=7, WITA=8, WIT=9
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
DS3231 rtc(SDA, SCL);
Time clk;
void setup() {
Serial.begin(9600);
pinMode (buzzer, OUTPUT);
pinMode (LampuUtama, OUTPUT);
pinMode (LampuTidur, OUTPUT);
pinMode (JendelaOpen, OUTPUT);
pinMode (JendelaClose, OUTPUT);
rtc.begin();
lcd.begin(16,2);
set_calc_method (ISNA); // metode perhitungan
set_asr_method ( Shafii); // madzhab?
set_high_lats_adjust_method( AngleBased ); // Adjusting Methods for Higher Latitudes
set_fajr_angle (20); // sudut waktu subuh
set_isha_angle (18); // sudut waktu isyak
digitalWrite(LampuUtama, HIGH);
digitalWrite(LampuTidur, HIGH);
}
void loop() {
clk = rtc.getTime();
automation();
GetPrayerTimes();
}
void automation(){
int daj = clk.hour;
int dam = clk.min;
const int sleep = 21;
const int wakeUp = 04;
const int LampON = 17;
const int LampOFF = 06;
if (daj >= LampON && dam >= 25){ // jam 17:25 sore, lampu menyala
digitalWrite(LampuUtama, LOW);
} else if (daj == sleep && dam >= 30){
digitalWrite(LampuUtama, HIGH);
digitalWrite(LampuTidur, LOW);
} else if (daj == wakeUp && dam >= 10){
digitalWrite(LampuUtama, LOW);
digitalWrite(LampuTidur, HIGH);
} else if (daj == LampOFF && dam >= 00){
digitalWrite(LampuUtama, HIGH);
}
}
void GetPrayerTimes(){
get_prayer_times (clk.year, clk.mon, clk.date, Latitude, Longitude, GMT, waktu);
int jam, menit;
byte i = 0 ;
Serial.println(rtc.getDateStr());
Serial.println(rtc.getTimeStr());
Serial.println();
for( byte j= 0 ; j<7; j++){ // Karena yang akan ditampilkan hanya waktu imsak-isya (0-7)
get_float_time_parts(waktu[j], jam, menit); //get hours and minutes parts of a float time
int Min = menit + Ihtiyat;
if (Min > 60){
Min = Min - 60;
jam + 1;
}
if (j == 0){
Tampilkan(NamaWaktu[i], jam, Min-10);
i++;
Tampilkan(NamaWaktu[i], jam, Min);
} else {
Tampilkan(NamaWaktu[i], jam, Min);
} i++;
}
HomeDisplay();
delay(20000L);
}
void Tampilkan(char* TimesName, byte hours, byte minutes){
/*Tampilkan di serial Monitor
Serial.print('\t');
Serial.print( TimesName);
Serial.print('\t');
Serial.print( hours);
Serial.print(':');
Serial.print( minutes);
Serial.println();
*/
lcd.clear();
Row1Display();
lcd.setCursor(0,1);
lcd.print(TimesName); lcd.print(" >> ");
lcd.print(hours); lcd.print(":");
lcd.print(minutes);
if (clk.hour == hours && clk.min == minutes){
Serial.println("Waktu shalat telah tiba");
if (TimeName == "Sunrise" || TimeName == "Sunset"){
lcd.clear();
lcd.setCursor(0,0); lcd.print("Waktu");
lcd.setCursor(0,1); lcd.print(TimesName);
} else {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Waktunya Shalat");
lcd.setCursor(0,1); lcd.print(TimesName);
}
if (TimesName == "Subuh"){ Alarm(1000, 500); } else { Alarm(500, 5000); }
}
delay(2500);
}
void Alarm(int durasiON, int durasiOFF){
for(int t = 0; t < 8; t++){
digitalWrite(buzzer, HIGH);
delay (durasiON);
digitalWrite(buzzer, LOW);
delay (durasiOFF);
}
}
void HomeDisplay(){ //Tampilan default pada LCD, yang menampilkan tgl, waktu dan temperature
lcd.clear();
//Baris 1, menampilkan Hari, hari/bulan/tahun, dan nama bulan
lcd.setCursor(0,0); lcd.print(rtc.getDOWStr(FORMAT_SHORT));//Hari, col 0-3
lcd.setCursor(4,0); lcd.print(rtc.getDateStr(FORMAT_SHORT));//tanggal dd/mm/yyyy, col 4-12
lcd.setCursor(13,0); lcd.print(rtc.getMonthStr(FORMAT_SHORT));//bulan, col 13-15
//Baris 2, menampilkan Waktu (Jam:Menit), dan temperature
lcd.setCursor(0,1); lcd.print(rtc.getTimeStr(FORMAT_SHORT));//waktu HH:MM
lcd.print(" [] "); lcd.print(rtc.getTemp());//temperature cc.cc
lcd.print(" C");
}
void Row1Display(){
lcd.setCursor(0,0); lcd.print(rtc.getTimeStr(FORMAT_SHORT));//waktu HH:MM
lcd.print(" "); lcd.print(rtc.getDateStr(FORMAT_SHORT));//tanggal dd/mm/yy, col 4-12
}


Selesaii, Selamat Mencobaa.....
jika ada yang belum mengerti dapat ditanyakan dikolom komentar






Comments