#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU6050.h>
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT22
#define BUZZER 12
#define LED 13
LiquidCrystal_I2C lcd(0x27, 16, 2);
MPU6050 mpu;
DHT dht(DHTPIN, DHTTYPE);
const int threshold = 15; // Earthquake sensitivity
void setup() {
Wire.begin();
lcd.begin(16, 2);
lcd.backlight();
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
// Step 1: Show startup message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Quake Eye Ready");
delay(3000);
// Step 2: Calibrating message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Calibrating...");
delay(1000);
// Step 3: Two beep-light signals
for (int i = 0; i < 2; i++) {
digitalWrite(LED, HIGH);
tone(BUZZER, 1000, 200);
delay(300);
digitalWrite(LED, LOW);
noTone(BUZZER);
delay(300);
}
// Initialize sensors
mpu.initialize();
dht.begin();
// System ready for live monitoring
lcd.clear();
lcd.print("System Operational");
delay(1000);
lcd.clear();
}
void loop() {
// --- Read MPU6050 Acceleration ---
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
int X = ax / 100;
int Y = ay / 100;
int Z = az / 100;
// --- Read DHT22 Temperature & Humidity ---
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// --- Display Live Data on LCD ---
lcd.setCursor(0, 0);
lcd.print("X:");
lcd.print(X);
lcd.print(" Y:");
lcd.print(Y);
lcd.print(" Z:");
lcd.print(Z);
// --- Earthquake Detection ---
if (abs(X) > threshold || abs(Y) > threshold || abs(Z) > threshold) {
lcd.setCursor(0, 1);
lcd.print("Earthquake Alert ");
digitalWrite(LED, HIGH);
tone(BUZZER, 1000);
delay(200);
digitalWrite(LED, LOW);
delay(200);
}
else {
// When stable, show live T & H again
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(hum, 0);
lcd.print("% ");
noTone(BUZZER);
digitalWrite(LED, LOW);
}
delay(500);
}