#define BLYNK_TEMPLATE_ID "TMPL3fbS4LbBo"
#define BLYNK_TEMPLATE_NAME "HOME AUTOMATION"
#define BLYNK_AUTH_TOKEN "bfrxjZmU355OV-Q0qcWr-MF0Fu6ttW9H"


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


#define BLYNK_PRINT Serial

const int TRIG_PIN = 4;
const int ECHO_PIN = 5;
const int SERVO_PIN = 13;
const int DISTANCE_THRESHOLD = 50;
const int SERVO_ON_ANGLE = 200;
const int SERVO_OFF_ANGLE = 0;

Servo servo;
float distance_cm = 0;
unsigned long servoMovedTime = 0;

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

BlynkTimer timer;

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  servo.attach(SERVO_PIN);
  servo.write(SERVO_OFF_ANGLE); // Set initial servo position
  delay(500); // Wait for servo to settle
  
}

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

  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(5);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH);
  distance_cm = duration * 0.034 / 2;

  if (distance_cm < DISTANCE_THRESHOLD) {
    servo.write(SERVO_ON_ANGLE);
    servoMovedTime = millis();
  } else {
    if (millis() - servoMovedTime >= 7000) {
      servo.write(SERVO_OFF_ANGLE);
    }
  }
}

BLYNK_WRITE(V7) {
  int servoState = param.asInt();
  if (servoState == HIGH) {
    servo.write(SERVO_ON_ANGLE);
    servoMovedTime = millis();
  } else {
    servo.write(SERVO_OFF_ANGLE);
  }
}