#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU6050.h>
// Define o endereço do LCD 16x2(12I)
#define LCD_ADDRESS 0x27
// Define o endereço do MPU6050
#define MPU_ADDRESS 0x68
// Define o pino do BUZZER
#define BUZZER_PIN 9
// Cria um objeto LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);
// Cria um objeto MPU6050
MPU6050 mpu(MPU_ADDRESS);
// Define uma variável para armazenar a aceleração total
float totalAccel;
// Define uma variável para armazenar a magnitude do terremoto
float magnitude;
// Define uma variável para armazenar o limiar de detecção
float threshold = 1.5;
// Define uma variável para armazenar o tempo do último terremoto
unsigned long lastTime = 0;
// Define uma variável para armazenar o intervalo mínimo entre terremotos
unsigned long interval = 10000;
void setup() {
// Inicia a comunicação serial
Serial.begin(9600);
// Inicia o LCD
lcd.init();
lcd.backlight();
// Inicia o MPU6050
Wire.begin();
mpu.initialize();
// Verifica se o MPU6050 está conectado
if (mpu.testConnection()) {
Serial.println("MPU6050 conectado");
} else {
Serial.println("MPU6050 não conectado");
}
// Inicia o BUZZER
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// Lê os valores de aceleração do MPU6050
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
// Converte os valores de aceleração para g
float gx = ax / 16384.0;
float gy = ay / 16384.0;
float gz = az / 16384.0;
// Calcula a aceleração total
totalAccel = sqrt(gx * gx + gy * gy + gz * gz);
// Calcula a magnitude do terremoto usando a fórmula logarítmica
magnitude = log10(totalAccel) + 3;
// Mostra os valores de aceleração e magnitude no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Accel: ");
lcd.print(totalAccel);
lcd.setCursor(0, 1);
lcd.print("Mag: ");
lcd.print(magnitude);
// Mostra os valores de aceleração e magnitude no monitor serial
Serial.print("Accel: ");
Serial.println(totalAccel);
Serial.print("Mag: ");
Serial.println(magnitude);
// Verifica se a magnitude é maior que o limiar e se o intervalo mínimo foi respeitado
if (magnitude > threshold && millis() - lastTime > interval) {
// Atualiza o tempo do último terremoto
lastTime = millis();
// Emite um som no BUZZER proporcional à magnitude
tone(BUZZER_PIN, 440 * magnitude, 1000);
// Mostra uma mensagem de alerta no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Terremoto detectado!");
lcd.setCursor(0, 1);
lcd.print("Mag: ");
lcd.print(magnitude);
// Mostra uma mensagem de alerta no monitor serial
Serial.println("Terremoto detectado!");
Serial.print("Mag: ");
Serial.println(magnitude);
}
// Aguarda um intervalo de tempo
delay(1000);
}