Pada tutorial sebelumnya saya telah menjelaskan cara mendapatkan informasi jadwal waktu sholat per tanggal dari api.myquran.com yaitu dengan menuliskan URL seperti berikut: api.myquran.com/v1/sholat/jadwal/1204/2021/12/02 pada address bar browser favorit teman-teman. Namun 3 segmen terakhir pada URL tersebut yaitu tahun/bulan/tanggal masih saya tulis hardcode. Naah bagaimana caranya supaya parameter tahun, bulan dan tanggalnya otomatis seiring dengan bergantinya hari demi hari hehe...

Caranya ya dengan memanfaatkan NTP Client seperti yang sudah kita bahas di tutorial-tutorial saya sebelumnya. Kalau teman-teman belum membacanya, saya sarankan untuk membacanya terlebih dahulu.

Baik teman-teman langsung aja kita buka kembali Arduino IDE nya dan kita mainkan kodingannnya ...

1. Koding di Arduino IDE

  • Inisialisasi

    Di bagian ini kita include kan librari-librari, memasukkan credential SSID dan password WiFi, menentukan address web server API dan port https serta mendeklarasikan variabel-variabel yang dibutuhkan.

    Perlu diperhatikan bahwa librari NTPClient.h yang kita include-kan ini merupakan versi editan alias ada sedikit modifikasi di dalamnya dalam rangka mendapatkan value tahun, bulan dan tanggal dari masing-masing fungsi getYear(), getMonth() dan getDate(). Bagaimana cara memodifikasi librarinya? Sudah saya jelaskan secara detail di tutorial "Real Time Tanggal dan Jam Menggunakan Librari NTPClient Arduino".

    initilizing
  • setup()

    Setup Serial baud rate dan WiFi mode.

    setup
  • loop()

    Di dalam main loop ini saya mengkondisikan pegaksesan API jadwal waktu sholat dari api.myquran.com hanya sekali dalam sehari karena waktu-waktu sholat berlaku untuk 1x24 jam sehingga tidak perlu direquest berulang.

    Di awal loop saya men-set nilai strMMDD dari fungsi getMonth() dan getDate() NTP Client. Saya kondisikan jika string tanggal tanggal terakhir (strMMDDLast) tidak sama dengan string tanggal hari ini (strMMDD) maka program akan mengeksekusi function getSholatTime() untuk saya assign ke variabel-variabel kelima waktu sholat. Jika kedua tanggal sudah sama, maka saya print hari, bulan, tanggal dan waktu sholat ke serial monitor Arduino IDE.

    arduino ide
  • getSholatTime()

    Dari fungsi inilah saya mengambil waktu sholat melalui https request ke api.myquran.com

    arduino ide arduino ide arduino ide arduino ide

Berikut sketch lengkapnya :

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h> 
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>

/* Set these to your desired credentials. */
const char *ssid = "YOUR_WIFI_NETWORK_NAME";  //ENTER YOUR WIFI SETTINGS
const char *password = "YOUR_WIFI_PASSWORD";

//Web/Server address to read/write from 
const char *host = "api.myquran.com";
const int httpsPort = 443;  //HTTPS= 443 and HTTP = 80

//SHA1 finger print of certificate use web browser to view and copy
const char fingerprint[] PROGMEM = "95:3F:1A:FF:CB:5F:DA:AE:D0:B7:C8:C6:EF:80:81:8D:08:7D:05:24";

const long utcOffsetInSeconds = 3600;

String daysOfTheWeek[7] = {"Ahad  ", "Senin ", "Selasa", "Rabu  ", "Kamis ", "Jumat ", "Sabtu "};
String months[12]={"Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des"};

String strMMDD = "NA";
String strMMDDLast = strMMDD;
String strYY;

char jamsolat[5];
String SubuhTime, DzuhurTime, AsharTime, MaghribTime, IsyaTime;

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "id.pool.ntp.org", utcOffsetInSeconds);

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_OFF);        //Prevents reconnection issue (taking too long to connect)
  delay(1000);
  WiFi.mode(WIFI_STA);        //Only Station No AP, This line hides the viewing of ESP as wifi hotspot
  
  WiFi.begin(ssid, password);     //Connect to your WiFi router
  Serial.println("");

  Serial.print("Connecting");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP
}

