//Tiga parameter di bawah ini biasanya ada saat kita membuat template baru
#define BLYNK_TEMPLATE_ID "TMPL6D_txRXST" //Tulis nama template ID Blynk
#define BLYNK_TEMPLATE_NAME "Wheather Station" //Tulis nama template Blynk
#define BLYNK_AUTH_TOKEN "4eETHw0mNrBQLEqPSBjUzzhJk3BLY-37" //Tulis token Blynk 

#define BLYNK_PRINT Serial //Kita menggunakan Blynk serial

#include <WiFi.h> //Library WiFi
#include <WiFiClient.h> //Library WiFiClient
#include <BlynkSimpleEsp32.h> //Library BlynkESP32

char ssid[] = "Wokwi-GUEST"; //Nama WiFi yang digunakan
char pass[] = ""; //Password WiFi yang digunakan

BlynkTimer timer; //Untuk push data dibutuhkan blynk timer (untuk code push data dapat dilihat di blynk example)

//SENSOR DHT
#include <DHTesp.h> //Library untuk sensor DHT
const int DHT_PIN = 15; //Pin signal DHT
byte led = 5; //Pin LED adalah D5
DHTesp dhtSensor; //Buat objek bernama dhtSensor
float suhu, kelembaban; //Variabel suhu dan kelembaban

void setup()
{
  Serial.begin(115200); //Menginisiasi serial monitor

  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); //Menginisiasi Blynk

  dhtSensor.setup(DHT_PIN, DHTesp::DHT22); //Mendefine dht sensor (DHT22 merupakan jenis DHT yang digunakan)
  timer.setInterval(1000L, myTimerEvent); //Mengirim data tiap satu detik

  pinMode(led, OUTPUT);
}

void myTimerEvent()
{
  TempAndHumidity data = dhtSensor.getTempAndHumidity(); //Inisiasi pengambilan data
  suhu = data.temperature; //Mendefinisikan variabel suhu
  kelembaban = data.humidity; //Mendefinisikan variabel kelembaban
  Serial.println("Suhu: " + String(suhu, 1) + "C");
  Serial.println("Kelembaban: " + String(kelembaban, 1) + "%");

  //KODE UNTUK MENGIRIM NOTIFIKASI
    if (suhu > 35) //Jika suhu lebih dari 35,maka...
  {
    Serial.println("Suhu Naik");
    Blynk.logEvent("high_temp"); //...Blynk akan mengirimkan notifikasi ke Gmail, dgn event "suhu_naik"
  }

  delay(1000);
  Blynk.virtualWrite(V0, suhu); //Mengirim data suhu menurut pin V0 di Blynk
  Blynk.virtualWrite(V1, kelembaban); //Mengirim data kelembaban pin V1
}

BLYNK_WRITE(V2) //V2, sesuai dengan pin Blynk yang ingin dipakai
{
  int pinValue = param.asInt();
  Serial.print("V2 Switch value is: ");
  Serial.println(pinValue);
  digitalWrite(led, pinValue);
}

void loop()
{
  Blynk.run(); //Menjalankan Bylnk
  timer.run(); //Menjalankan timer
}