#include <Servo.h>
// Pin definitions
const uint8_t IR_PIN = 2;
const uint8_t TRIG_PIN = 6;
const uint8_t ECHO_PIN = 5;
const uint8_t SERVO_PIN = 9;
const uint8_t RELAY_PIN = 7;
const uint8_t STEP_PIN = 3;
const uint8_t DIR_PIN = 4;
const uint8_t ENABLE_PIN = 5;
Servo barrierServo;
const unsigned int STEPS_PER_REV = 200;
const unsigned long STEP_DELAY_US = 1000;
void setup() {
Serial.begin(9600);
pinMode(IR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(ENABLE_PIN, LOW); // Enable stepper driver
barrierServo.attach(SERVO_PIN);
barrierServo.write(0); // Barrier down
}
void loop() {
if (digitalRead(IR_PIN) == HIGH) {
Serial.println("Vehicle detected");
// Lift barrier
barrierServo.write(90);
delay(500);
// Measure distance
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
// Warning light if vehicle is too close
if (distance < 20) {
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Warning: Vehicle too close");
} else {
digitalWrite(RELAY_PIN, LOW);
}
// Rotate signboard
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < STEPS_PER_REV; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(STEP_DELAY_US);
}
delay(2000); // Keep barrier open
// Lower barrier
barrierServo.write(0);
digitalWrite(RELAY_PIN, LOW);
delay(1000);
}
}