Membuat Counter Mundur Menuju Azan dengan Arduino Wemos
#include <Wire.h>
#include "RTClib.h"
#include "SPI.h"
#include <DMD2.h>
#include "PrayerTimes.h"
#include <fonts/SystemFont5x7.h>
#include <fonts/Droid_Sans_12.h>
#include <fonts/angka_2.h>
/*
* Koneksi Pin RTC3231 ke PIN Arduiono UNO
* GND -> GND
* VCC -> +5V
* SCL -> A5
* SDA -> A4
*
* Wemos SCL -> D1
* SDA -> D2
*
* Pin P10 ke Arduino Wemos
Pin 1(Enable) ----> D4
Pin 2 (A) ----> D0
Pin 4 (B) ----> D6
Pin8 ( CLK) ----> D5
Pin 10 (SCLK) ----> D3
Pin 12 (DATA) ----> D7
*
*
* SPIDMD dmd(2, 1, D4,D0,D6,D3);
*/
void Running(String s);
String Konversi(int sInput);
int tulisan_menuju_azan(int jam,int menit,String* waktu_sholat);
//Init RTC
RTC_DS3231 rtc;
//Konstanta
boolean issetting=false;
// Set Width to the number of displays wide you have
const int WIDTH = 2;
// You can change to a smaller font (two lines) by commenting this line,
// and uncommenting the line after it:
const uint8_t *FONT = Droid_Sans_12;
const uint8_t *FONT2 = Droid_Sans_12;
//const uint8_t *FONT3 =Droid_Sans_16;
const uint8_t *FONT4 = SystemFont5x7;
//SPIDMD dmd(WIDTH,1); // aktifkan ini jika menggunakan ESP8266, disable baris atasnya
SPIDMD dmd(2, 1, D4,D0,D6,D3);
int AKecerahan=1;
int speaker=D8; //buat beep
int jam_sholat;int menit_sholat;
//// marquee values
int marX = 1; // awal kotak running text minimal diawali 1.
int marY = 1;
int marWidth = 63; // dimensi running text 32 dikurangi marX.
int marHeight = 16;
int marCur = marX + marWidth; // kursor
//marCur = marX + marWidth;
int messageCount; // karakter yang aktif
//int widthCount; // sisa lebar satu huruf terakhir
int messageLength; // jumlah karakter pada pesan
boolean blinking=true;
int i=0;
boolean jalan=true;
int hours, minutes; //jam sholat dan menit sholat
String jam1;
String jam2;
String waktu_subuh;int jam_subuh;int menit_subuh;
String waktu_terbit;
String waktu_duhur;int jam_duhur;int menit_duhur;
String waktu_azar;int jam_azar;int menit_azar;
String waktu_magrib;int jam_magrib;int menit_magrib;
String waktu_isya;int jam_isya;int menit_isya;
String waktu_imsyak;
boolean setting=false;
String lintange;
String bujure;
String Ze="7";
double times[sizeof(TimeName) / sizeof(char*)];
String get_imsyak(int jam_subuh,int menit_subuh);
//uint32_t jumlahHariDariTanggal(byte tanggal, byte bulan, uint16_t tahun);
//void masehiKeHijriah(uint32_t HariMasehi, byte *tanggal, byte *bulan, uint16_t *tahun);
int jeda_menuju_azan=30;
// the setup routine runs once when you press reset:
void setup() {
pinMode(speaker, OUTPUT);
Serial.begin(9600);
Wire.begin(D1,D2);
rtc.begin();
dmd.setBrightness(10);
dmd.begin();
dmd.selectFont(SystemFont5x7);
dmd.clearScreen();
//inisialisasi awal jika sudah running live harus di remark
rtc.adjust(DateTime(2022, 9, 18, 11, 46, 0));
} //end of setup
void loop()
{
dmd.setBrightness(100);
DateTime now = rtc.now();
uint32_t jumlahHari;
double jumlahHariMatahari;
byte tanggalMasehi = now.day();
byte bulanMasehi =now.month();
uint16_t tahunMasehi =now.year();
int jam= now.hour();
int menit=now.minute();
int detik=now.second();
///================pengaturan koordinat-gunakan gps android untuk menentukan posisi anda=================
//sby
// double lintang = -7.4726; //Latitude
// double bujur = 112.6675; //Longitude
//tangsel
double lintang = -6.3088649; //Latitude
double bujur = 106.682188; //Longitude
int Z = 7 ; //Zona Waktu GMT WIB biasanya 7
int interval=0;
long mulai = millis();
set_calc_method(ISNA); //Methode perhitungan mengikuti ISNA
set_asr_method(Shafii); //Pendapat Imam Syafi'i
set_high_lats_adjust_method(AngleBased);
set_fajr_angle(20); //Sudut Waktu Subuh
set_isha_angle(18); ////Sudut Waktu Isya
get_prayer_times(tahunMasehi,bulanMasehi, tanggalMasehi, lintang, bujur, Z, times);
//Subuh
get_float_time_parts(times[0], hours, minutes);
jam_subuh=hours;menit_subuh=minutes;
// jam_subuh=jam_sholat;menit_subuh=menit_sholat;
waktu_subuh=Konversi(jam_subuh)+ ":"+Konversi(menit_subuh);
//Imsyak
waktu_imsyak=get_imsyak(jam_subuh,menit_subuh);
//waktu terbit
get_float_time_parts(times[1], hours, minutes);
waktu_terbit=Konversi(hours)+ ":"+Konversi(minutes);
//Waktu duhur
get_float_time_parts(times[2], hours, minutes);
jam_sholat=hours;menit_sholat=minutes;
jam_duhur=jam_sholat;menit_duhur=menit_sholat;
waktu_duhur=Konversi(jam_duhur)+ ":"+Konversi(menit_duhur);
//waktu ashar
get_float_time_parts(times[3], hours, minutes);
jam_sholat=hours;menit_sholat=minutes;
jam_azar=jam_sholat;menit_azar=menit_sholat;
waktu_azar=Konversi(jam_azar)+ ":"+Konversi(menit_azar);
//waktu_magrib
get_float_time_parts(times[4], hours, minutes);
jam_sholat=hours;menit_sholat=minutes;
jam_magrib=jam_sholat;menit_magrib=menit_sholat;
waktu_magrib=Konversi(jam_magrib)+ ":"+Konversi(menit_magrib);
//waktu Isya
get_float_time_parts(times[6], hours, minutes);
jam_sholat=hours;menit_sholat=minutes;
jam_isya=jam_sholat;menit_isya=menit_sholat;
waktu_isya=Konversi(jam_isya)+ ":"+Konversi(menit_isya);
/******* MAIN RUNNING TEXT ****/
///String running_jadwal_sholat=Konversi(tanggalMasehi)+"-"+ Konversi(bulanMasehi) + "-"+ Konversi(tahunMasehi) + " IMSAK "+waktu_imsyak+" SUBUH " + waktu_subuh + " TERBIT "+waktu_terbit + " DHUHUR " + waktu_duhur + " ASHAR " + waktu_azar + " MAGRIB " + waktu_magrib + " ISYA' "+ waktu_isya ;
//jam_besar(30);
//Running(running_jadwal_sholat);
/*--- Menampilan menuju jadwal sholat kurang berapa menit --*/
String waktu_sholat;
int kurang=tulisan_menuju_azan(jam,menit,&waktu_sholat);
String jam_sho="";
if (kurang!=-1)
{
// dmd.clearScreen();
if(waktu_sholat=="ISYA'") { jam_sho=waktu_isya;}
else if(waktu_sholat=="SUBUH") { jam_sho=waktu_subuh;}
else if(waktu_sholat=="DZUHUR") { jam_sho=waktu_duhur;}
else if(waktu_sholat=="ASHAR") { jam_sho=waktu_azar;}
else if(waktu_sholat=="MAGRIB") { jam_sho=waktu_magrib;}
String tulisan_kurang="ADZAN " + waktu_sholat + " "+ jam_sho + " -"+ String(kurang) + " Menit " ;
Running(tulisan_kurang);
//digitalWrite(D4,LOW);
if (kurang==0)
{
dmd.clearScreen();
int lama=9; //3 menit
for(i=0;i<5*lama;i++)
{
//hhuruf adzan berkedip2
dmd.selectFont(SystemFont5x7);
dmd.drawString(33,0,"ADZAN");
dmd.drawString(33,9,waktu_sholat);
delay(1000);
dmd.selectFont(SystemFont5x7);
dmd.drawString(33,0," ");
dmd.drawString(33,9," ");
delay(1000);
}
}
}
}
void Running(String s)
{
DateTime now = rtc.now();
int jam= now.hour();
int menit=now.minute();
int detik=now.second();
String waktu1=Konversi(jam)+":"+Konversi(menit);//+":"+Konversi(detik)+" ";
dmd.selectFont(angka_2);
dmd.drawString(33,0,waktu1);
marX=1;
marY=9;
jalan=true;
while(jalan)
{
messageLength = s.length()+65;
//Geser 1 pixel dulu.
dmd.movePixels(marX, marY, marX-1, marY, marWidth, marHeight);
marCur = marCur-1;
if (marCur == marX + marWidth - dmd.charWidth(s[messageCount],FONT)-1) {
marCur = marX + marWidth;
messageCount = messageCount+1;
if (messageCount == messageLength){
messageCount = 0;
jalan=false;
}
}
dmd.selectFont(SystemFont5x7);
dmd.drawChar(marCur, marY , s[messageCount]); // tulis karakter baru setelah digeser
delay(50);
i++;
if(i*50 >600)
{
DateTime now = rtc.now();
int jam= now.hour();
int menit=now.minute();
int detik=now.second();
// String waktu1=Konversi(jam)+":"+Konversi(menit)+" ";
String waktu1=Konversi(jam)+":"+Konversi(menit);//+":"+Konversi(detik)+" ";
String waktu2=Konversi(jam)+" "+Konversi(menit);//+" "+Konversi(detik)+" ";
if (blinking)
{
dmd.selectFont(angka_2);
dmd.drawString(33,0,waktu1);
//beep(300);
blinking=false;
}
else
{
dmd.selectFont(angka_2);
dmd.drawString(33,0,waktu2);
blinking=true;
}
i=0;
}
}
}
///Konversi angka agar ada nol didepannya jika diawah 10
String Konversi(int sInput) {
if (sInput < 10)
{
return"0" + String(sInput);
}
else
{
return String(sInput);
}
}
String get_imsyak(int jam_subuh,int menit_subuh)
{
if (menit_subuh-10 <0)
{
int menit=60+(menit_subuh-10);
int jam=jam_subuh-1;
return Konversi(jam)+":"+Konversi(menit);
}
else
{
return Konversi(jam_subuh)+":"+Konversi(menit_subuh-10);
}
}
int tulisan_menuju_azan(int jam,int menit,String* waktu_sholat)
{
int selisih;
String waktu;
int selisih_waktu_isya=(jam_isya*60+menit_isya) -(jam*60+menit);
int selisih_waktu_subuh=(jam_subuh*60+menit_subuh) -(jam*60+menit);
int selisih_waktu_duhur=(jam_duhur*60+menit_duhur) -(jam*60+menit);
int selisih_waktu_azar=(jam_azar*60+menit_azar) -(jam*60+menit);
int selisih_waktu_magrib=(jam_magrib*60+menit_magrib) -(jam*60+menit);
if(selisih_waktu_isya>=0 && selisih_waktu_isya<=jeda_menuju_azan ){ selisih=selisih_waktu_isya; waktu="ISYA'";}
else if(selisih_waktu_subuh>=0 && selisih_waktu_subuh<=jeda_menuju_azan ){ selisih=selisih_waktu_subuh; waktu="SUBUH";}
else if(selisih_waktu_duhur>=0 && selisih_waktu_duhur<=jeda_menuju_azan ){ selisih=selisih_waktu_duhur; waktu="DZUHUR";}
else if(selisih_waktu_azar>=0 && selisih_waktu_azar<=jeda_menuju_azan ){ selisih=selisih_waktu_azar; waktu="ASHAR";}
else if(selisih_waktu_magrib>=0 && selisih_waktu_magrib<=jeda_menuju_azan ){ selisih=selisih_waktu_magrib; waktu="MAGRIB";}
else { selisih=-1; waktu="-----";}
int s=selisih;
*waktu_sholat=waktu;
return s;
}