WeMOS: D1 R1 mini LCD I2C NTP Prayer Time Indonesia
Jump to navigation
Jump to search
/* * Calculate Prayer Time * * Time & Date From NTP */ #include <NTPClient.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include "Arduino.h" #include "uRTCLib.h" // uRTCLib rtc; uRTCLib rtc(0x68); /* I2C LCD ESP8266-Wenos D1 Mini GND GND VCC VIN SDA D2 SCL D1 */ #include <LiquidCrystal_I2C.h> // set the LCD number of columns and rows int lcdColumns = 16; int lcdRows = 2; LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows); const char *ssid = "o1"; const char *password = "Dzaq1993!"; const long utcOffsetInSeconds = 25200; char weekDays[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char months[12][12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; // Define NTP Client to get time WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "asia.pool.ntp.org", utcOffsetInSeconds); int Y = 2023; int M = 4; int D = 4; int DD; // Day Now int H = 16; int m = 25; int s = 0; int Z = 7; // Time Zone GMT+7 Jakarta // # define PI = 3.14159265359; float LAT = -6.16858549901122; float LONG = 106.865053367193; float FAJR_ANGLE = 20; float ISHA_ANGLE = 18; float SF = 1; // Imam Safii float DESCEND_CORRECTION = 2/60; float FAJR; float SUNRISE; float ZUHR; float ASR; float MAGHRIB; float ISHA; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); delay(500); calcPrayerTime(); // Serial.println( "\n" ); // PrintFloatToHour( FAJR ); // PrintFloatToHour( SUNRISE ); // PrintFloatToHour( ZUHR ); // PrintFloatToHour( ASR ); // PrintFloatToHour( MAGHRIB ); // PrintFloatToHour( ISHA ); URTCLIB_WIRE.begin(); lcd.begin( 5, 4 );// initialize LCD lcd.init(); // turn on LCD backlight lcd.backlight(); lcd.clear(); } void loop() { timeClient.update(); time_t epochTime = timeClient.getEpochTime(); String formattedTime = timeClient.getFormattedTime(); int H = timeClient.getHours(); int m = timeClient.getMinutes(); int s = timeClient.getSeconds(); String weekDay = weekDays[timeClient.getDay()]; float mm = m; float HH = H; HH = HH + mm/60; //Get a time structure struct tm *ptm = gmtime ((time_t *)&epochTime); int D = ptm->tm_mday; int M = ptm->tm_mon+1; String currentMonthName = months[M-1]; int Y = ptm->tm_year+1900; // Print complete date: // String currentDate = String(Y) + "-" + String(M) + "-" + String(D); if( D!=DD ) { calcPrayerTime(); } lcd.setCursor(0,0); lcd.print( "Pray " ); if( HH < FAJR ) { // subuh print2digits(int( FAJR )); lcd.print( ":" ); print2digits(int( (FAJR-int(FAJR) )*60)); lcd.print( " " ); print2digits(int( ZUHR )); lcd.print( ":" ); print2digits(int( (ZUHR-int(ZUHR) )*60)); } else if ((HH>FAJR) && (HH<ZUHR)) { // zuhr print2digits(int( ZUHR )); lcd.print( ":" ); print2digits(int( (ZUHR-int(ZUHR))*60 )); lcd.print( " " ); print2digits(int( ASR )); lcd.print( ":" ); print2digits(int( (ASR-int(ASR) )*60)); } else if ((HH>ZUHR) && (HH<ASR)) { // asr print2digits(int( ASR )); lcd.print( ":" ); print2digits(int( (ASR-int(ASR) )*60)); lcd.print( " " ); print2digits(int( MAGHRIB )); lcd.print( ":" ); print2digits(int( (MAGHRIB-int(MAGHRIB) )*60)); } else if ((HH>ASR) && (HH<MAGHRIB)) { // maghrib print2digits(int( MAGHRIB )); lcd.print( ":" ); print2digits(int( (MAGHRIB-int(MAGHRIB) )*60)); lcd.print( " " ); print2digits(int( ISHA )); lcd.print( ":" ); print2digits(int( (ISHA-int(ISHA) )*60)); } else if ((HH>MAGHRIB) && (HH<ISHA)) { // isha print2digits(int( ISHA )); lcd.print( ":" ); print2digits(int( (ISHA-HH )*60)); lcd.print( " " ); print2digits(int( FAJR )); lcd.print( ":" ); print2digits(int( (FAJR-int(FAJR) )*60)); } else { // night print2digits(int( FAJR )); lcd.print( ":" ); print2digits(int( (FAJR-int(FAJR) )*60)); lcd.print( " " ); print2digits(int( ZUHR )); lcd.print( ":" ); print2digits(int( (ZUHR-int(ZUHR) )*60)); } lcd.setCursor(4,1); print2digits(H); lcd.print(':'); print2digits(m); lcd.print(':'); print2digits(s); DD = D; delay(1000); } void PrintFloatToHour( float prayertime ) { int hh; int mm; hh = int( prayertime ); mm = int( ( prayertime - hh )*60 ); if( hh<9 ) Serial.print( String( "0" ) ); Serial.print( String(hh) + ":" ); if( mm<9 ) Serial.print( String( "0" ) ); Serial.print( String(mm) ); } void print2digits(int number) { if (number >= 0 && number < 10) lcd.write('0'); lcd.print(number); } void calcPrayerTime() { int A = Y/100 ; int B = 2 + int(A/4) - A; float JD = 1720994.5 + int(365.25*Y) + int(30.6001*(M + 1)) + B + D + ((H*3600 + m*60 + s) / 86400) - (Z / 24 ); float T = 2 * PI * (JD - 2451545) / 365.25; float DELTA = 0.37877 + 23.264 * sin( (57.297*T - 79.547) * PI/180 ) + 0.3812 * sin( (2*57.297*T - 82.682) * PI/180 ) + 0.17132 * sin( (3*57.297*T - 59.722) * PI/180 ); float U = (JD - 2451545) / 36525; float L0 = 280.46607 + 36000.7698*U; float ET1000 = -(1789 + 237*U) * sin(L0 * PI/180) - (7146 - 62*U) * cos(L0 * PI/180) + (9934 - 14*U) * sin(2*L0 * PI/180) - (29 + 5*U) * cos(2*L0 * PI/180) + (74 + 10*U) * sin(3*L0 * PI/180) + (320 - 4*U) * cos(3*L0 * PI/180) - 212*sin(4*L0 * PI/180); float ET = ET1000 / 1000; float TT = 12 + Z - (LONG / 15) - (ET / 60); float SA_FAJR = -(FAJR_ANGLE); float SA_MAGHRIB = -0.8333 - (0.0347 * sqrt(H)); float SA_SUNRISE = SA_MAGHRIB; // acot(A) = atan(1/A) // float SA_ASR = acot(SF + tan(abs(DELTA-LAT)*PI/180))*180/PI; float SA_ASR = atan(1/(SF + tan(abs(DELTA-LAT)*PI/180)))*180/PI; float SA_ISHA = -(ISHA_ANGLE); float COSHA_FAJR = (sin(SA_FAJR *PI/180) - sin(LAT*PI/180) * sin(DELTA*PI/180)) / (cos(LAT*PI/180) * cos(DELTA*PI/180)); float COSHA_MAGHRIB = (sin(SA_SUNRISE*PI/180) - sin(LAT*PI/180) * sin(DELTA*PI/180)) / (cos(LAT*PI/180) * cos(DELTA*PI/180)); float COSHA_SUNRISE = COSHA_MAGHRIB; float COSHA_ASR = (sin(SA_ASR*PI/180) - sin(LAT*PI/180) * sin(DELTA*PI/180)) / (cos(LAT*PI/180) * cos(DELTA*PI/180)); float COSHA_ISHA = (sin(SA_ISHA*PI/180) - sin(LAT*PI/180) * sin(DELTA*PI/180)) / (cos(LAT*PI/180) * cos(DELTA*PI/180)); float HA_FAJR = acos(COSHA_FAJR)*180/PI; float HA_MAGHRIB = acos(COSHA_SUNRISE)*180/PI; float HA_SUNRISE = HA_MAGHRIB; float HA_ASR = acos(COSHA_ASR)*180/PI; float HA_ISHA = acos(COSHA_ISHA)*180/PI; FAJR = TT - HA_FAJR / 15; SUNRISE = TT - HA_SUNRISE / 15; ZUHR = TT + DESCEND_CORRECTION; ASR = TT + HA_ASR / 15; MAGHRIB = TT + HA_MAGHRIB / 15; ISHA = TT + HA_ISHA / 15; }