#include <WiFi.h> // untuk mengaktifkan wifi pada ESP32, agar memungkinka perangkat terhubung kejaringan wifi untuk saling berkomunikasi
  #include <DHT.h> // untuk membaca data dari sensor DHT yang terpasang pada peangkat
  #include <FirebaseESP32.h> //Dengan menggunakan FirebaseESP32, ESP32 dapat terhubung ke layanan Firebase,  platform pengembangan aplikasi mobile dan web dari Google
  #include <HTTPClient.h> // memungkinkan ESP32 untuk membuat permintaan HTTP, misalnya untuk mengirimkan atau menerima data dari server
//#include "addons/TokenHelper.h"
//#include "addons/RTDBHelper.h"

const char* ssid = "Wokwi-GUEST"; //nama jaringan wifi SSID yang akan dihubungkan dan digunakan
const char* password = ""; //kata sandi untuk mengakses jaringan WiFi yang memiliki SSID "Wokwi-GUEST."

//Ini mendefinisikan sebuah konstanta makro dengan nama FIREBASE_HOST, yang nilainya adalah URL host untuk Firebase Realtime Database. Host ini menunjukkan di mana basis data Firebase berada
#define FIREBASE_HOST "https://rfid-5befd-default-rtdb.asia-southeast1.firebasedatabase.app/"
//Ini mendefinisikan konstanta makro dengan nama FIREBASE_AUTH, yang nilainya adalah token otentikasi (authentication token) untuk mengakses firebase
#define FIREBASE_AUTH "O3SfJnOfyPQxTledjMVikIGK8ce9Ytb8A0hzxymP"


#define DHTPIN 13 //sensor DHT22 dihubungkan ke pin 13 pada mikrokontroler
#define DHTTYPE DHT22 // untuk menndefinisikan jenis sensor DHT yang digunakan adalah DHT22 

#define led 2 //digunakan untuk menentukan pin yang terhubung ke LED pin 2 pada mikrokontroler
FirebaseData fbdo; //Ini mendeklarasikan objek dari kelas FirebaseData dengan nama fbdo. Kelas FirebaseData adalah bagian dari pustaka FirebaseESP32 yang digunakan untuk berkomunikasi dengan layanan Firebase pada platform ESP32


void wifiConnection(){ //Memulai proses koneksi WiFi dengan menggunakan nama jaringan (SSID) dan kata sandi yang sudah ditentukan
  WiFi.begin(ssid, password); // Memulai proses koneksi WiFi dengan menggunakan nama jaringan (SSID) dan kata sandi (password) yang telah ditentukan
  while (WiFi.status() != WL_CONNECTED){ //Sebuah loop while yang akan dijalankan selama perangkat belum terhubung ke jaringan WiFi, memberikan kesempatan sampai koneksi berhasil 
    Serial.print("."); //untuk mengirim data ke Serial Monitor
    delay(500); //  perangkat menunggu selama 500 milidetik (setengah detik) sebelum melanjutkan eksekusi kode berikutnya
  }
  Serial.println("Wifi Connected"); //Mencetak pesan bahwa perangkat telah terhubung ke WiFi
  Serial.println(WiFi.SSID()); //Mencetak SSID jaringan WiFi yang terhubung
  Serial.println(WiFi.RSSI());//Mencetak kekuatan sinyal (RSSI) WiFi
  Serial.println(WiFi.macAddress()); //Mencetak alamat MAC perangkat WiFi
  Serial.println(WiFi.localIP()); //Mencetak alamat IP lokal perangkat
  Serial.println(WiFi.gatewayIP()); //Mencetak alamat IP gateway WiFi
  Serial.println(WiFi.dnsIP()); //Mencetak alamat IP server DNS yang digunakan
}

DHT dht(DHTPIN, DHTTYPE); //dapat digunakan untuk membaca nilai suhu dan kelembaban dari sensor yang terhubung

void firebase(void) { //Membuat fungsi bernama firebase yang bertanggung jawab untuk inisialisasi koneksi ke Firebase Realtime Database
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); //Memulai koneksi ke Firebase dengan menggunakan host dan token otentikasi yang telah ditentukan 
  Firebase.reconnectWiFi(true); //untuk memastikan bahwa koneksi WiFi tetap aktif dan menghubungkan kembali jika koneksi terputus
}

void setup() {
  Serial.begin(115200); //Menginisialisasi komunikasi serial dengan kecepatan 115200 bps
  wifiConnection(); //Fungsi ini digunakan untuk menginisialisasi koneksi WiFi
  dht.begin(); //digunakan untuk memulai komunikasi dengan sensor DHT dan mempersiapkannya untuk membaca data suhu dan kelembaban
  pinMode(led, OUTPUT); //Mengkonfigurasi pin yang terhubung ke LED (led) sebagai pin keluaran (OUTPUT)
  firebase(); //Fungsi ini bertanggung jawab untuk menginisialisasi koneksi ke Firebase Realtime Database
}

void loop() {
  float h = dht.readHumidity(); //Membaca nilai kelembaban dari sensor DHT dan menyimpannya dalam variabel h
  float t = dht.readTemperature(); //Membaca nilai suhu dari sensor DHT dan menyimpannya dalam variabel t
  Firebase.setFloat(fbdo, "/SUHU", t); //nilai suhu akan disimpan di dalam database Firebase dengan key atau path "/SUHU"
  Firebase.setFloat(fbdo, "/KELEMBAPAN", h); //nilai kelembapan akan disimpan di dalam database Firebase dengan key atau path "/KELEMBAPAN"
}