#include <LiquidCrystal.h>
#include <ESP32Servo.h>
// -------- PIN DEFINITIONS --------
#define TRIG_IN 5
#define ECHO_IN 18
#define TRIG_OUT 17
#define ECHO_OUT 16
#define ENTRY_SERVO_PIN 4
#define EXIT_SERVO_PIN 2 // choose a free pin
#define GREEN_LED 25
#define RED_LED 26
// -------- LCD PINS --------
LiquidCrystal lcd(14, 27, 33, 32, 21, 22);
Servo entryGate;
Servo exitGate;
// -------- VARIABLES --------
int totalSpots = 5;
int availableSpots = 5;
bool entryDetected = false;
bool exitDetected = false;
// -------- FUNCTION TO MEASURE DISTANCE --------
long readDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2;
return distance;
}
// -------- SETUP --------
void setup() {
pinMode(TRIG_IN, OUTPUT);
pinMode(ECHO_IN, INPUT);
pinMode(TRIG_OUT, OUTPUT);
pinMode(ECHO_OUT, INPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
entryGate.attach(ENTRY_SERVO_PIN);
exitGate.attach(EXIT_SERVO_PIN);
entryGate.write(0); // closed
exitGate.write(0); // closed
lcd.begin(16, 2);
lcd.print("Smart Parking");
delay(2000);
lcd.clear();
}
// -------- LOOP --------
void loop() {
long entryDistance = readDistance(TRIG_IN, ECHO_IN);
long exitDistance = readDistance(TRIG_OUT, ECHO_OUT);
// ---- ENTRY LOGIC ----
if (entryDistance < 10 && !entryDetected) {
entryDetected = true;
if (availableSpots > 0) {
entryGate.write(90);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH); // open gate
delay(2000);
entryGate.write(0);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH); // close gate
availableSpots--;
}
}
if (entryDistance > 15) {
entryDetected = false;
}
// ---- EXIT LOGIC ----
if (exitDistance < 10 && !exitDetected) {
exitDetected = true;
exitGate.write(90);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, HIGH); // open gate
delay(2000);
exitGate.write(0);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH); // close gate
if (availableSpots < totalSpots) {
availableSpots++;
}
}
if (exitDistance > 15) {
exitDetected = false;
}
// ---- LCD DISPLAY ----
lcd.setCursor(0, 0);
lcd.print("Available: ");
lcd.print(availableSpots);
lcd.print(" ");
lcd.setCursor(0, 1);
if (availableSpots == 0) {
lcd.print("Parking FULL ");
} else {
lcd.print("Welcome ");
}
delay(200);
}