#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#define UP 1 // تذكر تحديد اتجاه الحركة في كل من الموتورين بالنسبة ل stepper direction pin
#define DOWN 0
#define BACKWARD 3
#define FORWARD 2
#define V 1
#define H 0
#define LimitSwitch1 A0
#define LimitSwitch2 A1
#define LimitSwitch3 A2
#define LimitSwitch4 A3
#define IR1 A4
#define IR2 A5
#define flameSensor 2
#define echoPin 3
#define trigPin 4
#define Buzzer 5
#define startButton 6
#define stepperPulseh 7 // relay pin 1 --> Horizontal motor
#define stepperDirh 8 // relay pin 2 --> Vertical motor
#define stepperEnh 9
#define stepperPulsev 10
#define stepperDirv 11
#define stepperEnv 12
#define servoPin 13
void Stepper_ON(int u8MotorDirection,int u8SensorPin,int u8MovementDirection)
{
int u8SensorValue = digitalRead(u8SensorPin);;
switch(u8MotorDirection)
{
case 0:
digitalWrite(stepperDirv,HIGH);
break;
case 1:
digitalWrite(stepperDirv,LOW);
case 2:
digitalWrite(stepperDirh,HIGH);
break;
case 3:
digitalWrite(stepperDirh,LOW);
break;
}
switch(u8MovementDirection)
{
case 0:
digitalWrite(stepperEnh,LOW);
//Serial.println("before while hor");
while(u8SensorValue == HIGH)
{
//Serial.println("in while hor");
digitalWrite(stepperPulseh,HIGH);
delayMicroseconds(150);
digitalWrite(stepperPulseh,LOW);
delayMicroseconds(150);
u8SensorValue = digitalRead(u8SensorPin);
}
//Serial.println("after while hor ");
digitalWrite(stepperEnh,HIGH);
break;
case 1:
digitalWrite(stepperEnv,LOW);
//Serial.println("before while ver");
while(u8SensorValue == HIGH)
{
//Serial.println("in while ver");
digitalWrite(stepperPulsev,HIGH);
delayMicroseconds(150);
digitalWrite(stepperPulsev,LOW);
delayMicroseconds(150);
u8SensorValue = digitalRead(u8SensorPin);
}
//Serial.println("after while ver");
digitalWrite(stepperEnv,HIGH);
break;
}
}
/*------------------------- Function Definition Of stepper motor to turn it off-----------------------------*/
void Stepper_off(int u8MovementDirection)
{
switch(u8MovementDirection)
{
case 0:
digitalWrite(stepperEnv,HIGH);
break;
case 1:
digitalWrite(stepperEnh,HIGH);
break;
}
}
void Park(int u8Pos)
{
switch(u8Pos)
{
case 1:
Stepper_ON(UP,IR1,V);
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(DOWN,LimitSwitch1,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
break;
case 2:
Stepper_ON(UP,IR2,V);
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(DOWN,IR1,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
Stepper_ON(DOWN,LimitSwitch1,V);
break;
case 3:
Stepper_ON(UP,LimitSwitch2,V);
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(DOWN,IR2,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
Stepper_ON(DOWN,LimitSwitch1,V);
break;
default:
break;
}
}
void Take_out(int u8Pos)
{
switch(u8Pos)
{
case 1:
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(UP,IR1,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
Stepper_ON(DOWN,LimitSwitch1,V);
break;
case 2:
Stepper_ON(UP,IR1,V);
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(UP,IR2,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
Stepper_ON(DOWN,LimitSwitch1,V);
break;
case 3:
Stepper_ON(UP,IR2,V);
Stepper_ON(FORWARD,LimitSwitch4,H);
Stepper_ON(UP,LimitSwitch2,V);
Stepper_ON(BACKWARD,LimitSwitch3,H);
Stepper_ON(DOWN,LimitSwitch1,V);
break;
default:
break;
}
}
int u8servo;
int u8Pos;
int u8Mode;
long duration;
int distance;
int flag;
char flag1 = 0;
char flag2 = 0;
// Create a Servo object
Servo myServo;
// LCD I2C
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// Set up the LCD's number of columns and rows
lcd.init();
// Turn on the backlight
lcd.backlight();
// Print a message to the LCD
lcd.setCursor(4, 0);
lcd.print("Welcome!");
delay(2000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Parking System");
pinMode(startButton, INPUT_PULLUP);
pinMode(stepperPulseh, OUTPUT);
pinMode(servoPin, OUTPUT);
pinMode(stepperDirh, OUTPUT);
pinMode(stepperEnh, OUTPUT);
pinMode(stepperDirv, OUTPUT);
pinMode(stepperEnv, OUTPUT);
pinMode(stepperPulsev, OUTPUT);
pinMode(LimitSwitch1, INPUT_PULLUP);
pinMode(LimitSwitch2, INPUT_PULLUP);
pinMode(LimitSwitch3, INPUT_PULLUP);
pinMode(LimitSwitch4, INPUT_PULLUP);
pinMode(IR1, INPUT_PULLUP);
pinMode(IR2, INPUT_PULLUP);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(Buzzer,OUTPUT);
myServo.attach(servoPin);
}
void loop() {
// put your main code here, to run repeatedly:
u8Mode = 1;
u8Pos = 2;
u8servo = 1;
if(u8servo == 1 && flag1 == 0)
{
myServo.write(0);
flag1 = 1;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Parking System");
lcd.setCursor(1, 1);
lcd.print(" Gate Opened ");
delay(2000);
}
int startButtonValue = digitalRead(startButton);
if(startButtonValue == 0)
{
for(int i=0; i<=90; i++)
{
myServo.write(i);
}
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Parking System");
lcd.setCursor(1, 1);
lcd.print(" Gate Closed ");
if (u8Mode == 1)
{
Park(u8Pos);
}
else if (u8Mode == 2)
{
Take_out(u8Pos);
}
}
// UltraSonic sensor
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = duration * 0.034 / 2;
if(distance <= 10 && flag == 0){
digitalWrite(Buzzer, HIGH);
//Serial.println("buzzer on");
flag = 1;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Parking System");
lcd.setCursor(4, 1);
lcd.print(" Stop !");
delay(1000);
}
else if(distance <= 10 && flag == 1)
{
digitalWrite(Buzzer, LOW);
//Serial.println("buzzer off");
flag = 0;
delay(1000);
}
else if(flag2 == 0)
{
flag2 = 1;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Parking System");
}
}