/**
Projeto: Leitura de Temperatura + Vibração com MPU6050 (RMS)
Objetivo: Medir vibração de uma máquina usando o acelerômetro e enviar ao Serial
Método: RMS (Root Mean Square), padrão industrial para análise de vibração
*/
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include "DHTesp.h"
const int DHT_PIN = 15;
DHTesp dhtSensor;
Adafruit_MPU6050 mpu;
// ----------- CONFIGURAÇÕES DE VIBRAÇÃO (Método RMS) ------------------
// Quantidade de amostras para RMS (200 = bom equilíbrio)
const int NUM_SAMPLES = 200;
// Buffer que acumula as leituras de vibração
float vibBuffer[NUM_SAMPLES];
int vibIndex = 0;
// Função para calcular RMS
float calcRMS(float *buffer, int n) {
float sum = 0;
for (int i = 0; i < n; i++) {
sum += buffer[i] * buffer[i]; // soma dos quadrados
}
return sqrt(sum / n); // raiz da média
}
void setup() {
Serial.begin(115200);
// Inicializa o sensor DHT22
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Inicializa o MPU6050
while (!mpu.begin()) {
Serial.println("MPU6050 não conectado!");
delay(1000);
}
Serial.println("MPU6050 pronto!");
// Ajusta filtro interno do MPU para reduzir ruído de vibração
mpu.setFilterBandwidth(MPU6050_BAND_10_HZ);
}
// estrutura de evento do MPU
sensors_event_t accel;
void loop() {
// ────────────────────────────────────────────────────────────────
// 1. LEITURA TEMPERATURA (DHT22) — leitura lenta (cada 2 s)
// Mantemos o delay fora do MPU para não afetar vibração
// ────────────────────────────────────────────────────────────────
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 1) + " °C");
Serial.println("------------------------------");
// ────────────────────────────────────────────────────────────────
// 2. COLETA RÁPIDA DE AMOSTRAS DO MPU6050 PARA RMS
// Aqui NÃO usamos delay grande, para medir vibração corretamente
// ────────────────────────────────────────────────────────────────
// Coleta 200 amostras rapidamente
for (int i = 0; i < NUM_SAMPLES; i++) {
// Lê apenas o acelerômetro (mais rápido)
mpu.getAccelerometerSensor()->getEvent(&accel);
// Calcula a magnitude da vibração instantânea
float mag = sqrt(
accel.acceleration.x * accel.acceleration.x +
accel.acceleration.y * accel.acceleration.y +
accel.acceleration.z * accel.acceleration.z
);
// Armazena no buffer
vibBuffer[vibIndex++] = mag;
// Se chegamos ao fim, calcula RMS
if (vibIndex >= NUM_SAMPLES) {
float rms = calcRMS(vibBuffer, NUM_SAMPLES);
Serial.print("Vibração RMS: ");
Serial.print(rms, 4);
Serial.println(" m/s^2");
Serial.println("------------------------------");
vibIndex = 0; // reinicia buffer
}
delay(5); // pequeno atraso para não saturar o processador (200 amostras ~1s)
}
// ----------------------------------------------------------------
// Delay TOTAL do loop = ~2 segundos, necessário para o DHT22
// mas coleta de vibração ocorre dentro do loop anterior sem bloquear
// ----------------------------------------------------------------
}