#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <math.h>
// Declaração das variáveis para armazenar os valores lidos do sensor
int16_t acelX, acelY, acelZ;
// Constantes para a escala da leitura do sensor e conversão de m/s para km/h
const float escala = 16384.0;
const float mps_para_kmph = 3.6;
// Pino do buzzer e LED
const int BUZZER_PIN = 8;
const int LED_PIN = 9;
// Variáveis para armazenar o estado do buzzer e LED
bool buzzerAtivo = false;
bool ledAtivo = false;
// Inicialização do display LCD 20x4 (I2C)
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
// Inicialização da comunicação serial
Serial.begin(9600);
// Inicialização do sensor MPU-6050
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
// Inicialização do display LCD
lcd.init();
lcd.backlight();
// Configuração dos pinos do buzzer e LED como saída
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Leitura dos valores do sensor
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 6, true);
// Conversão dos valores lidos para a unidade de aceleração (m/s²)
acelX = Wire.read() << 8 | Wire.read();
acelY = Wire.read() << 8 | Wire.read();
acelZ = Wire.read() << 8 | Wire.read();
// Cálculo da magnitude do vetor de aceleração
float acelMagnitude = sqrt(pow(acelX, 2) + pow(acelY, 2) + pow(acelZ, 2));
// Conversão do valor da magnitude para a unidade de velocidade (km/h)
float velMagnitude = acelMagnitude / escala * mps_para_kmph;
// Impressão do valor da velocidade de deslocamento geral no display LCD
lcd.setCursor(0, 0);
lcd.print("Velocidade geral:");
lcd.setCursor(0, 1);
lcd.print(velMagnitude);
lcd.print(" km/h ");
// Impressão do valor da velocidade de deslocamento geral na porta serial
Serial.print("Velocidade geral: ");
Serial.print(velMagnitude);
Serial.println(" km/h");
// Ativa o buzzer e o LED se a velocidade for maior que 10 km/h
if (velMagnitude > 10) {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
buzzerAtivo = true;
ledAtivo = true;
} else if (velMagnitude <= 10) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
buzzerAtivo = false;
ledAtivo = false;
}
// Aguarda um intervalo de tempo para a próxima leitura
delay(100);
}