Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino Nano-Based Smart Parking System with Ultrasonic Sensors and I2C LCD Display

View and Edit Project In Cirkit DesignerImage of Arduino Nano-Based Smart Parking System with Ultrasonic Sensors and I2C LCD Display

Circuit Documentation

Summary

This circuit is designed to monitor parking slots using ultrasonic sensors and indicate their status using LEDs and an LCD display. The Arduino Nano serves as the central controller, interfacing with HC-SR04 ultrasonic sensors to detect the presence of vehicles in parking slots. The status of each slot is displayed on an I2C LCD screen and indicated by red and green LEDs: red for occupied and green for available. Additionally, a Tower Pro SG90 servo is included in the design, potentially for a physical indicator or barrier control.

Component List

Arduino Nano

I2C LCD 16x2 Screen

HC-SR04 Ultrasonic Sensor

LED: Two Pin (green)

LED: Two Pin (red)

Tower Pro SG90 Servo

Wiring Details

Arduino Nano

I2C LCD 16x2 Screen

HC-SR04 Ultrasonic Sensor

LED: Two Pin (green)

LED: Two Pin (red)

Tower Pro SG90 Servo

Documented Code

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Initialize the LCD objects for two LCDs with their I2C addresses
LiquidCrystal_I2C lcd1(0x27, 16, 2);
LiquidCrystal_I2C lcd2(0x26, 16, 2);

// Define pins for ultrasonic sensors
const int trigPin1 = 2;
const int echoPin1 = 3;
const int trigPin2 = 4;
const int echoPin2 = 5;
const int trigPin3 = 6;
const int echoPin3 = 7;
const int trigPin4 = 8;
const int echoPin4 = 9;

// Define pins for LEDs
const int redLED1 = 10;
const int redLED2 = 11;
const int redLED3 = 12;
const int redLED4 = 13;
const int greenLED1 = A0;
const int greenLED2 = A1;
const int greenLED3 = A2;
const int greenLED4 = A3;

long duration;
int distance;

void setup() {
  // Initialize the LCDs
  lcd1.init();                     
  lcd2.init();                       
  
  lcd1.backlight();
  lcd2.backlight();

  lcd1.setCursor(0, 0);
  lcd1.print("Slot 1:");

  lcd1.setCursor(0, 1);
  lcd1.print("Slot 2:");
  
  lcd2.setCursor(0, 0);
  lcd2.print("Slot 3:");
  
  lcd2.setCursor(0, 1);
  lcd2.print("Slot 4:");

  // Initialize pins for ultrasonic sensors
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(trigPin4, OUTPUT);
  pinMode(echoPin4, INPUT);

  // Initialize pins for LEDs
  pinMode(redLED1, OUTPUT);
  pinMode(redLED2, OUTPUT);
  pinMode(redLED3, OUTPUT);
  pinMode(redLED4, OUTPUT);
  pinMode(greenLED1, OUTPUT);
  pinMode(greenLED2, OUTPUT);
  pinMode(greenLED3, OUTPUT);
  pinMode(greenLED4, OUTPUT);
}

void loop() {
  // Check parking slot 1
  int distance1 = getDistance(trigPin1, echoPin1);
  lcd1.setCursor(8, 0);
  if (distance1 < 10) {
    lcd1.print("Occupied");
    digitalWrite(redLED1, HIGH);
    digitalWrite(greenLED1, LOW);
  } else {
    lcd1.print("Empty   ");
    digitalWrite(redLED1, LOW);
    digitalWrite(greenLED1, HIGH);
  }

  // Check parking slot 2
  int distance2 = getDistance(trigPin2, echoPin2);
  lcd1.setCursor(8, 1);
  if (distance2 < 10) {
    lcd1.print("Occupied");
    digitalWrite(redLED2, HIGH);
    digitalWrite(greenLED2, LOW);
  } else {
    lcd1.print("Empty   ");
    digitalWrite(redLED2, LOW);
    digitalWrite(greenLED2, HIGH);
  }

  // Check parking slot 3
  int distance3 = getDistance(trigPin3, echoPin3);
  lcd2.setCursor(8, 0);
  if (distance3 < 10) {
    lcd2.print("Occupied");
    digitalWrite(redLED3, HIGH);
    digitalWrite(greenLED3, LOW);
  } else {
    lcd2.print("Empty   ");
    digitalWrite(redLED3, LOW);
    digitalWrite(greenLED3, HIGH);
  }

  // Check parking slot 4
  int distance4 = getDistance(trigPin4, echoPin4);
  lcd2.setCursor(8, 1);
  if (distance4 < 10) {
    lcd2.print("Occupied");
    digitalWrite(redLED4, HIGH);
    digitalWrite(greenLED4, LOW);
  } else {
    lcd2.print("Empty   ");
    digitalWrite(redLED4, LOW);
    digitalWrite(greenLED4, HIGH);
  }

  delay(1000);  // Update every second
}

// Function to get the distance measured by the ultrasonic sensor
int getDistance(int trigPin, int echoPin) {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;

  return distance;
}

The code provided is for the Arduino Nano microcontroller. It initializes two I2C LCD displays and sets up the pins for the ultrasonic sensors and LEDs. In the main loop, it measures the distance using the ultrasonic sensors and updates the LCD and LED statuses accordingly. The getDistance function is used to calculate the distance based on the duration of the ultrasonic echo.