#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define GREEN_LED 6
#define RELAY_PIN 7
#define RED_LED 8
#define BUZZER 9
#define RESET_BUTTON 10
#define MPU_ADDR 0x68
bool earthquake = false;
long threshold = 25000;
void setup() {
Serial.begin(9600);
pinMode(GREEN_LED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(RESET_BUTTON, INPUT_PULLUP);
// Normal condition
digitalWrite(GREEN_LED,HIGH);
digitalWrite(RED_LED,LOW);
digitalWrite(RELAY_PIN,HIGH);
digitalWrite(BUZZER,LOW);
lcd.init();
lcd.backlight();
Wire.begin();
// Wake MPU6050
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission();
lcd.clear();
lcd.print("SYSTEM NORMAL");
}
void loop() {
int16_t ax, ay, az;
// Read MPU6050 acceleration
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR,6,true);
ax = Wire.read()<<8 | Wire.read();
ay = Wire.read()<<8 | Wire.read();
az = Wire.read()<<8 | Wire.read();
long vibration = abs(ax)+abs(ay)+abs(az);
Serial.println(vibration);
if(vibration > threshold)
{
earthquake = true;
}
// Earthquake Mode
if(earthquake)
{
digitalWrite(GREEN_LED,LOW);
digitalWrite(RED_LED,HIGH);
digitalWrite(RELAY_PIN,LOW);
tone(BUZZER,1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("EARTHQUAKE!");
lcd.setCursor(0,1);
lcd.print("POWER OFF");
}
// Reset Button
if(digitalRead(RESET_BUTTON)==LOW)
{
earthquake=false;
digitalWrite(GREEN_LED,HIGH);
digitalWrite(RED_LED,LOW);
digitalWrite(RELAY_PIN,HIGH);
noTone(BUZZER);
lcd.clear();
lcd.print("SYSTEM NORMAL");
delay(1000);
}
delay(200);
}