← All Projects

Smart Parking System with OLED

34 viewsJune 27, 2026

Please note: there are only 2 parking slots, and one welcome gate sensor.

arduinocode.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Pin Definitions
const int GATE_IR_PIN = 2; // Entry Gate Sensor
const int IR_PIN_1    = 3; // Parking Slot 1
const int IR_PIN_2    = 4; // Parking Slot 2

void setup() {
  Serial.begin(115200);

  pinMode(GATE_IR_PIN, INPUT);
  pinMode(IR_PIN_1, INPUT);
  pinMode(IR_PIN_2, INPUT);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }

  // --- WELCOME PRELOADER SCREEN ---
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  
  display.setTextSize(1);
  display.setCursor(26, 12); 
  display.println("LITTLE ANGELS");
  display.setCursor(44, 26);
  display.println("PARKING");
  
  // Minimalist progress bar
  for (int i = 15; i <= 113; i += 3) {
    display.drawRect(15, 44, 98, 6, SSD1306_WHITE);
    display.fillRect(15, 44, i - 15, 6, SSD1306_WHITE);
    display.display();
    delay(30); 
  }
  delay(500); 
}

void loop() {
  bool vehicle_at_gate = (digitalRead(GATE_IR_PIN) == LOW);
  bool slot1_occupied  = (digitalRead(IR_PIN_1) == LOW);
  bool slot2_occupied  = (digitalRead(IR_PIN_2) == LOW);

  int occupied_count = (slot1_occupied ? 1 : 0) + (slot2_occupied ? 1 : 0);
  int slots_available = 2 - occupied_count;

  // --- GATE INTERRUPT LOGIC ---
  if (vehicle_at_gate) {
    display.clearDisplay();
    
    if (slots_available == 0) {
      display.setTextSize(2);
      display.setCursor(40, 12); 
      display.println("FULL");
      
      display.setTextSize(1);
      display.setCursor(29, 42);
      display.println("NO VACANCY");
      display.display();
      delay(1500); 
    } 
    else {
      display.setTextSize(2);
      display.setCursor(22, 12); 
      display.println("WELCOME");
      
      display.setTextSize(1);
      display.setCursor(23, 42);
      display.println("DRIVE INSIDE");
      display.display();
      delay(2000); 
    }
    return; 
  }

  // --- DEFAULT DASHBOARD STATE ---
  display.clearDisplay();

  if (slots_available == 0) {
    display.setTextSize(2);
    display.setCursor(22, 12);
    display.println("PARKING");
    display.setCursor(40, 36);
    display.println("FULL");
  } 
  else {
    // --- FIXED HEADER LAYOUT ---
    // Split into two lines and centered perfectly to prevent "G" wrapping
    display.setTextSize(1);
    display.setCursor(26, 2);  // Centers "LITTLE ANGELS"
    display.println("LITTLE ANGELS");
    display.setCursor(44, 12); // Centers "PARKING"
    display.println("PARKING");
    
    // Solid horizontal line moved down slightly to accommodate the 2-line header
    display.drawFastHLine(0, 24, 128, SSD1306_WHITE);

    // Dynamic Slot Counter Layout
    display.setCursor(16, 32);
    display.println("AVAILABLE SLOTS");
    
    display.setTextSize(2);
    display.setCursor(58, 46); // Centers a single big integer digit at the bottom
    display.print(slots_available);
  }

  display.display();
  delay(150); 
}