#include <Servo.h> // Includes the servo library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define LCD and servo objects
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo myservo;
// Define IR sensor pins
#define ir_enter 2
#define ir_back 4
#define ir_car1 5
#define ir_car2 6
#define ir_car3 7
// Define slot states and flags
int S[3] = {0, 0, 0};
int flag1 = 0, flag2 = 0;
int slot = 3;
void setup() {
Serial.begin(9600);
// Initialize IR sensor pins
for (int i = 0; i < 3; i++) {
pinMode(ir_car1 + i, INPUT);
}
pinMode(ir_enter, INPUT);
pinMode(ir_back, INPUT);
// Initialize servo and LCD
myservo.attach(3);
myservo.write(90);
lcd.begin(20, 4);
lcd.setCursor(0, 1);
lcd.print(" Car parking ");
lcd.setCursor(0, 2);
lcd.print(" System ");
delay(2000);
lcd.clear();
// Read initial sensor states and calculate available slots
Read_Sensor();
slot = slot - (S[0] + S[1] + S[2]);
}
void loop() {
Read_Sensor();
lcd.setCursor(0, 0);
lcd.print(" Have Slot: ");
lcd.print(slot);
lcd.print(" ");
// Display sensor states
for (int i = 0; i < 3; i++) {
lcd.setCursor((i % 2) * 10, 1 + (i / 2));
lcd.print("S");
lcd.print(i + 1);
lcd.print(":");
if (S[i] == 1) {
lcd.print("Fill ");
} else {
lcd.print("Empty");
}
}
// Handle entering cars
if (digitalRead(ir_enter) == LOW && flag1 == 0) {
if (slot > 0) {
flag1 = 1;
if (flag2 == 0) {
myservo.write(180);
slot--;
}
} else {
lcd.setCursor(0, 0);
lcd.print(" Sorry Parking Full ");
delay(1500);
}
}
// Handle exiting cars
if (digitalRead(ir_back) == LOW && flag2 == 0) {
flag2 = 1;
if (flag1 == 0) {
myservo.write(180);
slot++;
}
}
// Reset flags and servo position
if (flag1 == 1 && flag2 == 1) {
delay(1000);
myservo.write(90);
flag1 = 0;
flag2 = 0;
}
delay(1);
}
void Read_Sensor() {
// Reset sensor states
for (int i = 0; i < 3; i++) {
S[i] = (digitalRead(ir_car1 + i) == LOW) ? 1 : 0;
}
}