MPU6050 Accel/Gyro erratic accel readings

I am using the Electronic Cats MPU6050 library to interface with an MPU6050 on an WiFi Kit V2 ESP32. The basic code reads data from the MPU6050 and then displays it on the OLED.

The library can be found here:

However the readings are very erratic. Even with the MPU taped to a table to give stability, the readings are erratic and occasionally read close to 2g without any movement at all.

Below is a test sketch that gets the acceleration data and displays it on the OLED.
I have also been using the IMU_Zero and MPU6050_DMP6 examples and the same issue occurs.

The basic sketch does not use an interrupt but some of these do. It doesn’t effect the problem

Any assistance is greatly appreciated
Thanks

#include “heltec.h”
#include “SSD1306Ascii.h”

#include “SSD1306AsciiWire.h”
#include “MPU6050_6Axis_MotionApps20.h”
#include “Wire.h”

SSD1306AsciiWire oled;

MPU6050 mpu;

bool dmpReady = false;
uint8_t devStatus;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t fifoBuffer[64];
float MaxGx = 0, MaxGy = 0, MaxGz = 0;

Quaternion q; // [w, x, y, z] quaternion container

void setup() {
Heltec.begin(true /DisplayEnable Enable/, false /LoRa Enable/, true /Serial Enable/);

oled.begin(&Adafruit128x64, 0x3C, 16);
oled.setFont(System5x7);
oled.clear();

Wire.begin(); //pin 21 and 22 for ESP32
Wire.setClock(400000);

Serial.begin(115200);

Serial.println(F(“Initializing I2C devices…”));
mpu.initialize();

Serial.println(F(“Testing device connections…”));
Serial.println(mpu.testConnection() ? F(“MPU6050 connection successful”) : F(“MPU6050 connection failed”));

Serial.println(F(“Initializing DMP…”));
oled.setCursor(0,0);
oled.println(“Calibrate Acc/Gyro”);
devStatus = mpu.dmpInitialize();

mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

if (devStatus == 0) {
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
mpu.PrintActiveOffsets();
Serial.println(F(“Enabling DMP…”));
oled.print(“Accel/Gyro Ready”);
delay(1000);
oled.clear();
mpu.setDMPEnabled(true);

Serial.println(F("DMP ready!"));
dmpReady = true;

packetSize = mpu.dmpGetFIFOPacketSize();

} else {
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it’s going to break, usually the code will be 1)
Serial.print(F(“DMP Initialization failed (code “));
Serial.print(devStatus);
Serial.println(F(”)”));
}

}

void loop() {
// if MPU6050nprogramming failed, don’t do anything
if (!dmpReady) return;

while (fifoCount < packetSize) {
if (fifoCount < packetSize) {
// try to get out of the infinite loop
fifoCount = mpu.getFIFOCount();
}
}

fifoCount = mpu.getFIFOCount();
if(fifoCount < packetSize){
}
else if (fifoCount >= 1024) {
// reset so we can continue cleanly
mpu.resetFIFO();
// fifoCount = mpu.getFIFOCount(); // will be zero after reset
Serial.println(F(“FIFO overflow!”));

}

while(fifoCount >= packetSize){
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
}

    mpu.dmpGetQuaternion(&q, fifoBuffer);

     if (abs(q.x) > abs(MaxGx))
      {
        MaxGx = q.x;
      } else{
        MaxGx = MaxGx;
      }

    if (abs(q.y) > abs(MaxGy))
      {
        MaxGy = q.y;
      } else{
        MaxGy = MaxGy;
      }

if (abs(q.z) > abs(MaxGz))
  {
    MaxGz = q.z;
   } else{
    MaxGz = MaxGz;
   }

  oled.setCursor(0,0);
  oled.clearToEOL();
  oled.println("ACCEL  X     Y     Z");
  oled.setCursor(0,1);
  oled.clearToEOL();
  oled.setCursor(20,1);
  oled.print(q.x,2);
  oled.setCursor(60,1);
  oled.print(q.y,2);
  oled.setCursor(95,1);
  oled.println(q.z,2);

  oled.setCursor(0,4);
  oled.println("MaxG   X     Y     Z");
  oled.setCursor(0,5);
  oled.clearToEOL();
  oled.setCursor(20,5);
  oled.print(MaxGx);
  oled.setCursor(60,5);
  oled.print(MaxGy);
  oled.setCursor(95,5);
  oled.println(MaxGz);

You can try to view the sensor data directly through the serial port, not through the OLED display.