#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define ultrasonic sensor pins
#define trigPin1 2
#define echoPin1 3
#define trigPin2 4
#define echoPin2 5
#define trigPin3 6
#define echoPin3 7
// Define LED pins for each parking space
#define redLED1 8
#define greenLED1 9
#define redLED2 10
#define greenLED2 11
#define redLED3 12
#define greenLED3 13
// Define buzzer pins for each parking space
#define buzzer1 A0
#define buzzer2 A1
#define buzzer3 A2
// Create LCD object
LiquidCrystal_I2C lcd(0x27, 16, 2);
long duration;
int distance;
int threshold = 100; // Distance threshold (30 cm)
// Track the state of each parking space
bool vehicleDetected1 = false;
bool vehicleDetected2 = false;
bool vehicleDetected3 = false;
void setup() {
// Initialize LCD
lcd.init();
lcd.backlight();
// Set up ultrasonic sensor pins
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
// Set up LED and buzzer pins
pinMode(redLED1, OUTPUT);
pinMode(greenLED1, OUTPUT);
pinMode(redLED2, OUTPUT);
pinMode(greenLED2, OUTPUT);
pinMode(redLED3, OUTPUT);
pinMode(greenLED3, OUTPUT);
pinMode(buzzer1, OUTPUT);
pinMode(buzzer2, OUTPUT);
pinMode(buzzer3, OUTPUT);
// Initial display on LCD
lcd.setCursor(0, 0);
lcd.print("Parking System");
delay(2000);
lcd.clear();
}
void loop() {
checkParkingSpace(trigPin1, echoPin1, redLED1, greenLED1, buzzer1, vehicleDetected1, 0, "S1"); // Row 0
checkParkingSpace(trigPin2, echoPin2, redLED2, greenLED2, buzzer2, vehicleDetected2, 1, "S2"); // Row 1, first half
checkParkingSpace(trigPin3, echoPin3, redLED3, greenLED3, buzzer3, vehicleDetected3, 1, "S3"); // Row 1, second half
delay(500);
}
void checkParkingSpace(int trigPin, int echoPin, int redLED, int greenLED, int buzzer, bool &vehicleDetected, int lcdRow, String spaceName) {
// Send ultrasonic signal
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure the time for echo
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Convert to cm
if (distance < threshold && distance > 0) { // Vehicle detected
// Check if this is the first time a vehicle is detected (state change)
if (!vehicleDetected) {
// Beep the buzzer once (200 ms) on detection
tone(buzzer, 1000, 1000);
vehicleDetected = true; // Update state to indicate vehicle detected
}
// Turn on red LED, turn off green LED
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
// Display "Occupied" message on the LCD
if (lcdRow == 0) {
lcd.setCursor(0, lcdRow); // S1 starts at position 0, row 0
} else if (spaceName == "S2") {
lcd.setCursor(0, 1); // S2 starts at position 0, row 1
} else if (spaceName == "S3") {
lcd.setCursor(8, 1); // S3 starts at position 8, row 1
}
lcd.print(spaceName + ": Occu");
} else { // No vehicle detected
// Reset the state if vehicle was previously detected
if (vehicleDetected) {
vehicleDetected = false; // Update state to no vehicle detected
}
// Turn on green LED, turn off red LED
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
noTone(buzzer); // Ensure buzzer is off
// Display "Free" message on the LCD
if (lcdRow == 0) {
lcd.setCursor(0, lcdRow); // S1 starts at position 0, row 0
} else if (spaceName == "S2") {
lcd.setCursor(0, 1); // S2 starts at position 0, row 1
} else if (spaceName == "S3") {
lcd.setCursor(8, 1); // S3 starts at position 8, row 1
}
lcd.print(spaceName + ": Free ");
}
}