#include <Servo.h>
#define SPEEDBUMP_SERVO_PIN 9
#define LDR_PIN 3
#define IR_SENSOR_1_PIN 4
#define IR_SENSOR_2_PIN 5
#define STREET_LIGHTS_RELAY_PIN 6
#define ULTRASONIC_TRIG 10
#define ULTRASONIC_ECHO 8
Servo speedBumpServo;
const float distanceBetweenIRs = 22.0;
unsigned long timeIR1 = 0;
unsigned long timeIR2 = 0;
float vehicleSpeed = 0;
const float speedLimit = 10.0;
unsigned long lightOnTime = 0;
const unsigned long lightDuration = 10000;
bool lightState = false;
float readUltrasonic() {
digitalWrite(ULTRASONIC_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG, LOW);
long duration = pulseIn(ULTRASONIC_ECHO, HIGH, 30000);
float distance = (duration * 0.034) / 2;
return distance;
}
void setup() {
Serial.begin(9600);
pinMode(IR_SENSOR_1_PIN, INPUT);
pinMode(IR_SENSOR_2_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(ULTRASONIC_TRIG, OUTPUT);
pinMode(ULTRASONIC_ECHO, INPUT);
pinMode(STREET_LIGHTS_RELAY_PIN, OUTPUT);
speedBumpServo.attach(SPEEDBUMP_SERVO_PIN);
speedBumpServo.write(0);
Serial.println("Arduino System Initialized");
}
void loop() {
unsigned long currentMillis = millis();
bool isNight = (digitalRead(LDR_PIN) == HIGH);
if (isNight) {
float distance = readUltrasonic();
if (distance > 0 && distance <= 20.0) {
lightState = true;
lightOnTime = currentMillis;
digitalWrite(STREET_LIGHTS_RELAY_PIN, HIGH);
Serial.println("Vehicle detected → Light ON");
}
// Turn OFF after 20 seconds
if (lightState && (currentMillis - lightOnTime >= lightDuration)) {
lightState = false;
digitalWrite(STREET_LIGHTS_RELAY_PIN, LOW);
Serial.println("20s elapsed → Light OFF");
}
} else {
lightState = false;
digitalWrite(STREET_LIGHTS_RELAY_PIN, LOW);
}
static bool sensor1Triggered = false;
static bool sensor2Triggered = false;
bool ir1 = !digitalRead(IR_SENSOR_1_PIN);
bool ir2 = !digitalRead(IR_SENSOR_2_PIN);
if (ir1 && !sensor1Triggered) {
timeIR1 = millis();
sensor1Triggered = true;
}
if (ir2 && sensor1Triggered && !sensor2Triggered) {
timeIR2 = millis();
sensor2Triggered = true;
unsigned long timeDiff = timeIR2 - timeIR1;
if (timeDiff > 0) {
vehicleSpeed = (distanceBetweenIRs * 1000.0) / timeDiff;
Serial.print("Vehicle Speed: ");
Serial.print(vehicleSpeed);
Serial.println(" cm/s");
if (vehicleSpeed > speedLimit) {
speedBumpServo.write(15);
Serial.println("SPEED VIOLATION! Bump Raised");
unsigned long bumpTime = millis();
while (millis() - bumpTime < 3000) {
// system keeps running
}
speedBumpServo.write(0);
Serial.println("Bump Lowered");
}
}
sensor1Triggered = false;
sensor2Triggered = false;
}
if (sensor1Triggered && (millis() - timeIR1 > 5000)) {
sensor1Triggered = false;
}
}