#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ===== LCD Setup =====
LiquidCrystal_I2C lcd(0x27, 16, 2); // Change 0x27 to 0x3F if your module uses that address
// ===== Sensor pins =====
const int sensor1Pin = 2;
const int sensor2Pin = 3;
// ===== Variables =====
volatile unsigned long startTime = 0;
volatile unsigned long endTime = 0;
volatile bool firstSensorTriggered = false;
float distance = 0.20; // distance between sensors in meters (example: 20 cm = 0.20 m)
float speed = 0.0;
void setup() {
pinMode(sensor1Pin, INPUT);
pinMode(sensor2Pin, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Vehicle Speed");
lcd.setCursor(0,1);
lcd.print("Waiting...");
Serial.begin(9600);
}
void loop() {
int sensor1State = digitalRead(sensor1Pin);
int sensor2State = digitalRead(sensor2Pin);
// When first sensor detects vehicle
if (sensor1State == LOW && !firstSensorTriggered) {
startTime = millis(); // record start time
firstSensorTriggered = true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Vehicle Detected");
}
// When second sensor detects vehicle
if (sensor2State == LOW && firstSensorTriggered) {
endTime = millis(); // record end time
unsigned long timeDiff = endTime - startTime; // time in ms
// Calculate speed
float timeSec = timeDiff / 1000.0; // convert ms to seconds
speed = distance / timeSec; // speed in m/s
float speedKmHr = speed * 3.6; // convert to km/h
// Display on LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Speed:");
lcd.setCursor(0,1);
lcd.print(speedKmHr);
lcd.print(" km/h");
// Print on Serial Monitor
Serial.print("Time (s): ");
Serial.print(timeSec);
Serial.print(" Speed: ");
Serial.print(speedKmHr);
Serial.println(" km/h");
// Reset flag
firstSensorTriggered = false;
delay(2000); // pause before next vehicle
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Waiting...");
}
}
No comments:
Post a Comment