#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
sensors_event_t event;
bool isMoving = false;
Adafruit_MPU6050 mpu;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void setup(void) {
Serial.begin(115200);
if (!mpu.begin()) {
Serial.println(F("Failed to find MPU6050 chip"));
for (;;); // Don't proceed, loop forever
}
oled.setRotation(2);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
oled.setTextSize(1);
oled.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // overwrite pixels
oled.clearDisplay();
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_2000_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
oled.print("Ready!");
oled.display();
Serial.println(F("Ready!"));
delay(2000);
oled.clearDisplay();
oled.setCursor(10, 20);
oled.print(F("No motion"));
oled.display();
}
void loop() {
isMoving = false;
mpu.getAccelerometerSensor()->getEvent(&event);
Serial.print("X: ");
Serial.print(event.acceleration.x);
if (event.acceleration.x != 0) {
isMoving = true;
oled.setCursor(10, 20);
oled.print(F("Side to side"));
}
Serial.print(", Y: ");
Serial.print(event.acceleration.y);
if (event.acceleration.y != 0) {
isMoving = true;
oled.setCursor(10, 20);
oled.print(F("Front to back"));
}
Serial.print(", Z: ");
Serial.print(event.acceleration.z);
if (event.acceleration.z <= 9.80 || event.acceleration.z >= 9.90) {
isMoving = true;
oled.setCursor(10, 20);
oled.print(F("Up and down"));
}
Serial.println(" m/s^2");
if (isMoving) {
oled.display();
} else {
oled.clearDisplay();
oled.setCursor(10, 20);
oled.print(F("No motion"));
oled.display();
}
delay(500);
}