#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Define pins for IR sensors, LDR, and LEDs
const int IR1 = 8, IR2 = 12, IR3 = 2, LDR = 7, led1 = 6, led2 = 5, led3 = 3;
const int ir_s1 = 9, ir_s2 = 10;
// Define variables for sensor values and brightness
int val1, val2, val3, val4;
int brit = 10; // Brightness for LEDs
// LCD initialization: 16 columns and 2 rows, I2C address 0x27 and 0x26
LiquidCrystal_I2C lcd1(0x27, 16, 2); // LCD1 for temperature display
LiquidCrystal_I2C lcd2(0x26, 16, 2); // LCD2 for speed display
// Initialize DHT sensor
#define DHTPIN A0 // Analog pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 sensor
DHT dht(DHTPIN, DHTTYPE); // Create DHT object
// Variables to store the time when the IR sensors are triggered
unsigned long timer1;
unsigned long timer2;
// Variable to store the time difference between the two triggers
float Time;
// Flags to indicate if the sensors have been triggered
int flag1 = 0;
int flag2 = 0;
// Distance between the two IR sensors in meters
float distance = 5.0;
// Variable to store the calculated speed
float speed;
void setup() {
// Initialize pins
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
pinMode(IR3, INPUT);
pinMode(LDR, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(ir_s1, INPUT);
pinMode(ir_s2, INPUT);
// Initialize serial communication for debugging
Serial.begin(9600);
// Initialize the first LCD
lcd1.init();
lcd1.backlight();
// Initialize the second LCD
lcd2.init();
lcd2.backlight();
// Initialize DHT sensor
dht.begin();
}
void loop() {
// Read sensor values
val1 = digitalRead(IR1);
val2 = digitalRead(IR2);
val3 = digitalRead(IR3);
val4 = digitalRead(LDR);
int ir_s1_val = digitalRead(ir_s1);
int ir_s2_val = digitalRead(ir_s2);
// Read temperature and humidity sensor values
float temperatureC = dht.readTemperature();
// Print sensor values and temperature to serial monitor
Serial.print("IR1: "); Serial.print(val1);
Serial.print(" | IR2: "); Serial.print(val2);
Serial.print(" | IR3: "); Serial.print(val3);
Serial.print(" | LDR: "); Serial.print(val4);
Serial.print(" | Temp: "); Serial.print(temperatureC); Serial.println(" C");
Serial.print(" | IR_S1: "); Serial.print(ir_s1_val);
Serial.print(" | IR_S2: "); Serial.println(ir_s2_val);
// Display temperature on the first LCD
lcd1.clear();
lcd1.setCursor(0, 0);
lcd1.print("Temp: "); lcd1.print(temperatureC); lcd1.print(" C");
// Control LEDs based on sensor values
if (val1 == 0 && val2 == 0 && val3 == 0 && val4 == 0) {
// All sensors are inactive
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
} else if (val1 == 1 && val2 == 1 && val3 == 1 && val4 == 0) {
// Specific condition with all IR sensors active but LDR inactive
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
} else if (val1 == 0 && val2 == 0 && val3 == 0 && val4 == 1) {
// LDR active, all IR sensors inactive
analogWrite(led1, brit);
analogWrite(led2, brit);
analogWrite(led3, brit);
} else if (val1 == 1 && val2 == 0 && val3 == 0 && val4 == 1) {
// Specific condition with IR1 and LDR active
analogWrite(led1, 255);
analogWrite(led2, brit);
analogWrite(led3, brit);
} else if (val1 == 0 && val2 == 1 && val3 == 0 && val4 == 1) {
// Specific condition with IR2 and LDR active
analogWrite(led1, brit);
analogWrite(led2, 255);
analogWrite(led3, brit);
} else if (val1 == 0 && val2 == 0 && val3 == 1 && val4 == 1) {
// Specific condition with IR3 and LDR active
analogWrite(led1, brit);
analogWrite(led2, brit);
analogWrite(led3, 255);
} else if (val1 == 1 && val2 == 1 && val3 == 1 && val4 == 1) {
// All sensors are active
analogWrite(led1, 255);
analogWrite(led2, 255);
analogWrite(led3, 255);
}
// Speed measurement logic for the second LCD
if (ir_s1_val == LOW ) {
// First IR sensor triggered
timer1 = millis(); // Record the time
delay(100);
flag1 = 1; // Set the flag to indicate the sensor was triggered
}
if (ir_s2_val == LOW ) {
// Second IR sensor triggered
timer2 = millis(); // Record the time
delay(100);
flag2 = 1; // Set the flag to indicate the sensor was triggered
}
if (flag1 == 1 && flag2 == 1) {
// Both IR sensors have been triggered
if (timer1 > timer2) {
Time = (timer1 - timer2) / 1000.0; // Convert milliseconds to seconds
} else {
Time = (timer2 - timer1) / 1000.0; // Convert milliseconds to seconds
}
speed = (distance / Time); // Calculate speed in meters per second
speed = speed * 3.6; // Convert speed to kilometers per hour
}
if (speed == 0) {
// No speed calculated yet
lcd2.setCursor(0, 0);
if (flag1 == 0 && flag2 == 0) {
lcd2.print("No car detected");
lcd2.setCursor(0, 1);
lcd2.print("Searching... ");
}
} else {
// Display the calculated speed
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("Speed:");
lcd2.print(speed, 1);
lcd2.print(" Km/Hr ");
lcd2.setCursor(0, 1);
delay(3000);
if (speed > 50) {
lcd2.print(" Over Speeding ");
} else {
lcd2.print(" Normal Speed ");
}
speed = 0; // Reset the speed
flag1 = 0; // Reset the flag for the first sensor
flag2 = 0; // Reset the flag for the second sensor
}
}