#include <Servo.h>
#include <LiquidCrystal.h>
#include <TimerOne.h>
LiquidCrystal lcd(12, 11, 10, 8, 5, 4);
Servo myservo;
int distanceThreshold = 100;
int parkingAvailable = 3;
int barrierState = 0;
const int TRIGGER_PIN_SLOT_1 = A0;
const int ECHO_PIN_SLOT_1 = A1;
const int TRIGGER_PIN_SLOT_2 = A2;
const int ECHO_PIN_SLOT_2 = A3;
const int TRIGGER_PIN_SLOT_3 = A4;
const int ECHO_PIN_SLOT_3 = A5;
const int TRIGGER_PIN_ENTER = 3;
const int ECHO_PIN_ENTER = 2;
const int TRIGGER_PIN_EXIT = 13;
const int ECHO_PIN_EXIT = 9;
const int TIMER = 25000;
volatile long echo_start = 0;
volatile long distance_enter = 0;
void ultrasonicEcho(){
if(echo_start != 0){
distance_enter = (micros() - echo_start) / 58;
echo_start = 0;
}
}
void ultrasonicPulse(){
digitalWrite(TRIGGER_PIN_ENTER, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN_ENTER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN_ENTER, LOW);
echo_start = micros();
}
void setup() {
lcd.begin(16,2);
lcd.setCursor(0,0);
Serial.begin (9600);
myservo.attach(6);
myservo.write(0);
pinMode(TRIGGER_PIN_ENTER, OUTPUT);
pinMode(ECHO_PIN_ENTER, INPUT_PULLUP);
Timer1.initialize(TIMER);
Timer1.attachInterrupt(ultrasonicPulse);
attachInterrupt(digitalPinToInterrupt(ECHO_PIN_ENTER), ultrasonicEcho, FALLING);
}
long readDistance(int triggerPin, int echoPin)
{
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
return pulseIn(echoPin, HIGH);
}
void loop()
{
float distance_slot_1 = readDistance(TRIGGER_PIN_SLOT_1, ECHO_PIN_SLOT_1) / 58;
float distance_slot_2 = readDistance(TRIGGER_PIN_SLOT_2, ECHO_PIN_SLOT_2) / 58;
float distance_slot_3 = readDistance(TRIGGER_PIN_SLOT_3, ECHO_PIN_SLOT_3) / 58;
float distance_exit = readDistance(TRIGGER_PIN_EXIT, ECHO_PIN_EXIT) / 58;
Serial.println("Distance slot 1 = " + String(distance_slot_1) + "cm");
Serial.println("Distance slot 2 = " + String(distance_slot_2) + "cm");
Serial.println("Distance slot 3 = " + String(distance_slot_3) + "cm");
Serial.println("Distance enter = " + String(distance_enter) + "cm");
Serial.println("Distance exit = " + String(distance_exit) + "cm");
if (barrierState == 0)
{
if (distance_enter<100 && distance_exit>=100 && parkingAvailable>0)
{
parkingAvailable -= 1;
barrierState = -1;
myservo.write(90);
}
if (distance_enter>=100 && distance_exit<100 && parkingAvailable<3)
{
parkingAvailable += 1;
barrierState = 1;
myservo.write(90);
}
}
else if (barrierState == -1)
{
if (distance_enter>=100 && distance_exit<100)
{
barrierState = -2;
myservo.write(0);
}
}
else if (barrierState == 1)
{
if (distance_exit>=100 && distance_enter<100)
{
barrierState = 2;
myservo.write(0);
}
}
else if (barrierState == -2)
{
if (distance_exit>=100)
{
barrierState = 0;
}
}
else if (barrierState == 2)
{
if (distance_enter>=100)
{
barrierState = 0;
}
}
lcd.setCursor(0,0);
if (parkingAvailable == 0)
{
lcd.print("Parking Full ");
}
else
{
lcd.print("Parking left ");
lcd.print(parkingAvailable);
}
if (distance_slot_1 > 100 & distance_slot_2 > 100 & distance_slot_3 > 100)
{
lcd.setCursor(0,1);
lcd.print("Slot 1 2 3 Free");
delay(500);
}
else if((distance_slot_1>100 & distance_slot_2>100)|(distance_slot_2>100 & distance_slot_3>100)|(distance_slot_3>100 & distance_slot_1>100))
{
lcd.setCursor(0,1);
if(distance_slot_1>100 & distance_slot_2>100)
lcd.print("Slot 1 & 2 Free");
else if(distance_slot_1>100 & distance_slot_3>100)
lcd.print("Slot 1 & 3 Free");
else
lcd.print("Slot 2 & 3 Free");
}
else if(distance_slot_1<100 & distance_slot_2<100 & distance_slot_3<100)
{
lcd.setCursor(0,1);
lcd.print("Parking Full ");
}
else if((distance_slot_1<100 & distance_slot_2<100)|(distance_slot_2<100 & distance_slot_3<100)|(distance_slot_3<100 & distance_slot_1<100))
{
lcd.setCursor(0,1);
if(distance_slot_1>100)
lcd.print("Slot 1 is Free ");
else if (distance_slot_2>100)
lcd.print("Slot 2 is Free ");
else
lcd.print("Slot 3 is Free ");
}
delay(100);
}