/*
Vibration Meter V2.1 Final
Arduino UNO + MPU6050 + 16x2 LCD
*/
#include <Wire.h>
#include "I2Cdev.h"
#include "MPU6050.h"
#include <LiquidCrystal_I2C.h>
MPU6050 mpu;
LiquidCrystal_I2C lcd(0x27,16,2);
const byte BUTTON_PIN=2;
const unsigned long TEST_TIME=120000UL; //waktu pembacaan
const unsigned long SAMPLE_TIME=10;
const float THRESHOLD=0.15;
int LED = 3;
bool running=false;
unsigned long startTime,lastSample,lastPage=0;
byte page=0;
int16_t rawAx,rawAy,rawAz,rawGx,rawGy,rawGz;
float res,lastAx=0,lastAy=0,lastAz=0;
float moveVal;
unsigned long samples=0,events=0;
float sumX=0,sumY=0,sumZ=0,sumMove=0;
float avgX,avgY,avgZ,avgMove;
float peakX=0,peakY=0,peakZ=0,peakMove=0,meter=0;
void resetData(){
samples=events=0;
sumX=sumY=sumZ=sumMove=0;
peakX=peakY=peakZ=peakMove=0;
page=0;
}
void setup(){
Wire.begin();
Serial.begin(115200);
pinMode(BUTTON_PIN,INPUT_PULLUP);
pinMode(LED,OUTPUT);
lcd.init(); lcd.backlight();
mpu.initialize();
mpu.setFullScaleAccelRange(2);
res=mpu.get_acce_resolution();
lcd.setCursor(0, 0);
lcd.print("Mulai Pembacaan");
lcd.setCursor(0, 1);
lcd.print("Tekan Tombol");
}
void showResultPage() {
lcd.clear();
switch (page) {
// Layar Rata-Rata
case 0:
lcd.setCursor(0, 0);
lcd.print("RT:T");
lcd.print(avgMove, 2);
lcd.setCursor(9, 0);
lcd.print("X ");
lcd.print(avgX, 2);
lcd.setCursor(0, 1);
lcd.print("Y ");
lcd.print(avgY, 2);
lcd.setCursor(9, 1);
lcd.print("Z ");
lcd.print(avgZ, 2);
break;
// Layar Puncak
case 1:
lcd.setCursor(0, 0);
lcd.print("PC:T");
lcd.print(peakMove, 2);
lcd.setCursor(9, 0);
lcd.print("X ");
lcd.print(peakX, 2);
lcd.setCursor(0, 1);
lcd.print("Y ");
lcd.print(peakY, 2);
lcd.setCursor(9, 1);
lcd.print("Z ");
lcd.print(peakZ, 2);
break;
case 2:
lcd.print("jumlah Gtr: ");
lcd.print(events);
lcd.setCursor(0,1);
lcd.print("Meter Gtr : ");
lcd.print(meter,2);
break;
}
page = (page + 1) % 3;
}
void loop(){
if(!running && samples>0){
if(millis()-lastPage>10000){lastPage=millis();showResultPage();}
if(digitalRead(BUTTON_PIN)==LOW){delay(200);resetData();running=true;startTime=millis();digitalWrite(LED,HIGH);}
return;
}
if(!running){
if(digitalRead(BUTTON_PIN)==LOW){
delay(200);resetData();running=true;startTime=millis();digitalWrite(LED,HIGH);
lcd.clear();
}
return;
}
if(millis()-lastSample>=SAMPLE_TIME){
lastSample=millis();
mpu.getMotion6(&rawAx,&rawAy,&rawAz,&rawGx,&rawGy,&rawGz);
float ax=rawAx*res, ay=rawAy*res, az=rawAz*res;
moveVal=abs(ax-lastAx)+abs(ay-lastAy)+abs(az-lastAz);
lastAx=ax; lastAy=ay; lastAz=az;
samples++;
sumX+=abs(ax); sumY+=abs(ay); sumZ+=abs(az); sumMove+=moveVal;
if(abs(ax)>peakX) peakX=abs(ax);
if(abs(ay)>peakY) peakY=abs(ay);
if(abs(az)>peakZ) peakZ=abs(az);
if(moveVal>peakMove) peakMove=moveVal;
if(moveVal>THRESHOLD) events++;
Serial.print("X:");Serial.print(ax,2);
Serial.print("| Y:");Serial.print(ay,2);
Serial.print("| Z:");Serial.print(az,2);
Serial.print("| Meter:");Serial.println(moveVal,2);
unsigned long remaining = (TEST_TIME - (millis() - startTime)) / 1000;
byte minutes = remaining / 60;
byte seconds = remaining % 60;
lcd.setCursor(0,0);
lcd.print("T:");
if (minutes < 10) lcd.print("0");
lcd.print(minutes);
lcd.print(":");
if (seconds < 10) lcd.print("0");
lcd.print(seconds);
lcd.print(" ");
lcd.setCursor(0,1);lcd.print("M:");lcd.print(moveVal,1);lcd.print(" ");
}
if(millis()-startTime>=TEST_TIME){
running=false;
digitalWrite(LED,LOW);
avgX=sumX/samples;
avgY=sumY/samples;
avgZ=sumZ/samples;
avgMove=sumMove/samples;
meter=avgMove*((float)events/120.0);
Serial.println("\n===== HASIL =====");
Serial.print("Sampel : ");Serial.println(samples);
Serial.print("Getaran : ");Serial.println(events);
Serial.println("--- Rata-rata ---");
Serial.print("X : ");Serial.println(avgX,2);
Serial.print("Y : ");Serial.println(avgY,2);
Serial.print("Z : ");Serial.println(avgZ,2);
Serial.print("Total : ");Serial.println(avgMove,2);
Serial.println("---- Puncak ----");
Serial.print("X : ");Serial.println(peakX,2);
Serial.print("Y : ");Serial.println(peakY,2);
Serial.print("Z : ");Serial.println(peakZ,2);
Serial.print("Getaran/s : ");Serial.println(peakMove,2);
Serial.print("Indek Gtr : ");Serial.println(meter,2);
lastPage=0;
showResultPage();
}
}