#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
const int buttonPin = 2;
const int redLedPin = 7;
const int greenLedPin = 8;
const int servoPin = 9;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address, 16 columns, 2 rows
Servo myServo;
bool isOccupied = false;
bool buttonState = false;
bool lastButtonState = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 15;
int servoPosition = 90; // Initial servo position
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(redLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
myServo.attach(servoPin);
myServo.write(servoPosition);
lcd.begin(16, 2); // LCD initialization
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Parking Status:");
lcd.setCursor(0, 1);
lcd.print("Vacant");
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
isOccupied = !isOccupied;
updateLCD();
if (isOccupied) {
servoPosition = 0; // Open the gate/barrier
}
}
}
}
lastButtonState = reading;
if((isOccupied == true) && (servoPosition == 0)){
myServo.write(0);
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
// Wait for a duration (e.g., 5 seconds) before closing the gate/barrier
delay(5000);
servoPosition = 90; // Close the gate/barrier
isOccupied = false;
updateLCD();
} else {
myServo.write(servoPosition);
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
}
/*if (isOccupied) {
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
} else {
digitalWrite(redLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
}*/
delay(100);
}
void updateLCD() {
lcd.setCursor(0, 1);
if (isOccupied) {
lcd.print("Occupied ");
} else {
lcd.print("Vacant ");
}
}