#include <WiFi.h>
#include <FirebaseESP32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 🔹 Wi-Fi credentials
#define WIFI_SSID "Haashim"
#define WIFI_PASSWORD "aslam2608"
// 🔹 Firebase project URL
#define FIREBASE_HOST "https://parksense-3c095-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_AUTH "" // leave empty if not using secret key
// 🔹 OLED setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 🔹 LEDs and Buttons
int ledPins[5] = {18, 19, 23, 5, 4};
int buttonPins[5] = {14, 27, 26, 25, 33};
int slotStatus[5] = {0, 0, 0, 0, 0}; // 0 = free, 1 = occupied
FirebaseData fbdo;
void setup() {
Serial.begin(115200);
// GPIO setup
for (int i = 0; i < 5; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
// OLED setup
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED init failed"));
while (1);
}
display.clearDisplay();
display.display();
// Wi-Fi connect
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected!");
// Firebase connect
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
}
void loop() {
int freeCount = 0, occupiedCount = 0;
// Read button input and toggle slot state
for (int i = 0; i < 5; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
slotStatus[i] = !slotStatus[i]; // toggle
delay(300); // debounce
}
digitalWrite(ledPins[i], slotStatus[i]);
if (slotStatus[i] == 1)
occupiedCount++;
else
freeCount++;
}
// OLED Display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
for (int i = 0; i < 5; i++) {
display.setCursor(0, i * 10);
display.print("Slot ");
display.print(i + 1);
display.print(": ");
display.print(slotStatus[i] ? "OCC" : "FREE");
}
display.setCursor(0, 55);
display.print("Free: ");
display.print(freeCount);
display.display();
// 🔹 Push Data to Firebase (new structure)
if (Firebase.ready()) {
// Push individual slot statuses
for (int i = 0; i < 5; i++) {
String slotPath = "parkingAreas/area2/slot" + String(i + 1);
Firebase.setString(fbdo, slotPath, slotStatus[i] ? "occupied" : "free");
}
// Optional: Push summary (so frontend can show map markers dynamically)
Firebase.setInt(fbdo, "parkingAreas/area2/free", freeCount);
Firebase.setInt(fbdo, "parkingAreas/area2/occupied", occupiedCount);
Firebase.setInt(fbdo, "parkingAreas/area2/total_slots", 5);
Firebase.setFloat(fbdo, "parkingAreas/area2/lat", 9.9252);
Firebase.setFloat(fbdo, "parkingAreas/area2/lng", 78.1198);
Firebase.setString(fbdo, "parkingAreas/area2/name", "Madurai Parking");
Firebase.setString(fbdo, "parkingAreas/area2/last_updated", String(millis()));
}
delay(2000); // every 2 seconds
}