// MPU6050 example
// https://wokwi.com/arduino/projects/305937248748044864
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
float accelerationX, accelerationY, accelerationZ;
float velocityX = 0, velocityY = 0, velocityZ = 0;
float accelerationAvgX = 0, accelerationAvgY = 0, accelerationAvgZ = 0;
float positionX = 0, positionY = 0, positionZ = 0;
int sampleCount = 0;
float totalVelocityX = 0, totalVelocityY = 0, totalVelocityZ = 0;
float totalAccelerationX = 0, totalAccelerationY = 0, totalAccelerationZ = 0;
float totalTime = 0;
Adafruit_MPU6050 mpu;
void setup(void) {
  Serial.begin(115200);
  while (!mpu.begin()) {
    Serial.println("MPU6050 not connected!");
    delay(1000);
  }
  Serial.println("MPU6050 ready!");
  mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
}
sensors_event_t event;
void loop() {
  mpu.getAccelerometerSensor()->getEvent(&event);
  /*Serial.print("[");
    Serial.print(millis());
    Serial.print("] X: ");
    Serial.print(event.acceleration.x);
    Serial.print(", Y: ");
    Serial.print(event.acceleration.y);
    Serial.print(", Z: ");
    Serial.print(event.acceleration.z);
    Serial.println(" m/s^2");
    delay(500);*/
  accelerationX = event.acceleration.x;
  accelerationY = event.acceleration.y;
  accelerationZ = event.acceleration.z;
  // Calculate velocity
  velocityX += accelerationX * 0.01;  // assuming 100Hz update rate (0.01s interval)
  velocityY += accelerationY * 0.01;
  velocityZ += accelerationZ * 0.01;
  // Calculate acceleration average
  totalAccelerationX += accelerationX;
  totalAccelerationY += accelerationY;
  totalAccelerationZ += accelerationZ;
  // Calculate position
  positionX += velocityX * 0.01;
  positionY += velocityY * 0.01;
  positionZ += velocityZ * 0.01;
  sampleCount++;
  totalTime += 0.01;
  // Check if 10 seconds have passed
  if (sampleCount == 100) {
    // Calculate average velocity
    float averageVelocityX = totalVelocityX / sampleCount;
    float averageVelocityY = totalVelocityY / sampleCount;
    float averageVelocityZ = totalVelocityZ / sampleCount;
    // Calculate average acceleration
    accelerationAvgX = totalAccelerationX / sampleCount;
    accelerationAvgY = totalAccelerationY / sampleCount;
    accelerationAvgZ = totalAccelerationZ / sampleCount;
    // Calculate average position
    float averagePositionX = positionX / totalTime;
    float averagePositionY = positionY / totalTime;
    float averagePositionZ = positionZ / totalTime;
    Serial.print(" X: ");
    Serial.print(event.acceleration.x);
    Serial.print(", Y: ");
    Serial.print(event.acceleration.y);
    Serial.print(", Z: ");
    Serial.print(event.acceleration.z);
    Serial.println(" m/s^2");
    // Print average velocity, acceleration, and position
    Serial.print("Average Velocity (X,Y,Z): ");
    Serial.print(averageVelocityX);
    Serial.print(", ");
    Serial.print(averageVelocityY);
    Serial.print(", ");
    Serial.println(averageVelocityZ);
    Serial.print("Average Acceleration (X,Y,Z): ");
    Serial.print(accelerationAvgX);
    Serial.print(", ");
    Serial.print(accelerationAvgY);
    Serial.print(", ");
    Serial.println(accelerationAvgZ);
    Serial.print("Average Position (X,Y,Z): ");
    Serial.print(averagePositionX);
    Serial.print(", ");
    Serial.print(averagePositionY);
    Serial.print(", ");
    Serial.println(averagePositionZ);
    // Reset variables for the next 10 seconds
    sampleCount = 0;
    totalVelocityX = 0;
    totalVelocityY = 0;
    totalVelocityZ = 0;
    totalAccelerationX = 0;
    totalAccelerationY = 0;
    totalAccelerationZ = 0;
    positionX = 0;
    positionY = 0;
    positionZ = 0;
    totalTime = 0;
  } else {
    // Accumulate velocity and acceleration for average calculation
    totalVelocityX += velocityX;
    totalVelocityY += velocityY;
    totalVelocityZ += velocityZ;
    totalAccelerationX += accelerationX;
    totalAccelerationY += accelerationY;
    totalAccelerationZ += accelerationZ;
  }
  delay(10); // 10ms delay between samples (100Hz update rate)
}