#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <RTClib.h>
#include <Adafruit_SSD1306.h>
// Initialize OLED display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Initialize MPU6050 (Accelerometer and Gyroscope)
Adafruit_MPU6050 mpu;
// Initialize RTC DS1307
RTC_DS1307 rtc;
// Threshold for motion detection (adjust as needed)
#define MOTION_THRESHOLD 0.01
void setup() {
// Initialize Serial Monitor
Serial.begin(9600);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED initialization failed!");
while (1);
}
Serial.println("OLED initialized!");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Initializing...");
display.display();
// Initialize MPU6050
if (!mpu.begin()) {
Serial.println("MPU6050 initialization failed!");
while (1);
}
Serial.println("MPU6050 initialized!");
// Initialize RTC DS1307
if (!rtc.begin()) {
Serial.println("RTC initialization failed!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is not running, setting time.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("RTC is running!");
}
void loop() {
// Read motion data from MPU6050
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Check if motion threshold is exceeded
//if (abs(a.acceleration.x) > MOTION_THRESHOLD || abs(a.acceleration.y) > MOTION_THRESHOLD || abs(a.acceleration.z) > MOTION_THRESHOLD) {
mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
mpu.setGyroRange(MPU6050_RANGE_2000_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_44_HZ);
// Get current time from RTC
DateTime now = rtc.now();
// Print data to Serial Monitor
Serial.print("Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print(", \nAcc X: ");
Serial.print(a.acceleration.x);
Serial.print(", \nAcc Y: ");
Serial.print(a.acceleration.y);
Serial.print(", \nAcc Z: ");
Serial.print(a.acceleration.z);
Serial.print(", \nGyro X: ");
Serial.print(g.gyro.x);
Serial.print(", \nGyro Y: ");
Serial.print(g.gyro.y);
Serial.print(", \nGyro Z: ");
Serial.println(g.gyro.z);
// Display data on OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("Time: ");
display.print(now.year(), DEC);
display.print('/');
display.print(now.month(), DEC);
display.print('/');
display.print(now.day(), DEC);
display.print(" ");
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
display.print(':');
display.println(now.second(), DEC);
display.print("Acc X: ");
display.println(a.acceleration.x);
display.print("Acc Y: ");
display.println(a.acceleration.y);
display.print("Acc Z: ");
display.println(a.acceleration.z);
display.display();
delay(1000); // Wait a bit before checking again
}