#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLcWihYyOR"
#define BLYNK_DEVICE_NAME "Sawah"
#define BLYNK_AUTH_TOKEN "WaqT9wPPvtYKctd3Gtgh4Q6SPIk6Xx3Y"

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

#include <ESP32Servo.h>

#define ECHO_PIN 2
#define TRIG_PIN 4
#define pompa 5
#define pinPIR 13
#define buzzer 18

Servo myservo;  
int pos = 0;    

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

BlynkTimer timer;

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  int duration = pulseIn(ECHO_PIN, HIGH);
  return duration * 0.034 / 2;
}

void baca_sensor_jarak(){
  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, distance);
  delay(100);

  if (distance > 250){
    pos = 90;
    // in steps of 1 degree
    myservo.write(pos);              
    delay(15); 
    Serial.println(pos); 
    digitalWrite(pompa, LOW);
   Blynk.virtualWrite(V2, "Pintu Air Terbuka");
   Blynk.virtualWrite(V3, "Pompa Mati");
}

if (distance >=200 && distance < 250){
digitalWrite(pompa, HIGH);
   pos = 45;
    myservo.write(pos);            
    delay(15);
    Serial.println(pos); 
    
    Blynk.virtualWrite(V2, "Pintu Air Tertutup");
    Blynk.virtualWrite(V3, "Pompa Hidup");
}

if (distance <100){
   pos = 0;
    myservo.write(pos);            
    delay(15);
    Serial.println(pos); 
    digitalWrite(pompa, LOW);
    Blynk.virtualWrite(V2, "Pintu Air Tertutup");
    Blynk.virtualWrite(V3, "Pompa Hidup");
}
}

void baca_sensor_gerak(){
  int nilaiPir = digitalRead((pinPIR));
  if(nilaiPir == 1){
    tone(buzzer, 120);
    Blynk.virtualWrite(V1, "Ada Gerakan");  
    Blynk.virtualWrite(V4, "Buzzer Aktif");  
    delay(1000);
  }
  else{
    noTone(buzzer);
    Blynk.virtualWrite(V1, "Tidak Ada Gerakan");  
    Blynk.virtualWrite(V4, "Buzzer Tidak Aktif");
  }
}

void setup() {
  myservo.attach(15);  
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(1000L, baca_sensor_jarak);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(pompa, OUTPUT);
  pinMode(pinPIR, INPUT);
  pinMode(buzzer, OUTPUT);  
}

void loop() {
baca_sensor_gerak();
baca_sensor_jarak();
Blynk.run();
timer.run();
}