#define trigPin 13
#define echoPin 12
#define RED_LED 2
#define ORANGE_LED 3
#define YELLOW_LED 4
#define WHITE_LED 5
#define BUZZER 8
#define ARM_BUTTON 7
#include <LiquidCrystal_I2C.h>
boolean armed = false;
boolean tripped = false;
boolean lastButtonState = HIGH;
unsigned long buttonPressTime = 0;
LiquidCrystal_I2C lcd(0x27, 16 , 2);
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(ORANGE_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(WHITE_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(ARM_BUTTON, INPUT_PULLUP);
Serial.println("System Starting...");
delay(1500);
Serial.println("DISARMED");
lcd.init();
lcd.backlight();
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
boolean currentButtonState = digitalRead(ARM_BUTTON);
lcd.setCursor(0,1);
lcd.print("Distance = ");
lcd.print(distance);
lcd.print("cm ");
if (lastButtonState == HIGH && currentButtonState == LOW) {
buttonPressTime = millis();
}
if (lastButtonState == LOW && currentButtonState == HIGH) {
unsigned long pressLength = millis() - buttonPressTime;
if (pressLength > 1000) {
tripped = false;
Serial.println("RESET");
} else {
armed = !armed;
Serial.println(armed ? "ARMED" : "DISARMED");
}
}
lastButtonState = currentButtonState;
if (armed && distance <= 20) {
tripped = true;
}
digitalWrite(WHITE_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(RED_LED, LOW);
if (tripped) {
digitalWrite(RED_LED, HIGH);
tone(BUZZER, 2000);
lcd.setCursor(0,0);
lcd.print("ALARM TRIPPED ");
Serial.print("ALARM TRIPPED | Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(150);
return;
}
if (!armed) {
noTone(BUZZER);
Serial.print("DISARMED | Distance: ");
Serial.print(distance);
Serial.println(" cm");
showDistanceLEDs(distance);
delay(150);
return;
}
Serial.print("ARMED | Distance: ");
Serial.print(distance);
Serial.println(" cm");
showDistanceLEDs(distance);
buzzerPattern(distance);
delay(150);
}
void showDistanceLEDs(long distance) {
if (distance > 60 && distance <= 80) {
digitalWrite(WHITE_LED, HIGH);
lcd.setCursor(0,0);
lcd.print("Obj. Detected ");
} else if (distance > 40 && distance <= 60) {
digitalWrite(YELLOW_LED, HIGH);
lcd.setCursor(0,0);
lcd.print("Closer ");
} else if (distance > 20 && distance <= 40) {
digitalWrite(ORANGE_LED, HIGH);
lcd.setCursor(0,0);
lcd.print("Warning Close ");
} else if (distance > 0 && distance <= 20) {
digitalWrite(RED_LED, HIGH);
lcd.setCursor(0,0);
lcd.print("Danger ");
}
else {
lcd.setCursor(0,0);
lcd.print(" ");
}
}
void buzzerPattern(long distance) {
if (distance <= 20) {
tone(BUZZER, 2000);
} else if (distance <= 40) {
tone(BUZZER, 1500);
delay(100);
noTone(BUZZER);
} else if (distance <= 60) {
tone(BUZZER, 1000);
delay(200);
noTone(BUZZER);
} else if (distance <= 80) {
tone(BUZZER, 600);
delay(300);
noTone(BUZZER);
} else {
noTone(BUZZER);
}
}