#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32Servo.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak
String apiKey = "I5GB6160UU6AIMQN"; // Replace with your key
String server = "http://api.thingspeak.com/update";
// Ultrasonic pins
#define TRIG 5
#define ECHO 18
// LEDs, Buzzer, Servo
#define GREEN_LED 14
#define RED_LED 27
#define BUZZER 12
Servo gateServo;
long duration;
float distance_cm;
float getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
return duration * 0.034 / 2;
}
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
gateServo.attach(4); // Servo on GPIO 4
gateServo.write(0); // Start with gate closed
// WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("not connected");
}
Serial.println("\nConnected!");
}
void loop() {
float distance = getDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Logic for Parking Status
if (distance > 20) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
gateServo.write(90);
delay(500); // Gate Open
Serial.println("Parking Free");
} else if (distance > 5 && distance <= 20) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
// Buzzer beep pattern
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
delay(200);
gateServo.write(45); // Gate half open
Serial.println("Vehicle Approaching");
} else {
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH);
digitalWrite(BUZZER, HIGH); // Continuous alert
gateServo.write(0); // Gate closed
Serial.println("Parking Occupied");
}
// Upload to ThingSpeak
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = server + "?api_key=" + apiKey + "&field1=" + String(distance);
http.begin(url);
int code = http.GET();
if (code > 0) Serial.println("ThingSpeak Updated");
else Serial.println("Update failed");
http.end();
}
delay(15000); // TS limit
}