/**#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>
#include <LiquidCrystal.h>
// LCD
LiquidCrystal lcd(23, 22, 21, 19, 18, 5);
// Servo
Servo servoEntry;
Servo servoExit;
#define SERVO_ENTRY_PIN 15
#define SERVO_EXIT_PIN 4
// Ultrasonic Pins
#define TRIG_P1 13
#define ECHO_P1 34
#define TRIG_P2 14
#define ECHO_P2 35
#define TRIG_P3 27
#define ECHO_P3 33
#define TRIG_ENTRY 26
#define ECHO_ENTRY 32
#define TRIG_EXIT 25
#define ECHO_EXIT 12
// Threshold values
#define PARKING_THRESHOLD 30 // cm, for slot sensors
#define ENTRY_THRESHOLD 20 // cm, for entry gate
#define EXIT_THRESHOLD 20 // cm, for exit gate
#define SERVO_OPEN 90
#define SERVO_CLOSED 0
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// WebServer
WebServer server(80);
// Variables
int freeSlots = 0;
long entryDist = 0;
long exitDist = 0;
bool slot1Free = true, slot2Free = true, slot3Free = true;
// Function to read ultrasonic distance
long readUltrasonicCM(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
return duration * 0.034 / 2;
}
// Serve HTML page
void handleRoot() {
String html = "<!DOCTYPE html><html><head><title>Parking System</title>"
"<meta http-equiv='refresh' content='1'>"
"<style>"
"body{font-family:Arial;text-align:center;background:#f4f4f9;}"
".slot{font-size:20px;margin:10px;padding:10px;border-radius:8px;display:inline-block;width:150px;}"
".free{background:#8fbc8f;color:white;}"
".occupied{background:#cd5c5c;color:white;}"
"</style></head><body>";
html += "<h1>🚗 Smart Car Parking 🚗</h1>";
html += "<p><b>Free Slots: " + String(freeSlots) + "</b></p>";
html += "<div class='slot " + String(slot1Free ? "free" : "occupied") + "'>Slot 1: " + String(slot1Free ? "Free" : "Occupied") + "</div>";
html += "<div class='slot " + String(slot2Free ? "free" : "occupied") + "'>Slot 2: " + String(slot2Free ? "Free" : "Occupied") + "</div>";
html += "<div class='slot " + String(slot3Free ? "free" : "occupied") + "'>Slot 3: " + String(slot3Free ? "Free" : "Occupied") + "</div>";
html += "<p>Entry Gate: " + String(entryDist < ENTRY_THRESHOLD ? "Open" : "Closed") + "</p>";
html += "<p>Exit Gate: " + String(exitDist < EXIT_THRESHOLD ? "Open" : "Closed") + "</p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void setup() {
Serial.begin(115200);
// LCD init
lcd.begin(16, 2);
lcd.print("Smart Parking");
// Servo init
servoEntry.attach(SERVO_ENTRY_PIN);
servoExit.attach(SERVO_EXIT_PIN);
servoEntry.write(SERVO_CLOSED);
servoExit.write(SERVO_CLOSED);
// Ultrasonic pins
pinMode(TRIG_P1, OUTPUT); pinMode(ECHO_P1, INPUT);
pinMode(TRIG_P2, OUTPUT); pinMode(ECHO_P2, INPUT);
pinMode(TRIG_P3, OUTPUT); pinMode(ECHO_P3, INPUT);
pinMode(TRIG_ENTRY, OUTPUT); pinMode(ECHO_ENTRY, INPUT);
pinMode(TRIG_EXIT, OUTPUT); pinMode(ECHO_EXIT, INPUT);
// Connect WiFi
lcd.setCursor(0,1); lcd.print("Connecting WiFi...");
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println("WiFi connected! IP:");
Serial.println(WiFi.localIP());
lcd.clear(); lcd.print("WiFi Connected");
// Start server
server.on("/", handleRoot);
server.begin();
}
void loop() {
// Read parking slots
long d1 = readUltrasonicCM(TRIG_P1, ECHO_P1);
long d2 = readUltrasonicCM(TRIG_P2, ECHO_P2);
long d3 = readUltrasonicCM(TRIG_P3, ECHO_P3);
slot1Free = (d1 > PARKING_THRESHOLD);
slot2Free = (d2 > PARKING_THRESHOLD);
slot3Free = (d3 > PARKING_THRESHOLD);
freeSlots = (slot1Free ? 1 : 0) + (slot2Free ? 1 : 0) + (slot3Free ? 1 : 0);
// Entry & Exit
entryDist = readUltrasonicCM(TRIG_ENTRY, ECHO_ENTRY);
exitDist = readUltrasonicCM(TRIG_EXIT, ECHO_EXIT);
// Gate control
if(entryDist < ENTRY_THRESHOLD && freeSlots > 0) servoEntry.write(SERVO_OPEN);
else servoEntry.write(SERVO_CLOSED);
if(exitDist < EXIT_THRESHOLD) servoExit.write(SERVO_OPEN);
else servoExit.write(SERVO_CLOSED);
// LCD update
lcd.clear();
lcd.setCursor(0,0);
lcd.print("P1:");
lcd.print(slot1Free ? "F" : "O");
lcd.print(" P2:");
lcd.print(slot2Free ? "F" : "O");
lcd.print(" P3:");
lcd.print(slot3Free ? "F" : "O");
lcd.setCursor(0,1);
lcd.print("E:");
lcd.print(entryDist < ENTRY_THRESHOLD ? "Open" : "Clsd");
lcd.print(" X:");
lcd.print(exitDist < EXIT_THRESHOLD ? "Open" : "Clsd");
// Handle web server
server.handleClient();
delay(1000);
}
**/
#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32Servo.h>
#include <LiquidCrystal.h>
#include <WebServer.h>
// LCD
LiquidCrystal lcd(23, 22, 21, 19, 18, 5);
// Servo
Servo servoEntry;
Servo servoExit;
#define SERVO_ENTRY_PIN 15
#define SERVO_EXIT_PIN 4
// Ultrasonic Pins
#define TRIG_P1 13
#define ECHO_P1 34
#define TRIG_P2 14
#define ECHO_P2 35
#define TRIG_P3 27
#define ECHO_P3 33
#define TRIG_ENTRY 26
#define ECHO_ENTRY 32
#define TRIG_EXIT 25
#define ECHO_EXIT 12
// Threshold values
#define PARKING_THRESHOLD 30
#define ENTRY_THRESHOLD 20
#define EXIT_THRESHOLD 20
#define SERVO_OPEN 90
#define SERVO_CLOSED 0
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak API key
String apiKey = "L1VBBD49FRDZDYMS"; // 🔹 your key here
// Variables
int freeSlots = 0;
long entryDist = 0;
long exitDist = 0;
bool slot1Free = true, slot2Free = true, slot3Free = true;
// Web server
WebServer server(80);
long readUltrasonicCM(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
return duration * 0.034 / 2;
}
// Web page content
String generateHTML() {
String html = "<html><head><title>Smart Parking</title>";
html += "<style>body{font-family:Arial;text-align:center;} table{margin:auto;border-collapse:collapse;} td,th{border:1px solid #444;padding:10px;}</style></head><body>";
html += "<h2>🚗 Smart Parking System</h2>";
html += "<table><tr><th>Slot</th><th>Status</th></tr>";
html += "<tr><td>P1</td><td>" + String(slot1Free ? "Free" : "Occupied") + "</td></tr>";
html += "<tr><td>P2</td><td>" + String(slot2Free ? "Free" : "Occupied") + "</td></tr>";
html += "<tr><td>P3</td><td>" + String(slot3Free ? "Free" : "Occupied") + "</td></tr>";
html += "</table><br>";
html += "<h3>Free Slots: " + String(freeSlots) + "</h3>";
html += "<p>Entry Gate: " + String(entryDist < ENTRY_THRESHOLD ? "Open" : "Closed") + "</p>";
html += "<p>Exit Gate: " + String(exitDist < EXIT_THRESHOLD ? "Open" : "Closed") + "</p>";
html += "</body></html>";
return html;
}
void handleRoot() {
server.send(200, "text/html", generateHTML());
}
void setup() {
Serial.begin(115200);
// LCD init
lcd.begin(16, 2);
lcd.print("Smart Parking");
// Servo init
servoEntry.attach(SERVO_ENTRY_PIN);
servoExit.attach(SERVO_EXIT_PIN);
servoEntry.write(SERVO_CLOSED);
servoExit.write(SERVO_CLOSED);
// Ultrasonic pins
pinMode(TRIG_P1, OUTPUT); pinMode(ECHO_P1, INPUT);
pinMode(TRIG_P2, OUTPUT); pinMode(ECHO_P2, INPUT);
pinMode(TRIG_P3, OUTPUT); pinMode(ECHO_P3, INPUT);
pinMode(TRIG_ENTRY, OUTPUT); pinMode(ECHO_ENTRY, INPUT);
pinMode(TRIG_EXIT, OUTPUT); pinMode(ECHO_EXIT, INPUT);
// WiFi connect
lcd.setCursor(0,1); lcd.print("Connecting WiFi...");
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println("WiFi connected! IP:");
Serial.println(WiFi.localIP());
lcd.clear(); lcd.print("WiFi Connected");
// Web server routes
server.on("/", handleRoot);
server.begin();
}
void loop() {
// Read slots
long d1 = readUltrasonicCM(TRIG_P1, ECHO_P1);
long d2 = readUltrasonicCM(TRIG_P2, ECHO_P2);
long d3 = readUltrasonicCM(TRIG_P3, ECHO_P3);
slot1Free = (d1 > PARKING_THRESHOLD);
slot2Free = (d2 > PARKING_THRESHOLD);
slot3Free = (d3 > PARKING_THRESHOLD);
freeSlots = (slot1Free ? 1 : 0) + (slot2Free ? 1 : 0) + (slot3Free ? 1 : 0);
// Entry & Exit
entryDist = readUltrasonicCM(TRIG_ENTRY, ECHO_ENTRY);
exitDist = readUltrasonicCM(TRIG_EXIT, ECHO_EXIT);
// Gate control
if(entryDist < ENTRY_THRESHOLD && freeSlots > 0) servoEntry.write(SERVO_OPEN);
else servoEntry.write(SERVO_CLOSED);
if(exitDist < EXIT_THRESHOLD) servoExit.write(SERVO_OPEN);
else servoExit.write(SERVO_CLOSED);
// LCD update
lcd.clear();
lcd.setCursor(0,0);
lcd.print("P1:");
lcd.print(slot1Free ? "F" : "O");
lcd.print(" P2:");
lcd.print(slot2Free ? "F" : "O");
lcd.print(" P3:");
lcd.print(slot3Free ? "F" : "O");
lcd.setCursor(0,1);
lcd.print("E:");
lcd.print(entryDist < ENTRY_THRESHOLD ? "Open" : "Clsd");
lcd.print(" X:");
lcd.print(exitDist < EXIT_THRESHOLD ? "Open" : "Clsd");
// Send to ThingSpeak
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "http://api.thingspeak.com/update?api_key=" + apiKey +
"&field1=" + String(slot1Free ? 1 : 0) +
"&field2=" + String(slot2Free ? 1 : 0) +
"&field3=" + String(slot3Free ? 1 : 0) +
"&field4=" + String(entryDist < ENTRY_THRESHOLD ? 1 : 0) +
"&field5=" + String(exitDist < EXIT_THRESHOLD ? 1 : 0) +
"&field6=" + String(freeSlots);
http.begin(url);
int httpCode = http.GET();
if(httpCode > 0) {
Serial.println("Data sent: " + url);
} else {
Serial.println("Error sending data");
}
http.end();
}
// Handle web requests
server.handleClient();
delay(2000); // refresh rate
}