#define BLYNK_PRINT Serial //deklarasi untuk menampilkan keterangan mulai koneksi ke blynk pada serial monitor

#define BLYNK_TEMPLATE_ID "TMPLa88krTYd" //template id dari template blynk yang dibuat, bagian dalam "" disesuaikan dengan device id masing-masing yang bisa di cek di bagian Device Info

#define echoPin 15 //deklarasi pin echo yang dihubungkan ke pin 3 dan diberi nama variabel echoPin
#define trigPin 2 //deklarasi pin trigger yang dihubungkan ke pin 2 dan diberi nama variabel trigPin

#include <BlynkSimpleEsp32.h>
#define LED1 13 //led rendah
#define LED2 12 // led sedang
#define LED3 14 // led Tinggi

char auth[] = "_1wS51eNLXbRuap-Zp296vIralP0PV8Z"; //deklarasi auth token dari device blynk yang dibuat, bisa dilihat pada bagian device info

char ssid[] = "Wokwi-GUEST"; //ssid wifi yang digunakan
char pass[] = ""; //password wifi yang digunakan

BlynkTimer timer; //merubah perintah BlynkTimer menjadi "timer"

void kirimData(){ //void untuk mengirimkan pembacaan sensor atau nilai ke blynk
//float ultrasonik(){
  digitalWrite(trigPin, LOW); //perintah untuk memastikan sensor ultrasonik belum memancarkan gelombang
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //sensor ultrasonik memancarkan gelombang ultrasoniknya
  delayMicroseconds(10); //durasi pancaran gelombang ultrasonik
  digitalWrite(trigPin, LOW); //perintah untuk menghentikan pancaran gelombang ultrasonik
  int durasiPantulan = pulseIn(echoPin, HIGH); //perintah untuk membaca jeda ketika gelombang dipancarkan oleh trigger kemudian diterima kembali oleh echo
  float jarak = durasiPantulan * 0.034 / 2; //rumus jarak dalam cm


  Blynk.virtualWrite(V1, jarak);
  Serial.print("Jarak : "); 
  Serial.print(jarak);
  Serial.println("cm ");   
  Serial.println("------");


  float jarak = ultrasonik();
  //ketinggian air rendah, jarak antara pelampung ke ultrasonik jauh
  if(jarak>150){ 
    digitalWrite(lED1, HIGH);
    digitalWrite(lED2, LOW);
    digitalWrite(lED3, LOW);     
  }
  //ketinggian air sedang, jarak antara pelampung ke ultrasonik sedang
  else if(jarak<=150 && jarak>100){ 
    digitalWrite(lED2, HIGH);
    digitalWrite(LED3, LOW);
    digitalWrite(LED1, LOW);
      
  }
  //ketinggian air tinggi, jarak ultrasonik ke pelampung dekat
  else if(jarak<=1000){ 
    digitalWrite(LED3, HIGH);
    digitalWrite(LED2, LOW);
  }
}

BLYNK_WRITE(V0){ //perintah untuk membaca nilai yang dikirim oleh blynk
  int pinVal = param.asInt(); //perintah untuk memasukkan nilai dari pin virtual blynk ke variabel pinVal
  digitalWrite(LED1, pinVal); //perintah untuk membuat LED menyala sesuai dengan kondisi button virtual pada blynk
}

void setup() {
  // put your setup code here, to run once:
  pinMode(echoPin, INPUT); //inisialisasi pin 3 dengan variabel ehoPin sebagai pin input
  pinMode(trigPin, OUTPUT); //inisialisasi pin 2 dengan variabel trigPin sebagai pin output

  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass); //inisialisasi komunikasi dengan server blynk
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  timer.setInterval(2000L, kirimData); //interval pengiriman data dari mikrokontroler ke blynk
}

void loop() {
  // put your main code here, to run repeatedly:
   Blynk.run(); //menjalankan perintah yang ada di library blynk
  timer.run(); //menjalankan timer dari blynk

  
}