#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pins
#define STRAIN_PIN A1
#define GREEN_LED D12
#define YELLOW_LED D11
#define RED_LED D13
#define BUZZER D10
// MPU6050
#define MPU_ADDR 0x68
void setup() {
Serial.begin(115200);
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
// All outputs OFF
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
// I2C
Wire.begin();
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("BRIDGE HEALTH");
lcd.setCursor(0, 1);
lcd.print("SYSTEM READY");
// Start MPU6050
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
delay(2000);
}
void loop() {
// Read strain simulation
int strain = analogRead(STRAIN_PIN);
Serial.print("Strain: ");
Serial.println(strain);
// Turn everything OFF
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER, LOW);
lcd.clear();
// NORMAL
if (strain < 100) {
digitalWrite(GREEN_LED, HIGH);
lcd.setCursor(0, 0);
lcd.print("BRIDGE NORMAL");
lcd.setCursor(0, 1);
lcd.print("SAFE");
Serial.println("STATUS: NORMAL");
}
// WARNING
else if (strain < 200) {
digitalWrite(YELLOW_LED, HIGH);
lcd.setCursor(0, 0);
lcd.print("BRIDGE WARNING");
lcd.setCursor(0, 1);
lcd.print("CAUTION");
Serial.println("STATUS: WARNING");
}
// CRITICAL
else {
digitalWrite(RED_LED, HIGH);
// Buzzer ON ONLY during critical
digitalWrite(BUZZER, HIGH);
lcd.setCursor(0, 0);
lcd.print("CRITICAL ALERT");
lcd.setCursor(0, 1);
lcd.print("ALERT PASSENGERS");
Serial.println("STATUS: CRITICAL");
Serial.println("BUZZER: ON");
}
delay(500);
}