void loop() {
  timeClient.update();

  strMMDD = String(timeClient.getMonth())+"/"+String(timeClient.getDate());

  if (strMMDDLast != strMMDD) {
    strMMDDLast = strMMDD;
    strYY = String(timeClient.getYear());

    Serial.print("Str M/D last = ");
    Serial.println(strMMDDLast);

    getSholatTime();
  } else {
    Serial.println(" ");
    Serial.print(daysOfTheWeek[timeClient.getDay()]);
    Serial.print(", ");
    Serial.print(timeClient.getDate());
    Serial.print(" ");
    Serial.print(months[int(timeClient.getMonth()) - 1]);
    Serial.print(" ");
    Serial.println("20"+strYY);
    Serial.println("------------------");
    
    Serial.println(" Subuh   : "+SubuhTime);
    Serial.println(" Dzuhur  : "+DzuhurTime);
    Serial.println(" Ashar   : "+AsharTime);
    Serial.println(" Maghrib : "+MaghribTime);
    Serial.println(" Isya    : "+IsyaTime);
    Serial.println("------------------");

    delay(5000);
  }
}

void getSholatTime() {
  WiFiClientSecure httpsClient;    //Declare object of class WiFiClient

  Serial.println(host);
  Serial.printf("Using fingerprint '%s'\n", fingerprint);
  httpsClient.setFingerprint(fingerprint);
  httpsClient.setTimeout(15000); // 15 Seconds
  delay(1000);
  
  Serial.print("HTTPS Connecting");
  int r=0; //retry counter
  while((!httpsClient.connect(host, httpsPort)) && (r < 30)){
      delay(100);
      Serial.print(".");
      r++;
  }
  if(r==30) {
    Serial.println(". Connection failed");
  }
  else {
    Serial.println(". Connected to web");
  }
  
  String Link;
  //GET Data
  Link = "/v1/sholat/jadwal/1204/20"+strYY+"/"+strMMDD; //address from which we need to get the data inside the server.

  Serial.print("requesting URL: ");
  Serial.println(host+Link);

  httpsClient.print(String("GET ") + Link + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +             
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
                  
  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }

  Serial.println("reply was:");
  Serial.println("==========");
  String line;
  while(httpsClient.available()){        
    line = httpsClient.readStringUntil('\n');  //Read Line by Line

    // Get Subuh time ///////////////////
    int pos1 = line.indexOf("\"subuh\"");
    if (pos1 >= 0) {
      int j = 0;
      for(j=0; j<5; j++){
        jamsolat[j] = line[pos1 + 9 + j];
      }
      SubuhTime = jamsolat;
    }
    //////////////////////////////////////

    // Get Dzuhur time ///////////////////
    int pos2 = line.indexOf("\"dzuhur\"");
    if (pos2 >= 0) {
      int k = 0;
      for(k=0; k<6; k++){
        jamsolat[k] = line[pos2 + 10 + k];
      }
      DzuhurTime = jamsolat;
    }
    //////////////////////////////////////

    // Get Ashar time ////////////////////
    int pos3 = line.indexOf("\"ashar\"");
    if (pos3 >= 0) {
      int l = 0;
      for(l=0; l<5; l++){
        jamsolat[l] = line[pos3 + 9 + l];
      }
      AsharTime = jamsolat;
    }
    //////////////////////////////////////

    // Get Maghrib time //////////////////
    int pos4 = line.indexOf("\"maghrib\"");
    if (pos4 >= 0) {
      int m = 0;
      for(m=0; m<7; m++){
        jamsolat[m] = line[pos4 + 11 + m];
      }
      MaghribTime = jamsolat;
    }
    //////////////////////////////////////

    // Get Isya time ////////////////////
    int pos5 = line.indexOf("\"isya\"");
    if (pos5 >= 0) {
      int n = 0;
      for(n=0; n<5; n++){
        jamsolat[n] = line[pos5 + 8 + n];
      }
      IsyaTime = jamsolat;
    }
    //////////////////////////////////////

    SubuhTime = SubuhTime.substring(0,5);
    DzuhurTime = DzuhurTime.substring(0,5);
    AsharTime = AsharTime.substring(0,5);
    MaghribTime = MaghribTime.substring(0,5);
    IsyaTime = IsyaTime.substring(0,5);

    Serial.println("Subuh   : "+SubuhTime);
    Serial.println("Dzuhur  : "+DzuhurTime);
    Serial.println("Ashar   : "+AsharTime);
    Serial.println("Maghrib : "+MaghribTime);
    Serial.println("Isya    : "+IsyaTime);
    Serial.println("----- ### -----");
  }
  Serial.println("==========");
  Serial.println("closing connection");

  delay(2000);
}

            

2. Upload Sketch & Tampilan Serial Monitor

Setelah saya jelaskan ringkasan alur programnya, kini saatnya kita upload sketch programnya dan kita lihat tampilan serial monitornya.

Berikut tampilan serial monitor di awal loop, hasil dari eksekusi function getSholatTime().

serial monitor waktu sholat

Berikut tampilan serial monitor setelah variabel-variabel kelima waktu sholat diassign. Tiap 5 detik serial monitor menampilkan informasi hari, tanggal dan waktu sholat.

serial monitor waktu sholat