Membaca JSON dari Internet dengan ESP32

Catatan Belajar oleh : Reza Ervani bin Asmanu

1. Persiapan: Instal Library ArduinoJson

Untuk membaca data dari internet yang berformat JSON, Anda memerlukan library ArduinoJson.

  • Buka Arduino IDE.
  • Pergi ke Tools > Manage Libraries.
  • Cari “ArduinoJson” (oleh Benoit Blanchon).
  • Klik Install.

Tampilannya nampak seperti gambar ini


2. Kode ESP32: Mengambil Waktu Shalat

Kode ini akan menghubungi API, mengambil data waktu shalat untuk hari ini, dan menampilkannya di Serial Monitor.

#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>

/* ================== KONFIGURASI ================== */
const char* ssid     = "RANTISSIDANFATIH";
const char* password = "abahmamaktercinta";

// UmmahAPI – Jakarta
const char* url =
  "https://www.ummahapi.com/api/prayer-times"
  "?lat=-6.2088"
  "&lng=106.8456"
  "&method=MuslimWorldLeague"
  "&madhab=Shafi";

/* ================================================= */

String konversiKeWIB(String waktuUTC);
void ambilJadwalShalat();

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  Serial.println();
  Serial.println("=================================");
  Serial.println(" ESP32 JADWAL SHALAT (UmmahAPI) ");
  Serial.println("=================================");
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  Serial.print("Menghubungkan WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWiFi Terhubung!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
  
  ambilJadwalShalat();
}

void loop() {
  // Kosong
}

void ambilJadwalShalat() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi terputus!");
    return;
  }

  WiFiClientSecure client;
  client.setInsecure();
  client.setTimeout(10000);

  HTTPClient http;
  
  Serial.println("\n[HTTP] Menghubungi UmmahAPI...");
  
  if (!http.begin(client, url)) {
    Serial.println("[HTTP] Gagal begin()");
    return;
  }

  http.useHTTP10(true);
  int httpCode = http.GET();
  
  Serial.printf("[HTTP] Status Code: %d\n", httpCode);
  
  if (httpCode != HTTP_CODE_OK) {
    Serial.println("[HTTP] Response bukan 200 OK");
    http.end();
    return;
  }

  String payload = http.getString();
  http.end();

  // DEBUG: Tampilkan raw JSON (opsional, bisa di-comment jika tidak perlu)
  Serial.println("\n[DEBUG] Raw JSON Response:");
  Serial.println(payload);
  Serial.println();

  Serial.println("[JSON] Parsing data...");
  
  DynamicJsonDocument doc(4096);
  DeserializationError error = deserializeJson(doc, payload);
  
  if (error) {
    Serial.print("[JSON] Gagal parse: ");
    Serial.println(error.c_str());
    return;
  }

  // === PARSING SESUAI STRUKTUR UMMAHAPI ===
  // Struktur: data.prayer_times.fajr
  
  JsonObject data = doc["data"];
  JsonObject prayer_times = data["prayer_times"];
  
  String tanggal = data["date"] | "N/A";
  String subuh = konversiKeWIB(prayer_times["fajr"] | "N/A");
  String dzuhur = konversiKeWIB(prayer_times["dhuhr"] | "N/A");
  String ashar = konversiKeWIB(prayer_times["asr"] | "N/A");
  String maghrib = konversiKeWIB(prayer_times["maghrib"] | "N/A");
  String isya = konversiKeWIB(prayer_times["isha"] | "N/A");

  Serial.println("\n=================================");
  Serial.println("     JADWAL SHALAT JAKARTA       ");
  Serial.println("=================================");
  Serial.println("Tanggal : " + tanggal);
  Serial.println("---------------------------------");
  Serial.println("Subuh   : " + subuh);
  Serial.println("Dzuhur  : " + dzuhur);
  Serial.println("Ashar   : " + ashar);
  Serial.println("Maghrib : " + maghrib);
  Serial.println("Isya    : " + isya);
  Serial.println("=================================\n");
}

String konversiKeWIB(String waktuUTC) {
  if (waktuUTC == "N/A" || waktuUTC.length() < 5) {
    return waktuUTC;
  }
  
  // Parse jam dan menit dari format "HH:MM"
  int jam = waktuUTC.substring(0, 2).toInt();
  int menit = waktuUTC.substring(3, 5).toInt();
  
  // Tambah 7 jam untuk WIB (UTC+7)
  jam += 7;
  
  // Handle overflow hari
  if (jam >= 24) {
    jam -= 24;
  }
  
  // Format kembali ke "HH:MM"
  String hasil = "";
  if (jam < 10) hasil += "0";
  hasil += String(jam);
  hasil += ":";
  if (menit < 10) hasil += "0";
  hasil += String(menit);
  
  return hasil;
}

Tampilannya jika berhasil akan nampak seperti pada gambar ini


Apa yang Terjadi di Kode Ini?

  1. HTTPClient: Digunakan untuk membuat ESP32 bertindak seperti browser yang “mengunjungi” alamat API.
  2. http.GET(): Perintah untuk mengambil data dari server.
  3. ArduinoJson: Karena data dari internet biasanya berbentuk teks panjang yang rumit (JSON), library ini memecahnya agar kita bisa mengambil nilai tertentu saja (misalnya hanya mengambil jam “Maghrib”).

Ide Pengembangan Selanjutnya:

  • Tampilkan di LCD/OLED: Jika Anda memiliki layar (seperti LCD 16×2 atau OLED I2C), Anda bisa menampilkan jam shalat tersebut di sana.
  • Deep Sleep: ESP32 bisa diatur untuk “tidur” dan hanya bangun setiap beberapa jam sekali untuk memperbarui data guna menghemat baterai.
  • Astronomi: Anda bisa mencoba API lain yang memberikan data Fase Bulan atau Posisi Matahari secara real-time.