#define BLYNK_TEMPLATE_ID "TMPL3jc_NcE-q"
#define BLYNK_TEMPLATE_NAME "smart traffic diversion system for road congestion"
#define BLYNK_AUTH_TOKEN "Oqz6G-ITkq0ywHrz3EvdPiwi1muURy7Z"

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

// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";

const int trigPin = 5;
const int echoPin = 18;
const int redLED = 23;
const int yellowLED = 22;
const int greenLED = 21;
long duration;
int distance;

void setup() {
  Serial.begin(115200);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(redLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
  pinMode(greenLED, OUTPUT);

  // Connect to Wi-Fi and Blynk
  WiFi.begin(ssid, password);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);

  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print('.');
  }
  Serial.println("\nConnected to WiFi and Blynk");
}

void loop() {
  Blynk.run();

  // Clear the trigPin by setting it LOW
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Set the trigPin HIGH for 10 microseconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Read the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);

  // Calculate the distance
  distance = duration * 0.034 / 2;

  Serial.print("Distance: ");
  Serial.println(distance);

  // Traffic light logic based on distance
  if (distance < 100) {
    digitalWrite(redLED, HIGH);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, LOW);
    Serial.println("Heavy Traffic Detected: Red Light ON");
    Blynk.virtualWrite(V2,HIGH);
    Blynk.virtualWrite(V1,LOW);

  } else if (distance < 200) {
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, HIGH);
    digitalWrite(greenLED, LOW);
    Serial.println("Moderate Traffic Detected: Yellow Light ON");
  } else {
    digitalWrite(redLED, LOW);
    digitalWrite(yellowLED, LOW);
    digitalWrite(greenLED, HIGH);
    Serial.println("Low Traffic Detected: Green Light ON");
    Blynk.virtualWrite(V1,HIGH);
    Blynk.virtualWrite(V2,LOW);
  }

  // Send traffic data to Blynk
  Blynk.virtualWrite(V0, distance);

  delay(10000); // Send data every 10 seconds
}