#include <Servo.h>
#include <AccelStepper.h>
// Pin definitions
const int irPin = 2;
const int trigPin = 6;
const int echoPin = 5;
const int relayPin = 7;
const int servoPin = 9;
const int stepPin = 3;
const int dirPin = 4;
const int enablePin = 8;
// Servo setup
Servo barrierServo;
// Stepper setup (A4988)
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
// Variables
long duration;
float distance;
void setup() {
// IR sensor
pinMode(irPin, INPUT);
// Ultrasonic
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Relay
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
Serial.begin(9600);
// Servo
barrierServo.attach(servoPin);
barrierServo.write(0); // Barrier closed
// Stepper
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, LOW); // Enable stepper
stepper.setMaxSpeed(200); // Adjust speed
stepper.setAcceleration(100);
}
void loop() {
int irState = digitalRead(irPin);
Serial.println(irState);
delay(500);
if (irState == HIGH) { // Vehicle detected
// Lift barrier
barrierServo.write(90);
// Measure distance
distance = getDistanceCM();
// Turn on relay if vehicle < 20 cm
if (distance < 20) {
digitalWrite(relayPin, HIGH);
} else {
digitalWrite(relayPin, LOW);
}
// Rotate stepper while barrier is open
stepper.moveTo(200); // Rotate 200 steps
stepper.run();
delay(1000); // Wait 1 second (optional for stability)
} else {
// No vehicle, reset
barrierServo.write(0); // Barrier down
digitalWrite(relayPin, LOW); // Relay off
}
}
// Function to measure distance using ultrasonic sensor
float getDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
// Calculate distance in cm
float distanceCM = (duration * 0.0343) / 2;
return distanceCM;
}