cara membuat jam waktu sholat (JWS) panel P10 menggunakan arduino
Muhamad Irfandi
... menit baca
hai ketemu lagi, kali ini kita akan membuat jam waktu sholat (JWS) panel P10 menggunakan mikrokontroler arduino uno
#penting yang harus diperhatikan sebagai berikut :
- instal library (link sudah tersedia)
- pin pin harus sesuai tidak boleh salah (lihat gambar)
berikut komponen-komponen yang dibutuhkan :
- arduino
- module DS3231
- module bluetooth HC-05
- converter DMD to arduino
- kabel panel P10
- panel P10
- buzzer
https://drive.google.com/file/d/1mnZkns3dBsxAQsT-fP-eYKtsq62vqtwZ/view?usp=sharing
link download aplikasi setting JWS :
https://drive.google.com/file/d/1pH1TPrUxq9HeIO_5pvMxRrfV3gSzmV2J/view?usp=sharing
source code (coding)
#include <SPI.h>
#include <DMD3asis.h>
#include <font/KecNumber.h>
#include <font/BigNumber.h>
#include <font/Font4x6.h>
#include <font/SystemFont5x7.h>
#include <font/Font3x5.h>
#include <font2/Font6x7.h>
#include <DS3231.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#include <MemoryFree.h>
#define BUZZ 4
#define Font0 Font4x6
#define Font3 BigNumber
#define Font2 Font3x5
#define Font1 SystemFont5x7
#define Font4 KecNumber
#define Font5 Font6x7
// Object Declarations
DMD3 Disp(1,1);
char *pasar[] ={"WAGE", "KLIWON", "LEGI", "PAHING", "PON"};
int maxday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
RTClib RTC;
DS3231 Clock;
//Structure of Variable
typedef struct // loaded to EEPROM
{
uint8_t state; // 1 byte add 0
float L_LA; // 4 byte add 1
float L_LO; // 4 byte add 5
float L_AL; // 4 byte add 9
float L_TZ; // 4 byte add 13
uint8_t MT; // 1 byte add 17 // value 1-masjid 2-mushollah 3-surau 4-langgar
uint8_t BL; // 1 byte add 18
uint8_t IH; // 1 byte add 19
uint8_t SO; // 1 byte add 20
uint8_t JM; // 1 byte add 21
uint8_t I1; // 1 byte add 22
uint8_t I4; // 1 byte add 23
uint8_t I5; // 1 byte add 24
uint8_t I6; // 1 byte add 25
uint8_t I7; // 1 byte add 26
uint8_t BZ; // 1 byte add 27
uint8_t SI; // 1 byte add 28
uint8_t ST; // 1 byte add 29
uint8_t SU; // 1 byte add 30
int8_t CH; //20 1 byte add 31
int8_t II; //21 1 byte add 32
int8_t IS; //22 1 byte add 33
int8_t IL; //23 1 byte add 34
int8_t IA; //24 1 byte add 35
int8_t IM; //25 1 byte add 36
} struct_param;
typedef struct
{
uint8_t hD;
uint8_t hM;
uint16_t hY;
} hijir_date;
// Variable by Structure
struct_param Prm;
hijir_date nowH;
// Time Variable
DateTime now;
float floatnow = 0;
uint8_t daynow = 0;
uint8_t ty_puasa = 0;
uint8_t hd_puasa = 0;
int8_t SholatNow = -1;
boolean jumat = false;
boolean azzan = false;
uint8_t reset_x = 0;
//Other Variable
float sholatT[8] = {0,0,0,0,0,0,0,0};
uint8_t Iqomah[8] = {0,0,0,0,0,0,0,0};
//Blue tooth Pram Receive
char CH_Prm[155];
int DWidth = Disp.width();
int DHeight = Disp.height();
boolean DoSwap;
int RunSel = 1; //
int RunFinish = 0 ;
//=======================================
//===SETUP===============================
//=======================================
void setup()
{ //init comunications
Wire.begin();
Serial.begin(9600);
pinMode(BUZZ, OUTPUT);
// Get Saved Parameter from EEPROM
updateTime();
GetPrm();
//SendPrm();
//init P10 Led Disp & Salam
Disp_init();
}
//=======================================
//===MAIN LOOP Function =================
//=======================================
void loop()
{
// Reset & Init Display State
updateTime(); //every time
check_azzan(); //check Sholah Time for Azzan
DoSwap = false ;
fType(1);
Disp.clear();
// Timer Function every 10 Minutes
// Up All function with Timer in this fuction
Timer_Minute(1);
// =========================================
// List of Display Component Block =========
// =========================================
anim_JG(1); // addr: 1 show date time
dwMrq(drawMasjidName(),75,2,2); // addr: 2 show Masjid Name
dwMrq(drawDayDate() ,75,1,3); // addr: 3 show Hijriah date
dwMrq(msgPuasa(hd_puasa,ty_puasa),75,0,4); // addr: 5 show Remander Puasa
drawSholat(5); // addr: 5 show sholat time
dwMrq(drawInfo(130) ,75,1,6); // addr: 6 show Info 1
anim_DT(7); // addr: 7 show date time
dwMrq(drawInfo(280) ,75,2,8); // addr: 8 show Info 2
drawSholat(9); // addr: 9 show sholat time
dwMrq(drawInfo(430) ,75,1,10); // addr: 10 show Info 3
drawAzzan(100); // addr: 100 show Azzan
drawIqomah(101); // addr: 101 show Iqomah
dwMrq(drawInfo(580),50,0,102); //Message Sholat biasa // addr: 202 show Message Sholah
dwMrq(drawInfo(730),50,0,103); //Message Sholat jumat // addr: 203 show Message Jum'at
blinkBlock(104); // addr: 104 show Blink Sholat
// =========================================
// Display Control Block ===================
// =========================================
if(RunFinish==1) {RunSel = 2; RunFinish =0;} //after anim 1 set anim 2
if(RunFinish==2) {RunSel = 3; RunFinish =0;} //after anim 2 set anim 3
// if(RunFinish==3) {RunSel = 3; RunFinish =0;}
if(RunFinish==3) //after anim 3 set anim 5 or anim 4 if puasa
{
if (ty_puasa!=0) {RunSel = 4; RunFinish =0;}
else {RunSel = 5; RunFinish =0;}
}
if(RunFinish==4) {RunSel = 5; RunFinish =0;} //after anim 4 set anim 5
if(RunFinish==5) {RunSel = 6; RunFinish =0;} //after anim 5 set anim 6
if(RunFinish==6) {RunSel = 7; RunFinish =0;} //after anim 6 set anim 7
if(RunFinish==7) {RunSel = 8; RunFinish =0;} //after anim 7 set anim 8
if(RunFinish==8) {RunSel = 9; RunFinish =0;} //after anim 8 set anim 9
if(RunFinish==9) {RunSel = 10; RunFinish =0;} //after anim 9 set anim 10
if(RunFinish==10) {RunSel = 1; RunFinish =0;} //after anim 10 set anim 1
if(RunFinish==100 and jumat ) {RunSel = 103; RunFinish = 0; reset_x = 1;} //after Azzan Jumat (anim 100)
else if(RunFinish==100) {RunSel = 101; RunFinish =0;} //after Azzan Sholah (Iqomah)
if(RunFinish==101) {RunSel = 102; RunFinish =0; reset_x=1;} //after Iqomah(anim 101) set Message Sholah (anim 102)
if(RunFinish==102) {RunSel = 104; RunFinish =0;} //after Message Sholah (anim 102) set Blink Sholah(anim 104)
if(RunFinish==103) {RunSel = 104; RunFinish =0;} //after Messagw Jum'at (anim 103) set Blink Sholah(anim 104)
if(RunFinish==104) {RunSel = 1; RunFinish =0;} //after Blink Sholah back to anim 1
// =========================================
// Swap Display if Change===================
// =========================================
if(DoSwap){Disp.swapBuffers();} // Swap Buffer if Change
}
// =========================================
// DMD3 P10 utility Function================
// =========================================
void Disp_init()
{ Disp.setDoubleBuffer(true);
Timer1.initialize(2000);
Timer1.attachInterrupt(scan);
setBrightness(int(Prm.BL));
fType(1);
Disp.clear();
Disp.swapBuffers();
}
void setBrightness(int bright)
{ Timer1.pwm(9,bright);}
void scan()
{ Disp.refresh();}
// =========================================
// Time Calculation Block===================
// =========================================
void updateTime()
{ now = RTC.now();
floatnow = (float)now.hour() + (float)now.minute()/60 + (float)now.second()/3600;
daynow = Clock.getDoW(); // load day Number
}
void Timer_Minute(int repeat_time) //load every 1 minute
{
static uint16_t lsRn;
uint16_t Tmr = millis();
if((Tmr-lsRn)>(repeat_time*60000))
{
lsRn =Tmr;
update_All_data();
Serial.print("freeMemory()=");Serial.println(freeMemory());
SendPrm();
}
}
void update_All_data()
{
uint8_t date_cor = 0;
updateTime();
sholatCal(); // load Sholah Time
check_puasa(); // check jadwal Puasa Besok
if(floatnow>sholatT[6]) {date_cor = 1;} // load Hijr Date + corection next day after Mhagrib
nowH = toHijri(now.year(),now.month(),now.day(),date_cor); // load Hijir Date
if ((floatnow > (float)21) or (floatnow < (float)3.5) ) {setBrightness(15);}
else {setBrightness(Prm.BL);}
}
void check_azzan()
{ //Check Waktu Sholat
SholatNow = -1;
for(int i=0; i <=7; i++)
{
if (i!=0 and i!=2 and i!=3) // bukan terbit dan bukan dhuha
{
if(floatnow >= sholatT[i])
{
SholatNow = i;
if(!azzan and (floatnow > sholatT[i]) and (floatnow < (sholatT[i]+0.03)))
{
if(daynow ==6 and SholatNow ==4 and Prm.MT==1) {jumat=true;}
azzan =true;
RunSel = 100;
}
}
}
}
}
link video youtube
....coming soon
Terima kasih
Alim mulyadi

