#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h> // Servo Library for ESP32
#define IR_SENSOR 15 // IR Receiver Pin (Vehicle Detection)
#define PARKING_LED 18 // LED Indicator for Parking Slot
#define BUZZER 23 // Buzzer for Alerts
#define SERVO_PIN 19 // Servo Motor Pin
const char* ssid = "Wokwi-GUEST"; // ✅ Updated WiFi Network
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
Servo gateServo; // Servo object
LiquidCrystal_I2C lcd(0x27, 16, 2); // ✅ Change to 0x3F if LCD doesn't work
void setup() {
Serial.begin(115200);
pinMode(IR_SENSOR, INPUT);
pinMode(PARKING_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
gateServo.attach(SERVO_PIN); // Attach the servo motor
Serial.println("Initializing LCD...");
lcd.init(); // ✅ Initialize LCD
lcd.backlight(); // ✅ Turn on LCD backlight
lcd.clear(); // ✅ Clear LCD
lcd.setCursor(0, 0);
lcd.print("Smart Parking...");
Serial.println("LCD Initialized!");
delay(2000);
lcd.clear();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
Serial.print("Connecting to WiFi...");
lcd.setCursor(0, 0);
lcd.print("Connecting WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Connected!");
delay(2000);
lcd.clear();
}
void loop() {
if (!client.connected()) {
reconnect_mqtt();
}
client.loop();
int vehicle_detected = digitalRead(IR_SENSOR);
if (vehicle_detected == LOW) { // Vehicle detected
digitalWrite(PARKING_LED, HIGH);
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
// Open Gate
gateServo.write(90);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vehicle Detected");
lcd.setCursor(0, 1);
lcd.print("Gate Opening...");
delay(3000); // Keep gate open for 3 seconds
gateServo.write(0); // Close gate
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Slot Occupied");
Serial.println("Vehicle Entered");
client.publish("smartparking/slot1", "Occupied");
} else {
digitalWrite(PARKING_LED, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Slot Available");
Serial.println("Slot is Free");
client.publish("smartparking/slot1", "Free");
}
delay(1000);
}
void reconnect_mqtt() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connected!");
delay(2000);
lcd.clear();
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}