#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define TRIGGER_ENTRANCE_PIN 4
#define ECHO_ENTRANCE_PIN 5
#define TRIGGER_EXIT_PIN 6
#define ECHO_EXIT_PIN 7
#define SERVO_PIN_ENTRANCE 3
#define SERVO_PIN_EXIT 8
#define SLOT_CAPACITY 4
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo entranceBarrier; // Servo for entrance barrier
Servo exitBarrier; // Servo for exit barrier
int availableSlots = SLOT_CAPACITY;
void setup() {
pinMode(TRIGGER_ENTRANCE_PIN, OUTPUT);
pinMode(ECHO_ENTRANCE_PIN, INPUT);
pinMode(TRIGGER_EXIT_PIN, OUTPUT);
pinMode(ECHO_EXIT_PIN, INPUT);
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("GOD IS MY LIGHT");
delay(2000);
lcd.clear();
entranceBarrier.attach(SERVO_PIN_ENTRANCE);
entranceBarrier.write(0); // Initial position
exitBarrier.attach(SERVO_PIN_EXIT);
exitBarrier.write(0); // Initial position
}
void loop() {
int entranceDistance = detectDistance(TRIGGER_ENTRANCE_PIN, ECHO_ENTRANCE_PIN);
int exitDistance = detectDistance(TRIGGER_EXIT_PIN, ECHO_EXIT_PIN);
lcd.setCursor(0, 0);
lcd.print("Welcome");
lcd.setCursor(0, 1);
lcd.print("Slots: ");
lcd.print(availableSlots);
delay(1000);
lcd.clear();
// Entrance logic
if (entranceDistance <= 30 && availableSlots > 0) {
lcd.setCursor(0, 0);
lcd.print("Car Entering!");
moveServo(entranceBarrier); // Open entrance barrier
availableSlots--;
}
// Exit logic
if (exitDistance <= 30 && availableSlots < SLOT_CAPACITY) {
lcd.setCursor(0, 0);
lcd.print("Car Exiting!");
moveServo(exitBarrier); // Open exit barrier
availableSlots++;
}
// Display if parking is full
if (availableSlots == 0) {
lcd.setCursor(0, 0);
lcd.print("Parking Full!");
delay(1000);
lcd.clear();
}
}
int detectDistance(int triggerPin, int echoPin) {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
int duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}
void moveServo(Servo servo) {
servo.write(90); // Open barrier
delay(2000); // Hold the barrier open for 2 seconds
servo.write(0); // Close barrier
lcd.clear(); // Clear LCD immediately after barrier closes
delay(500); // Allow servo to stabilize
}