- Arduino UNO
- 1 Panel LED P10
- Bluetooth HC-05 atau HC-06
- RTC DS3231
- Buzzer Active
- Konverter Arduino ke DMD
- Charge HP 5V untuk power JWS
- Kabel Jumper secukupnya
- Kabel USB
Peralatan yang di perlukan
- Komputer atau Laptop yang sdh terintal Arduino IDE 1.8.5
- Sumber Listrik
Gambar :
Source Code :
Terdiri dari 6 File
- File Utama
- File Perhitungan Waktu Sholat
- File gambar desai Tampilan
- File Parameter
- File Penamaan ID
- File Tampilan Puasa
File Utama :
//**************************************************************************************/ #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 <font/Angka6x7.h> #include <DS3231.h> #include <EEPROM.h> #include <avr/pgmspace.h> #include <Wire.h> #include <MemoryFree.h> #define BUZZ A0 #define Font0 Font4x6 #define Font3 BigNumber #define Font2 Font3x5 #define Font1 SystemFont5x7 #define Font4 KecNumber #define Font5 Angka6x7 // 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 1 byte add 0 float L_LA; //2 4 byte add 1 float L_LO; //3 4 byte add 5 float L_AL; //4 4 byte add 9 float L_TZ; //5 4 byte add 13 uint8_t MT; //6 1 byte add 17 // value 1-masjid 2-mushollah 3-surau 4-langgar uint8_t BL; //7 1 byte add 18 uint8_t IH; //8 1 byte add 19 uint8_t SO; //9 1 byte add 20 uint8_t JM; //10 1 byte add 21 uint8_t I1; //11 1 byte add 22 uint8_t I4; //12 1 byte add 23 uint8_t I5; //13 1 byte add 24 uint8_t I6; //14 1 byte add 25 uint8_t I7; //15 1 byte add 26 uint8_t BZ; //16 1 byte add 27 uint8_t SI; //17 1 byte add 28 uint8_t ST; //18 1 byte add 29 uint8_t SU; //19 1 byte add 30 int8_t CH; //20 1 byte add 31 } 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); // Get Saved Parameter from EEPROM updateTime(); GetPrm(); //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) //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; } } } } }
//------------------------------------------ // Function calculate Pray Time //------------------------------------------ /*Macro Function */ #define d2r(x) x*M_PI/180 #define r2d(x) x*180/M_PI //Constanta const float lunarY = 354.367068f; // Main Function void sholatCal() { float EJD = E_Julian_date(now.year(),now.month(),now.day(),Prm.L_LO); float Decl=Dql(EJD); float EqOfTime=EqT(EJD); Pray_Time(Prm.L_TZ, Prm.L_LA, Prm.L_LO,Prm.L_AL,Decl, EqOfTime ); } //Julian Date at GMT mid day float E_Julian_date(int Year,int Month,int Days,float Longitude) // juliant date - 2451545 { if (Month <= 2) { Year -= 1; Month += 12; } float A = floor(((float)Year/100.0)); float B = 2 - A + floor(A/4.0); float CLong = Longitude/(float)(15 * 24); float JD = floor(365.25 *(float)(Year+ 4716)) - 2451545 + floor(30.6001 * (float)(Month + 1)) + (float)Days + B - 1524.5 -CLong; return JD; } //Sun Declination float EqT(const float EJD) { float g = fix_angle(357.529f + 0.98560028f* EJD); float q = fix_angle(280.459f + 0.98564736f* EJD); float L = fix_angle(q + 1.915* sin(d2r(g)) + 0.020* sin(d2r(2*g))); float e = (23.439f - 0.00000036f* EJD); float RA = r2d(atan2(cos(d2r(e))* sin(d2r(L)), cos(d2r(L))))/ 15; float Eq =(q/15-fix_hour(RA)); return Eq; // Ds = r2d(asin(sin(d2r(e))* sin(d2r(L)))); // declination of the Sun } float Dql(float EJD) { float g = fix_angle((357.529f + 0.98560028f* EJD)); float q = fix_angle((280.459f + 0.98564736f* EJD)); float L = fix_angle((q + 1.915f* sin(d2r(g)) + 0.020f* sin(d2r(2*g)))); float e = (23.439f - 0.00000036f* EJD); float dd = r2d(asin(sin(d2r(e))* sin(d2r(L)))); // declination of the Sun return dd; } float HourAngle( float Alfa, float Declination, float Latitude) { float rn =acos( (-sin(d2r(Alfa))-sin(d2r(Latitude))*sin(d2r(Declination))) / (cos(d2r(Latitude))*cos(d2r(Declination))) )/15; return r2d(rn); } void Pray_Time(float TimeZone, float Latitude, float Longitude,float Altitude,float Declination, float EquationOfTime ) { // Dzuhur float BaseTime = fix_hour((float)12+TimeZone-(Longitude/15)-EquationOfTime); sholatT[4] = BaseTime + (float)Prm.IH/60; // Ashr float alfa =r2d(-atan(1 / (1+tan(d2r(fabs(Latitude-Declination)))))); float HA = HourAngle(alfa,Declination,Latitude); sholatT[5] = BaseTime + HA + (float)Prm.IH/60; // Maghrib alfa = 0.8333f+0.0347f*sqrt(Altitude); HA = HourAngle(alfa,Declination,Latitude); sholatT[6] = BaseTime + HA + (float)Prm.IH/60; // Terbit sholatT[2] = BaseTime - HA; // Isya HA = HourAngle((float)18,Declination,Latitude); sholatT[7] = BaseTime + HA + (float)Prm.IH/60; // Shubuh HA = HourAngle((float)20,Declination,Latitude); sholatT[1] = BaseTime - HA + (float)Prm.IH/60; // Imsak sholatT[0] = sholatT[1]-(float)10/60; // Dhuha HA = HourAngle((float)-4.5,Declination,Latitude); sholatT[3] = BaseTime - HA; char buff[100]; } float fix_hour(float a) { a = a - (float)24.0 * floor(a / 24.0); a = a < 0.0 ? a + 24.0 : a; return a; } float fix_angle(float a) { a = a - (float)360.0 * floor(a / 360.0); a = a < 0.0 ? a + 360.0 : a; return a; } //------------------------------------------ // Function calculate Hijriah Date //------------------------------------------ long Days(uint16_t Y,uint8_t M,uint8_t D) { if (M < 3) { Y -= 1; M +=12; } Y = Y - 2000; long ndays= floor(365.25*Y)+floor(30.6001*(M + 1))+floor(Y/100)+floor(Y/400)+D+196; //long ndays= d1 + d2 - A + B + D + 196; return ndays; } long DaysHijri(uint16_t Y,uint8_t M,uint8_t D) { Y = Y - 1420; long hari = floor(29.5*M - 28.999)+floor(lunarY*Y)+D ; return hari; } hijir_date toHijri(uint16_t Y, uint8_t M, uint8_t D,uint8_t cor) // core --> corection date today=0 yesterday=-1 tomorrow=1 { hijir_date BuffDate; long nday = Days(Y, M, D)+ Prm.CH + cor; long tahun = floor(nday/lunarY) + 1420; long bulan = 1; long harike = 1; while(DaysHijri(tahun, bulan, 1) <= nday){tahun++;}; tahun--; while(DaysHijri(tahun, bulan, 1) <= nday){bulan++;}; bulan--; harike = 1 + nday - DaysHijri(tahun, bulan, 1); if (bulan == 13){bulan = 12; harike += 29;}; BuffDate.hD = harike; BuffDate.hM = bulan; BuffDate.hY = tahun; return BuffDate; }File gambar desai Tampilan :
// ========================================= // Drawing Content Block==================== // ========================================= void drawAzzan(int DrawAdd) { // check RunSelector if(!dwDo(DrawAdd)) return; uint8_t ct_limit =40; //harus angka genap static uint8_t ct; static uint16_t lsRn; uint16_t Tmr = millis(); if((Tmr-lsRn) > 500 and ct <= ct_limit) { lsRn = Tmr; if((ct%2) == 0) { //Disp.drawRect(1,2,62,13); fType(0); dwCtr(0,0,"ADZAN"); fType(1); if(jumat) {dwCtr(0,8,sholatN(8));} else {dwCtr(0,8,sholatN(SholatNow));} Buzzer(1); } else { Buzzer(0);} DoSwap = true; ct++; } if ((Tmr-lsRn)>2000 and (ct > ct_limit)) {dwDone(DrawAdd); ct = 0; Buzzer(0);} } void drawIqomah(int DrawAdd) // Countdown Iqomah (9 menit) { // check RunSelector if(!dwDo(DrawAdd)) return; static uint16_t lsRn; uint16_t Tmr = millis(); static int ct; int mnt, scd,cn_l ; char locBuff[6]; cn_l = (Iqomah[SholatNow]*60); //Disp.drawRect(1,2,62,13); if((Tmr-lsRn) > 1000 and ct <=cn_l) { lsRn = Tmr; mnt = floor((cn_l-ct)/60); scd = (cn_l-ct)%60; if(mnt>0) {sprintf(locBuff,"%02d:%02d",mnt,scd);} else {sprintf(locBuff,"%02d",scd);} if((ct%2) == 0){ fType(0); dwCtr(0,-1,"IQOMAH");} fType(0); dwCtr(0,8,locBuff); if (ct> (cn_l-10)) Buzzer(1); // Buzzer on 2 seccon before Iqomah ct++; DoSwap = true; } if (ct > cn_l) { dwDone(DrawAdd); ct = 0; Buzzer(0); } } void drawSholat_S(int sNum,int c) // Box Sholah Time { char BuffTime[10]; char BuffShol[7]; float stime = sholatT[sNum]; uint8_t shour = floor(stime); uint8_t sminute = floor((stime-(float)shour)*60); uint8_t ssecond = floor((stime-(float)shour-(float)sminute/60)*3600); sprintf(BuffTime,"%02d:%02d",shour,sminute); // Disp.drawRect(c+1,2,62,13); fType(1); dwCtr(c,0,sholatN(sNum)); fType(0); dwCtr(c,9,BuffTime); DoSwap = true; } void drawSholat(int DrawAdd) { // check RunSelector // int DrawAdd = 0b0000000000000100; if(!dwDo(DrawAdd)) return; static uint8_t x; static uint8_t s; // 0=in, 1=out static uint8_t sNum; static uint16_t lsRn; uint16_t Tmr = millis(); uint8_t c=0; uint8_t first_sNum = 0; int DrawWd=DWidth - c; if((Tmr-lsRn)>10) { if(s==0 and x<(DrawWd/2)){x++;lsRn=Tmr;} if(s==1 and x>0){x--;lsRn=Tmr;} } if((Tmr-lsRn)>2000 and x ==(DrawWd/2)) {s=1;} if (x == 0 and s==1) { if (sNum <7 0="" 1="" 2="" 3="" 7="" and="" buff="" buffh="" buffm="" c="" char="" d="" date="" disp.drawfilledrect="" disp.drawtext="" doswap="true;" drawgreg_ds="" drawsholat_s="" drawsmallts="" dwctr="" dwdone="" else="" first_snum="" ftype="" if="" int="" isp.drawline="" lsrn="" mr-lsrn="" now.day="" now.hour="" now.minute="" now.month="" now.year="" or="" raw="" rawadd="" rawwd="" rm.si="=0" rm.st="=0" rm.su="=0" s="=" snum="" sprintf="" static="" tmr="millis();" uff="" uffh="" uffm="" uint16_t="" void="" x-10="" x="" y-2="" y="">1000) lsRn = Tmr; DoSwap = true; } void drawGreg_TS(uint16_t y) // Draw Time { char Buff[20]; //sprintf(Buff,"%02d:%02d:%02d",now.hour(),now.minute(),now.second()); sprintf(Buff,"%02d:%02d",now.hour(),now.minute()); dwCtr(0,y,Buff); DoSwap = true; } void drawGreg_cil(uint16_t y) // Draw Time { char Buff[20]; sprintf(Buff,"%02d:%02d:%02d",now.hour(),now.minute(),now.second()); dwCtr(0,y,Buff); DoSwap = true; } void Jam_GD(uint16_t y) // Draw Time Depan { char BuffJ[6]; char BuffM[6]; char BuffD[6]; sprintf(BuffJ,"%02d",now.hour()); sprintf(BuffM,"%02d",now.minute()); sprintf(BuffD,"%02d",now.second()); fType(5); Disp.drawText(0,y,BuffJ); Disp.drawText(0,y+8,BuffM); fType(3); Disp.drawText(19,y,BuffD); Disp.drawRect(15,y+3,16,y+5,1); Disp.drawRect(15,y+10,16,y+12,1); DoSwap = true; } void anim_DT(int DrawAdd) { // check RunSelector if(!dwDo(DrawAdd)) return; static uint8_t y; static uint8_t s; // 0=in, 1=out static uint16_t lsRn; uint16_t Tmr = millis(); if((Tmr-lsRn)>100) { if(s==0 and y<17 and="" if="" lsrn="Tmr;y++;}" s="=1" y="">0){lsRn=Tmr;y--;} } if((Tmr-lsRn)>10000 and y ==17) {s=1;} if (y==7) { // Disp.drawRect(1,2,62,13); } if (y == 0 and s==1) {dwDone(DrawAdd); s=0;} fType(4); drawGreg_cil(y-16); // fType(2); //drawGreg_DS(16-y); } void anim_JG(int DrawAdd) { // check RunSelector if(!dwDo(DrawAdd)) return; static uint8_t y; static uint8_t s; // 0=in, 1=out static uint16_t lsRn; uint16_t Tmr = millis(); if((Tmr-lsRn)>100) { if(s==0 and y<17 and="" if="" lsrn="Tmr;y++;}" s="=1" y="">0){lsRn=Tmr;y--;} } if((Tmr-lsRn)>10000 and y ==17) {s=1;} if (y==7) { // Disp.drawRect(1,2,62,13); } if (y == 0 and s==1) {dwDone(DrawAdd); s=0;} //fType(1); //drawGreg_TS(y-8); Jam_GD(17-y); } void dwMrq(const char* msg, int Speed, int dDT, int DrawAdd) { // check RunSelector static uint16_t x; if(!dwDo(DrawAdd)) return; if (reset_x !=0) { x=0;reset_x = 0;} static uint16_t lsRn; int fullScroll = Disp.textWidth(msg) + DWidth; uint16_t Tmr = millis(); if((Tmr-lsRn)> Speed) { lsRn=Tmr; if (x < fullScroll) {++x;} else { dwDone(DrawAdd); x = 0;return;} if(dDT==1) { fType(1); //Marquee Disp.drawText(DWidth - x, 0, msg); fType(0); if (x<=6) { drawGreg_TS(16-x);} else if (x>=(fullScroll-6)) { drawGreg_TS(16-(fullScroll-x));} else { Disp.drawRect(1,8,30,8); drawGreg_TS(9);} } else if(dDT==2) { fType(0); if (x<=6) { drawGreg_TS(x-6);} else if (x>=(fullScroll-6)) { drawGreg_TS((fullScroll-x)-6);} else { Disp.drawRect(1,7,30,7); drawGreg_TS(-1);} fType(1); //Marquee Disp.drawText(DWidth - x, 9 , msg); } else { fType(1); Disp.drawLine(1,2,62,2); Disp.drawLine(1,13,62,13); Disp.drawText(DWidth - x, 4, msg); } DoSwap = true; } } void blinkBlock(int DrawAdd) { // check RunSelector if(!dwDo(DrawAdd)) return; static uint16_t lsRn; static uint16_t ct, ct_l; uint16_t Tmr = millis(); int mnt, scd;// char locBuff[6];// if(jumat) {ct_l = Prm.JM * 60;} else {ct_l = Prm.SO * 60;} jumat =false; if((Tmr-lsRn)> 1000) { lsRn=Tmr; //Disp.drawChar(1, 1 , ct); mnt = floor((ct_l-ct)/60); scd = (ct_l-ct)%60; sprintf(locBuff,"%d:%02d",mnt,scd); fType(2); Disp.drawText(1,7,locBuff); // tampil tunggu sholat if((ct%2) == 0) { Disp.drawFilledRect(DWidth-3, DHeight-3, DWidth-2, DHeight-2);} DoSwap = true; ct++;} if (ct> ct_l) { dwDone(DrawAdd); azzan = false; ct = 0; } // Disp.drawText(1,7,String(ct_l-ct)); } // ========================================= // Drawing Tools============================ // ========================================= boolean dwDo(int DrawAdd) { if (RunSel== DrawAdd) {return true;} else return false;} void dwDone(int DrawAdd) { RunFinish = DrawAdd; RunSel = 0;} void dwCtr(int x, int y,const char* Msg) { int tw = Disp.textWidth(Msg); int th = Disp.textHeight(); int c = int((DWidth-x-tw)/2); Disp.drawFilledRect(x+c-1,y,x+tw+c,y+th,0); Disp.drawText(x+c,y,Msg);} void Buzzer(uint8_t state) { if(state ==1 and Prm.BZ == 1) {tone(BUZZ, 500, 400);} else {noTone(BUZZ);} } void fType(int x) { if(x==0) Disp.setFont(Font0); else if(x==1) Disp.setFont(Font1); else if(x==2) Disp.setFont(Font2); else if(x==3) Disp.setFont(Font3); else if(x==4) Disp.setFont(Font4); else Disp.setFont(Font5); } // digunakan untuk menghitung hari pasaran int jumlahhari(){ DateTime now = RTC.now(); int d= now.day(); int m= now.month(); int y= now.year(); int hb[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; int ht = (y - 1970) * 365 - 1; int hs = hb[m - 1] + d; int kab = 0; int i; if(y % 4 == 0) { if(m > 2) { hs++; } } for(i = 1970; i < y; i++) { if(i % 4 == 0) { kab++; } } return (ht + hs + kab); } 17>17>7>
File Parameter :
void serialEvent()
{
int prm_idx = 0;
char bchar;
bchar =Serial.peek();
if ((bchar == 'C') or (bchar == 'N') or (bchar == 'S'))
{
while ((bchar != '\n')and(prm_idx < 150))
{
if(Serial.available())
{
bchar = (char)Serial.read();
CH_Prm[prm_idx]=bchar;
prm_idx ++;
Buzzer(1);
}
}
CH_Prm[prm_idx-1]='\0';
LoadPrm();
}
else
{
while(Serial.available()) {Serial.read();}
}
}
void LoadPrm()
{
String BT_Param;
uint16_t eeAdd = 0;
uint8_t eePut = 0;
uint8_t eeMax = 0;
uint8_t lenprm = strlen(CH_Prm)-3;
// Put Char Data
if (CH_Prm[0]=='C')
{ if(CH_Prm[1]=='M' and CH_Prm[2]=='N') {eeAdd = 58; eeMax=24;}
else if(CH_Prm[1]=='M' and CH_Prm[2]=='A') {eeAdd = 85; eeMax=44;}
else if(CH_Prm[1]=='N' and CH_Prm[2]=='1') {eeAdd = 130; eeMax=149;}
else if(CH_Prm[1]=='N' and CH_Prm[2]=='2') {eeAdd = 280; eeMax=149;}
else if(CH_Prm[1]=='N' and CH_Prm[2]=='3') {eeAdd = 430; eeMax=149;}
else if(CH_Prm[1]=='S' and CH_Prm[2]=='M') {eeAdd = 580; eeMax=149;}
else if(CH_Prm[1]=='J' and CH_Prm[2]=='M') {eeAdd = 730; eeMax=149;}
int eeCount =0;
while((eeCount<= lenprm) and (eeCount < eeMax))
{
EEPROM.update(eeAdd+eeCount,CH_Prm[3+eeCount]);
eeCount++;
}
EEPROM.update(eeAdd+eeCount,'\0');
}
// Put Numeric Data
else if (CH_Prm[0] =='N')
{
BT_Param = String(CH_Prm);
if(BT_Param.substring(1,3).equals("LA")) {eeAdd = 1 ; eePut=1;}
else if(BT_Param.substring(1,3).equals("LO")) {eeAdd = 5 ; eePut=1;}
else if(BT_Param.substring(1,3).equals("AL")) {eeAdd = 9 ; eePut=1;}
else if(BT_Param.substring(1,3).equals("TZ")) {eeAdd = 13; eePut=1;}
else if(BT_Param.substring(1,3).equals("MT")) {eeAdd = 17; eePut=2;}
else if(BT_Param.substring(1,3).equals("BL")) {eeAdd = 18; eePut=2;}
else if(BT_Param.substring(1,3).equals("IH")) {eeAdd = 19; eePut=2;}
else if(BT_Param.substring(1,3).equals("SO")) {eeAdd = 20; eePut=2;}
else if(BT_Param.substring(1,3).equals("JM")) {eeAdd = 21; eePut=2;}
else if(BT_Param.substring(1,3).equals("I1")) {eeAdd = 22; eePut=2;}
else if(BT_Param.substring(1,3).equals("I4")) {eeAdd = 23; eePut=2;}
else if(BT_Param.substring(1,3).equals("I5")) {eeAdd = 24; eePut=2;}
else if(BT_Param.substring(1,3).equals("I6")) {eeAdd = 25; eePut=2;}
else if(BT_Param.substring(1,3).equals("I7")) {eeAdd = 26; eePut=2;}
else if(BT_Param.substring(1,3).equals("BZ")) {eeAdd = 27; eePut=2;}
else if(BT_Param.substring(1,3).equals("SI")) {eeAdd = 28; eePut=2;}
else if(BT_Param.substring(1,3).equals("ST")) {eeAdd = 29; eePut=2;}
else if(BT_Param.substring(1,3).equals("SU")) {eeAdd = 30; eePut=2;}
else if(BT_Param.substring(1,3).equals("CH")) {eeAdd = 31; eePut=3;} //update
if(eePut == 1)
{
EEPROM.put(eeAdd,BT_Param.substring(3,BT_Param.length()).toFloat());
}
if(eePut == 2)
{
EEPROM.put(eeAdd,(uint8_t)BT_Param.substring(3,BT_Param.length()).toInt());
}
if(eePut == 3) // put uint8_t
{
EEPROM.put(eeAdd,(int8_t)BT_Param.substring(3,BT_Param.length()).toInt());
}
}
else
if (CH_Prm[0]=='S' and CH_Prm[1]=='D' and CH_Prm[2]=='T')
{
BT_Param = String(CH_Prm);
Clock.setClockMode(false);
Clock.setDate(byte(BT_Param.substring(3,5).toInt()));
Clock.setMonth(byte(BT_Param.substring(5,7).toInt()));
Clock.setYear(byte(BT_Param.substring(7,9).toInt()));
Clock.setHour(byte(BT_Param.substring(9,11).toInt()));
Clock.setMinute(byte(BT_Param.substring(11,13).toInt()));
Clock.setSecond(byte(BT_Param.substring(13,15).toInt()));
Clock.setDoW(byte(BT_Param.substring(15,16).toInt()));
}
// Get New/updeted parameter*/
GetPrm();
}
void GetPrm()
{
// Serial.println("Get parameter");
// Get Parameter and check
EEPROM.get(0, Prm);
if(Prm.state != 212) //check value of Prm State .. set Default
{
set_default_prm();
}
if (now.year() < 2018)//check date time .. less than 1 jan 2018 set Default
{
set_default_time();
}
Iqomah[1]=Prm.I1;
Iqomah[4]=Prm.I4;
Iqomah[5]=Prm.I5;
Iqomah[6]=Prm.I6;
Iqomah[7]=Prm.I7;
// user New Parameter
setBrightness(int(Prm.BL));
update_All_data();
// SendPrm();
}
void set_default_prm()
{
// Put Parameter start form addr 500
Prm = (struct_param){212,-6.39524,106.80256,45,7,1,20,2,10,30,15,10,10,7,10,1,1,1,1,0};
EEPROM.put(0,Prm);
EEPROM.put(58, "Mujahid 212\0");
EEPROM.put(85, "Sragen\0");
EEPROM.put(130,"Info 1\0");
EEPROM.put(280,"Info 2\0");
EEPROM.put(430,"Info 3\0");
EEPROM.put(580,"Lurus dan rapatkan Shaf sebelum Sholat ...\0");
EEPROM.put(730,"Harap Tenang dan Matikan HP Anda\0");
}
void set_default_time()
{
Clock.setClockMode(false); // set to 24h
Clock.setYear(byte(18));
Clock.setMonth(byte(1));
Clock.setDate(byte(1));
Clock.setDoW(byte(2));
Clock.setHour(byte(12));
Clock.setMinute(byte(0));
Clock.setSecond(byte(0));
Clock.turnOffAlarm(1);
Clock.turnOffAlarm(2);
}
// for debug
void SendPrm()
{
// char Info1[150];
Serial.print(F("NLA : ")); Serial.print(Prm.L_LA,7);Serial.print("\t");
Serial.print(F("NLO : ")); Serial.print(Prm.L_LO,7);Serial.print("\n");
Serial.print(F("NAL : ")); Serial.print(Prm.L_AL,7);Serial.print("\t");
Serial.print(F("NTZ : ")); Serial.print(Prm.L_TZ,0);Serial.print("\n");
Serial.print(F("NMT : ")); Serial.print(Prm.MT);Serial.print("\t");
Serial.print(F("NIH : ")); Serial.print(Prm.IH);Serial.print("\t");
Serial.print(F("NCH : ")); Serial.print(Prm.CH);Serial.print("\n");
Serial.print(F("NSO : ")); Serial.print(Prm.SO);Serial.print("\t");
Serial.print(F("NJM : ")); Serial.print(Prm.JM);Serial.print("\n");
Serial.print(F("NI1 : ")); Serial.print(Prm.I1);Serial.print("\t");
Serial.print(F("NI4 : ")); Serial.print(Prm.I4);Serial.print("\t");
Serial.print(F("NI5 : ")); Serial.print(Prm.I5);Serial.print("\n");
Serial.print(F("NI6 : ")); Serial.print(Prm.I6);Serial.print("\t");
Serial.print(F("NI7 : ")); Serial.print(Prm.I7);Serial.print("\t");
Serial.print(F("NBZ : ")); Serial.print(Prm.BZ);Serial.print("\n");
Serial.print(F("NSI : ")); Serial.print(Prm.SI);Serial.print("\t");
Serial.print(F("NST : ")); Serial.print(Prm.ST);Serial.print("\t");
Serial.print(F("NSU : ")); Serial.print(Prm.SU);Serial.print("\n");
Serial.print(F("NBL : ")); Serial.print(Prm.BL);Serial.print("\n");
for(int i =0; i <=7;i++){
Serial.print("iqomah"); Serial.print(i); Serial.print("\t"); Serial.println(Iqomah[i]);
}
}
File Penamaan ID :
/*=============================================
* PROGMEM DATA
==============================================*/
// sholatN 9 x 8
const char static sholatN_E[] PROGMEM = { "IMSAK\0\0\0"
"SUBUH\0\0\0"
"TERBT\0\0\0"
"DHUHA\0\0\0"
"DUHUR\0\0\0"
"ASHAR\0\0\0"
"MAGRB\0\0\0"
"ISYA\0\0\0\0"
"JUMAT\0\0\0"
};
//h_month 12 x 11
const char static h_month_E[] PROGMEM = { "MUHARRAM\0\0\0"
"SHAFAR\0\0\0\0\0"
"RAB.AWAL\0\0\0"
"RAB.AKHIR\0\0"
"JUM.AWAL\0\0\0"
"JUM.AKHIR\0\0"
"RAJAB\0\0\0\0\0\0"
"SYA'BAN\0\0\0\0"
"RAMADHAN\0\0\0"
"SYAWAL\0\0\0\0\0"
"DZULQA'DAH\0"
"DZULHIJAH\0\0"};
//m_month 12 x 10
const char static m_month_E[] PROGMEM = { "JAN\0"
"FEB\0"
"MAR\0"
"APR\0"
"MEI\0"
"JUN\0"
"JUL\0"
"AGS\0"
"SEP\0"
"OKT\0"
"NOV\0"
"DES\0"};
//DayName 7 x 7
const char static DayName_E[] PROGMEM = { "AHAD\0\0\0"
"SENIN\0\0"
"SELASA\0"
"RABU\0\0\0"
"KAMIS\0\0"
"JUM'AT\0"
"SABTU\0\0"};
//MT_Name 4 x 10
const char static MT_Name_E[] PROGMEM = { "MASJID\0\0\0\0"
"MUSHOLLA\0\0"
"SURAU\0\0\0\0\0"
"LANGGAR\0\0\0"};
const char static HD_Puasa[] PROGMEM = {
"MARI PUASA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"SUDAHKAH KITA PUASA\0\0\0\0\0\0\0"
"MARI KITA PERBANYAK PUASA\0"
"SELAMAT MENJALANKAN PUASA\0"
};
const char static TY_Puasa[] PROGMEM = {
"SYAWAL\0\0\0\0\0\0\0"
"SYA'BAN\0\0\0\0\0\0"
"SENIN\0\0\0\0\0\0\0\0"
"KAMIS\0\0\0\0\0\0\0\0"
"TENGAH BULAN\0"
"AROFAH\0\0\0\0\0\0\0"
"DZULHIJAH\0\0\0\0"
"TASU'A\0\0\0\0\0\0\0"
"ASYURA\0\0\0\0\0\0\0"
"RAMADHAN\0\0\0\0\0"
};
/*=============================================
// List fungsi Call Name off :
// 1. Header Puasa : Header_Puasa(1-4)
// 2. Sholat Name : sholahN(integer 0-6) 0-Subuh 1-Terbit 2-Dhuha 3-Dzuhur 4-Ashar 5-Magrib 3-Isya
// 3. DayName : DayName(1-7) 1-Minggu .... 7-Sabtu
// 4. Hijriah Month Name : drawGregDate(OutPut String)
// 5. Masehi Month Name : drawHijrDate(OutPut String)
// 6. Masjid Name : drawMasjidName(OutPut String) depend on Masjid Tipe 1-Masjid 2-Musholla 3-Surau 4-Langgar
==============================================*/
char* msgPuasa(int hd, int ty) // get sholat name from EEPROM
{
static char output[50];
char hdBuff[26];
int locLen = (hd-1)*26;
memccpy_P(hdBuff,HD_Puasa+locLen ,0,26);
char tyBuff[13];
locLen = (ty-1)*13;
memccpy_P(tyBuff,TY_Puasa+locLen ,0,13);
if(hd ==1)
{sprintf(output,"%s %s esok hari" ,hdBuff,tyBuff);}
else
{sprintf(output,"%s %s" ,hdBuff,tyBuff);}
return output;
}
char* sholatN(int number) // get sholat name from EEPROM
{
static char locBuff[8];
int locLen = number*8;
memccpy_P(locBuff,sholatN_E+locLen ,0,8);
return locBuff;
}
char * DayName(int number) // get Day Name from EEPROM
{
static char locBuff[7];
int locLen = (number-1)*7;
memccpy_P(locBuff,DayName_E+locLen ,0,7);
return locBuff;
}
char * MonthName(int number) // get Month Name from EEPROM
{
static char locBuff[4];
int locLen = (number-1)*4;
memccpy_P(locBuff,m_month_E+locLen,0,4);
return locBuff;
}
char * drawDayDate()
{
char locBuff[20];
static char out[45];
int locLen = (nowH.hM-1)*11;
memccpy_P(locBuff,h_month_E+locLen,0,11);
sprintf(out,"%s %s,%02d-%02d-%04d %02d %s %dH\0",DayName(daynow),pasar[jumlahhari()%5],now.day(),now.month(),now.year(),nowH.hD,locBuff,nowH.hY);
return out;
}
char * drawMasjidName()
{
char bufMN[75];
static char out[85];
char locBuff[10];
int locLen = (Prm.MT-1)*10;
memccpy_P(locBuff,MT_Name_E+locLen ,0,10);
EEPROM.get(55,bufMN);
sprintf(out,"%s %s\0",locBuff,bufMN);
return out;
}
char * drawInfo(int addr)
{
static char out[150];
EEPROM.get(addr,out);
return out;
}
File Tampilan Puasa :
void check_puasa()
{
// hitung tanggal besok
hijir_date tmrH = toHijri(now.year(),now.month(),now.day(),1);
ty_puasa = 0;
// cek hari dilarang puasa
if ( ((tmrH.hM == 12) and (tmrH.hD == 10)) or // Idul Adha
((tmrH.hM == 12) and (tmrH.hD == 11)) or // Hari Tarsik 1
((tmrH.hM == 12) and (tmrH.hD == 12)) or // Hari Tarsik 2
((tmrH.hM == 12) and (tmrH.hD == 13)) or // Hari Tarsik 3
((tmrH.hM == 10) and (tmrH.hD == 1)) or // Idul Fitri
((tmrH.hM == 8) and (tmrH.hD == 29)) or // Akhir bulan Sya'ban
((tmrH.hM == 8) and (tmrH.hD == 30)))
{
ty_puasa = 0;
}
else
{
if ((tmrH.hM == 10) and (tmrH.hD > 2)) // Bulan Syawal --> Puasa 6 Hari Sawal
{
ty_puasa = 1;
hd_puasa = 2;
}
if ((tmrH.hM == 8) and (tmrH.hD >= 1)) // Perbanyak puasa sunnah bulan Sya'ban
{
ty_puasa = 2;
hd_puasa = 3;
}
if(daynow== 1) // Jika sekarang Minggu --> besok puasa Senin
{
ty_puasa = 3;
hd_puasa = 1;
}
if(daynow== 4) // Jika sekarang Rabu --> besok puasa Kamis
{
ty_puasa = 4;
hd_puasa = 1;
}
if(tmrH.hD == 13 or tmrH.hD == 14 or tmrH.hD == 15) // Puasa Tengah Bulan tgl 13,14,15
{
ty_puasa = 5;
hd_puasa = 1;
}
if ((tmrH.hM == 12) and (tmrH.hD == 9)) // 9 Dzulhijah --> Puasa Arofah
{
ty_puasa = 6;
hd_puasa = 1;
}
if ((tmrH.hM == 12) and (tmrH.hD < 9)) // 9 hari pertama Dzulhijah --> Puasa Awal Dzulhijah
{
ty_puasa = 7;
hd_puasa = 1;
}
if ((tmrH.hM == 1) and (tmrH.hD == 9)) // 9 Muharram --> Puasa Arofah
{
ty_puasa = 8;
hd_puasa = 1;
}
if ((tmrH.hM == 1) and (tmrH.hD == 10)) // 10 Muharram --> Puasa Asura
{
ty_puasa = 9;
hd_puasa = 1;
}
if (tmrH.hM == 9) // Puasa Ramadhan
{
ty_puasa = 10;
hd_puasa = 4;
}
}
}
mlm pak, saya mau tanya untuk librarynya nyari di mana yg dmd3asis
BalasHapusPakai DMD3 bisa mas
Hapusitu kodenya ada beberapa bagian,gimana cara gabunginnya gan,yang saya tau kan cuma 1 kode (sketch).puyeng dah,ajarin donk
BalasHapusKlo buat 3bpanel esp8266 ga bisa ya Mas..
BalasHapusnderek sinau pak parno sragen.....salam dari purwodadi grobogan
BalasHapussalam pak, saya murid dari pak sofyan dari SMK N 2 KENDAL ingin bertanyan.... kalau itu ditambah NodeMCU apakah bisa?
BalasHapusPak itu file utama sama file lain digabung gak pak
BalasHapuskok saya compile gak bisa y, error compilling for arduino uno kenapa ya pak?
BalasHapusmohon pencerahannya...
Not responding ....
BalasHapusada file aia nya ga pak
BalasHapusInfo harga controllernya gan...
BalasHapusAssalamualaikum, sy sdh melihat karya Bapak (jws) yg bundar & yg lainya... 👍
BalasHapusBisa minta nmer tlfony... Trmksih