#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SSD1306.h>
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
struct Limites {
float alerta;
float critico;
String nome;
};
Limites biblioteca[] = {
{18.0, 35.0, "FACTOR 125"},
{3.5, 8.0, "AR-CONDIC."},
{7.5, 18.0, "MOTOR IND."},
{9.5, 22.0, "BOMBA HIDRAU."},
{5.0, 15.0, "VENTILADOR"},
{25.0, 45.0, "COMPR. PISTAO"}
};
int perfilAtivo = 1;
bool aprendendo = true;
unsigned long tempoInicio;
float somaRMS = 0;
int amostras = 0;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Erro Display");
}
if (!mpu.begin()) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,10);
display.println("ERRO SENSOR!");
display.display();
while (1);
}
tempoInicio = millis();
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
float rms = abs(a.acceleration.z - 9.81);
if (aprendendo) {
unsigned long decorrido = (millis() - tempoInicio) / 1000;
somaRMS += rms;
amostras++;
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.println("SMARTVIB: ANALISANDO");
int barra = map(decorrido, 0, 30, 0, 128);
display.drawRect(0, 25, 128, 10, WHITE);
display.fillRect(0, 25, barra, 10, WHITE);
display.setCursor(0, 45);
display.print("Tempo: "); display.print(decorrido); display.println("s / 30s");
display.display();
if (decorrido >= 30) {
float media = somaRMS / amostras;
if (media > 20.0) perfilAtivo = 5;
else if (media > 14.0) perfilAtivo = 0;
else if (media > 8.0) perfilAtivo = 3;
else if (media > 6.0) perfilAtivo = 2;
else if (media > 3.0) perfilAtivo = 4;
else perfilAtivo = 1;
aprendendo = false;
}
} else {
String status = "NORMAL";
if (rms >= biblioteca[perfilAtivo].critico) status = "PERIGO";
else if (rms >= biblioteca[perfilAtivo].alerta) status = "ALERTA";
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.print("ATIVO: "); display.println(biblioteca[perfilAtivo].nome);
display.drawLine(0, 12, 128, 12, WHITE);
display.setCursor(0, 20);
display.print("Vib: "); display.print(rms); display.println(" m/s2");
display.setTextSize(2);
display.setCursor(0, 40);
display.println(status);
display.display();
// FORMATO EXATO PARA O GRAFICO
Serial.print("Vibracao_RMS:");
Serial.println(rms);
}
delay(100);
}