#include <ESP32Servo.h>
#include <WiFi.h>
#include <FireBase32.h>
#include <Firebase.h>
// Gate Ultrasonic Sensor Pins
const int gateTrig = 4; // Gate sensor Trig
const int gateEcho = 5; // Gate sensor Echo
// Parking Slot Ultrasonic Sensor Pins
const int slotPins[5][2] = { // Slot sensors (Trig, Echo)
{18, 19}, {21, 22}, {23, 25}, {26, 27}, {32, 33}
};
// Servo Motor Pin for Gate
const int servoPin = 12;
// Firebase Configuration
#define FIREBASE_HOST "https://smart-parking-system-b0b1a-default-rtdb.firebaseio.com"
#define FIREBASE_AUTH "AIzaSyDu_vQoGLoiNFrwEtSYPbnhi_W724MqjPg"
// WiFi Credentials
#define WIFI_SSID "wokwi-GUEST"
#define WIFI_PASSWORD ""
// Constants
const int gateDistanceThreshold = 100; // Open gate if car is within 100 cm
const int slotDistanceThreshold = 10; // Mark slot as FILLED if distance <= 10 cm
// Create Servo Object
Servo gateServo;
// Firebase Data Object
FirebaseData fbdo;
void setup() {
Serial.begin(115200);
// Initialize Gate Ultrasonic Sensor
pinMode(gateTrig, OUTPUT);
pinMode(gateEcho, INPUT);
// Initialize Parking Slot Ultrasonic Sensors
for (int i = 0; i < 5; i++) {
pinMode(slotPins[i][0], OUTPUT); // Trig
pinMode(slotPins[i][1], INPUT); // Echo
}
// Initialize Servo Motor for Gate
gateServo.attach(servoPin);
gateServo.write(0); // Close gate initially
// Connect to WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
// Initialize Firebase
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
Serial.println("Firebase Initialized");
Serial.println("System Ready");
}
void loop() {
// Gate Control Logic
int gateDistance = getDistance(gateTrig, gateEcho);
Serial.print("Gate Sensor Distance: ");
Serial.println(gateDistance);
if (gateDistance > 0 && gateDistance <= gateDistanceThreshold) {
openGate(); // Open gate
delay(5000); // Keep the gate open for 5 seconds
closeGate(); // Close the gate
} else {
Serial.println("Gate Closed - No Car Detected within Threshold");
}
// Parking Slot Monitoring and Firebase Update
for (int i = 0; i < 5; i++) {
int slotDistance = getDistance(slotPins[i][0], slotPins[i][1]);
bool isSlotFilled = (slotDistance > 0 && slotDistance <= slotDistanceThreshold);
// Update slot status to Firebase
String path = "/slots/slot" + String(i + 1); // Path: /slots/slot1, /slots/slot2, ...
if (Firebase.setBool(fbdo, path, !isSlotFilled)) { // True = AVAILABLE, False = FILLED
Serial.print("Slot ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(isSlotFilled ? "FILLED" : "AVAILABLE");
} else {
Serial.print("Failed to update slot ");
Serial.print(i + 1);
Serial.print(" -> ");
Serial.println(fbdo.errorReason());
}
}
delay(1000); // Delay for 1 second before repeating
}
// Function to Measure Distance Using Ultrasonic Sensor
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 20000); // Timeout after 20ms
if (duration == 0) {
return -1; // No response (object too far or not detected)
}
int distance = duration * 0.034 / 2; // Convert time to distance (cm)
return distance;
}
// Function to Open the Gate
void openGate() {
gateServo.write(90); // Rotate servo to open gate
Serial.println("Gate Opened");
}
// Function to Close the Gate
void closeGate() {
gateServo.write(0); // Rotate servo to close gate
Serial.println("Gate Closed");
}