#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <math.h> // Biblioteca para funções matemáticas
// Endereço I2C do sensor MPU-6050
const int MPU = 0x68;
// Variáveis para armazenar valores do sensor
int16_t AccX, AccY, AccZ;
float magnitude; // Variável para armazenar a magnitude da vibração
// Configurações do Display LCD 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço I2C do LCD: 0x27, 20 colunas, 4 linhas
void setup() {
Serial.begin(9600);
// Inicialização do LCD
lcd.init();
lcd.backlight();
// Inicialização do MPU-6050
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
// Configura o acelerômetro para +/- 16g
Wire.beginTransmission(MPU);
Wire.write(0x1C);
Wire.write(0x18);
Wire.endTransmission(true);
// Limpa o LCD
lcd.clear();
}
void loop() {
// Solicita os dados ao sensor
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Registrador para leitura do acelerômetro X
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Solicita 6 bytes do sensor
// Verifica se os dados foram recebidos
if (Wire.available() == 6) {
// Armazena os valores do acelerômetro nos eixos X, Y, Z
AccX = Wire.read() << 8 | Wire.read();
AccY = Wire.read() << 8 | Wire.read();
AccZ = Wire.read() << 8 | Wire.read();
// Calcula a magnitude da vibração
magnitude = sqrt(pow(AccX, 2) + pow(AccY, 2) + pow(AccZ, 2));
// Exibe os valores no LCD
lcd.setCursor(0, 0);
lcd.print("Acc X: ");
lcd.print(AccX);
lcd.setCursor(0, 1);
lcd.print("Acc Y: ");
lcd.print(AccY);
lcd.setCursor(0, 2);
lcd.print("Acc Z: ");
lcd.print(AccZ);
lcd.setCursor(0, 3);
lcd.print("Magnitude: ");
lcd.print(magnitude);
lcd.print(" g"); // Unidade de medida, g (gravidade)
} else {
Serial.println("Erro ao ler os dados do acelerômetro");
}
// Atraso de 500ms entre leituras
delay(500);
}