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
Selesaii, Selamat Mencobaa.....
jika ada yang belum mengerti dapat ditanyakan dikolom komentar
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*............................................................................................................*/ | |
#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
Post a Comment