#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6Tl1TJRHA"
#define BLYNK_TEMPLATE_NAME "Kolam Ikan"
#define BLYNK_AUTH_TOKEN "kKO8AnNVrk1Iol-LJtoyLMqjkOSvKQtf"
#define ECHO_PIN 15
#define TRIG_PIN 4
#define vibrator 5
#define buzzer 18
int a = 0;
#include <ESP32Servo.h>

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

Servo myservo; 

BLYNK_WRITE(V2){
  myservo.write(param.asInt());
  int pinValue = param.asInt();
  if (pinValue > 5) {
    digitalWrite(vibrator, HIGH);
  }else{
    digitalWrite(vibrator, LOW);
  } 
  if (a == 1){
  Blynk.virtualWrite(V2, 0);
}
}


BLYNK_WRITE(V3){
  int reset = (param.asInt());
  if (reset == 0) {
    a = 0;
  }
  if (reset == 1){
    a = 1;
  }
}

BlynkTimer timer;

void sendSensor()
{
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  int duration = pulseIn(ECHO_PIN, HIGH);
  float distance = duration * 0.034 / 2;

  Serial.print("Jarak: ");
  Serial.println(distance);
  Blynk.virtualWrite(V0, "Jarak Pakan: "+String(distance)+ " Cm");

  // Kondisi Pakan Penuh
  if (a == 0){
  if (distance >= 20 && distance <= 350){
    Blynk.virtualWrite(V1, "Pakan Masih Ada");
    Serial.println("Pakan Masih Ada");
  }
  if (distance > 350 && distance <= 380){
    Blynk.virtualWrite(V1, "Pakan Mau Habis");
    Serial.println("Pakan Mau Habis");
  }
  if (distance >380){
    Blynk.virtualWrite(V1, "Pakan Habis");
    Serial.println("Pakan Habis");
    digitalWrite(vibrator, LOW);
    myservo.write(0);              
    delay(15);
    tone (buzzer, 120);
    delay(500);
    noTone(buzzer);
  }  
  delay(100);  
  }

if (a == 1){
  Blynk.virtualWrite(V1, "Segera Isi Pakan");
  Serial.println("Segera Isi Pakan");
  noTone(buzzer);    
}
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(vibrator, OUTPUT);
  pinMode(vibrator, OUTPUT);
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(1000L, sendSensor);
   myservo.attach(2); 
}

void loop() {  
  sendSensor();
  Blynk.run();
  timer.run();
}