Valores diferentes on power up e depois de fazer reset manual - Arduino Nano

Venho procurar ajuda para uma situação estranha. Tenho um codigo instalado num Arduino Nano onde uso um display I2C e um MPU6050 para medir forças G. Quando faço o power up através do USB os valoresestão errados. Sensivelmente o dobro. Contudo se eu sem desligar a alimentação fizer um reset manual no botão, ele arranca e os valores ficam normais.

Alguma ideia?

A minha bola de cristal não funciona ao fim de semana... podes meter aqui o código para podermos dizer algo?

Obrigado aqui está o código.

Acho que o problema está na rapidez de arranque do arduino quando já está alimentado ou quando parte do zero.
Anexo duas fotos.

Tomando como referencia o eixo Z das fotos, se fizer apenas um reset no botão temos 1 G ( o que está correcto), porém se tirar a alimentação e voltar a iniciar fica com 4G ( o que está errado)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <MPU6050.h>

//#define SCREEN_WIDTH 128
//#define SCREEN_HEIGHT 64
#define OLED_RESET     4

Adafruit_SH1106 display(OLED_RESET);
MPU6050 mpu;


int dot_x;
int dot_y;
int dot_z;

float gx, gy, gz;
float ix = 0, iy = 0, iz = 0;
unsigned long tim = 0;
unsigned long tim_disp = 0;
void setup()
{

  Serial.begin(9600);
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  Serial.println(F("Initialize MPU6050"));
  while (!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_8G))
  {
    Serial.println(F("Could not find a valid MPU6050 sensor, check wiring!"));
    delay(500);
  }

  display.display();

  tim = millis();
  tim_disp = millis();

   

 Vector rawAccel = mpu.readRawAccel();
  ix = (float)rawAccel.XAxis  / 4096;
  iy = (float)rawAccel.YAxis  / 4096;
  iz = (float)rawAccel.ZAxis  / 4096;

  Serial.println(F("Initial g forces"));
  Serial.print(F("X:"));
  Serial.print(ix);
  Serial.print(F("\tY:"));
  Serial.print(iy);
  Serial.print(F("\tZ:"));
  Serial.println(iz);
}

void loop()
{
  if (millis() - tim > 150)
  {
    tim = millis();
    Vector rawAccel = mpu.readRawAccel();
   dot_x = round(rawAccel.XAxis / 4096 * 20 + 21);
   dot_y = round(rawAccel.YAxis / 4096 * 20 + 43);
   dot_z = round(rawAccel.ZAxis / 4096 * 20 - 20);

    gx = (float)rawAccel.XAxis  / 4096 ;
    gy = (float)rawAccel.YAxis  / 4096 ;
    gz = (float)rawAccel.ZAxis  / 4096 ;



    if(gx > ix) ix = gx;
    if(gy > iy) iy = gy;
    if(gz > iz) iz = gz;
    //    Serial.print(dot_x);
    //    Serial.print("\t");
    //    Serial.print(dot_y);
    //    Serial.print("\t");
    //    Serial.print(dot_z);
    Serial.print(F("\tG:"));
    Serial.print(gx);
    Serial.print(F("\t"));
    Serial.print(gy);
    Serial.print(F("\t"));
    Serial.println(gz);
  }

  if (millis() - tim_disp > 16)
  {
    display.clearDisplay();
    //display.display();
    draw_main_circle();
    draw_dot(dot_x, dot_y);
    print_acc_data(gx, gy, gz);
    display.display();
  }
}


void draw_main_circle()
{
  display.drawCircle(21, 43, 20, WHITE);
  display.drawFastVLine(21, 23, 40, WHITE);
  display.drawFastHLine(1, 43, 40, WHITE);
}

void draw_dot(int dt_x, int dt_y)
{
  if (dt_y > 63) dt_y = 63;
  else if (dt_y < 23) dt_y = 23;
  if (dt_x > 40) dt_x = 40;
  else if (dt_x < 1) dt_x = 1;
  display.fillCircle(dt_x, dt_y, 3 , WHITE);
  //display.fillCircle(dt_x, dt_y, 5 , WHITE); // ponto maior
}

void print_acc_data(float _x, float _y, float _z)
{
  char vtd[5] = "";
  display.setCursor(1, 4);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("G-Meter");
 
  display.setCursor(48, 4);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("ACT");

  display.setCursor(90, 4);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("MAX");

  //  display.setCursor(68, 18);
  //  display.setTextSize(1);
  //  display.setTextColor(WHITE);
  //  display.print("X " + String(_x));
  //
  //  display.setCursor(68, 32);
  //  display.setTextSize(1);
  //  display.setTextColor(WHITE);
  //  display.print("Y " + String(_y));
  //
  //  display.setCursor(68, 46);
  //  display.setTextSize(1);
  //  display.setTextColor(WHITE);
  //  display.print("Z " + String(_z));

  dtostrf(_x, 0, 1, vtd);
  display.setCursor(48, 18);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("X " + String(vtd));

  dtostrf(_y, 0, 1, vtd);
  display.setCursor(48, 32);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Y " + String(vtd));

  dtostrf(_z, 0, 1, vtd);
  display.setCursor(48, 46);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Z " + String(vtd));

  dtostrf(ix, 0, 1, vtd);
  display.setCursor(90, 18);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print(vtd);

  dtostrf(iy, 0, 1, vtd);
  display.setCursor(90, 32);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print(vtd);
 
  dtostrf(iz, 0, 1, vtd);
  display.setCursor(90, 46);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print(vtd);
}

E o valor volta ao normal? Ou fica sempre em 4? O que podes estar a acontecer é o sensor estar a iniciar e mandar um valor que ainda não é a aceleração que está a medir.

Fica sempre em 4. Se eu fizer um reset no switch do arduino então vai para 1 e fica lá até desligar a alimentação onde voltará a 4

E se iniciares o Arduino, fizeres reset para ver um 1 no eixo dos Z e virares a placa de lado de forma a que o eixo dos X ou Y esteja a apontar para o chão? O valor muda dum eixo para o outro?

O que pretendes com isto?

 if(gx > ix) ix = gx;
    if(gy > iy) iy = gy;
    if(gz > iz) iz = gz;

Já pensaste em tirar este código do setup()?

Vector rawAccel = mpu.readRawAccel();
  ix = (float)rawAccel.XAxis  / 4096;
  iy = (float)rawAccel.YAxis  / 4096;
  iz = (float)rawAccel.ZAxis  / 4096;