[non réglé] programmation d'un magnétomètre mag3110 en boussole magnétique.

Bonjour,

Voici le code utilisé :

#include <SparkFun_MAG3110.h>

MAG3110 mag = MAG3110(); //Instantiate MAG3110

int minX = 0;
int maxX = 0;
int minY = 0;
int maxY = 0;
int minZ = 0;
int maxZ = 0;


void setup() {
  Serial.begin(9600);

  mag.initialize(); //Initializes the mag sensor
  mag.start();      //Puts the sensor in active mode
}

void loop() {

  int x, y, z;
  //Only read data when it's ready
  if(mag.dataReady()) {
    //Read the data
    mag.readMag(&x, &y, &z);
    
// First : calibrate captor   
// Determine min and max values
  if (x < minX) minX = x;
  if (x > maxX) maxX = x;
  if (y < minY) minY = y;
  if (y > maxY) maxY = y;

// calculate offsets
  int offX = (maxX + minX)/2;
  int offY = (maxY + minY)/2;

// determine magnetic compensation
  float avg_delta_x = (maxX-minX)/2.0;
  float avg_delta_y = (maxX-minX)/2.0;
  float avg_delta_z = (maxX-minX)/2.0;
  float avg_delta = (avg_delta_x + avg_delta_y + avg_delta_z)/3.0;
  float ech_x = avg_delta/avg_delta_x;
  float ech_y = avg_delta/avg_delta_y;



// After calibrate captor and know offsets and magnetic compensation values
// correct axes x and y. 
// Exemple : corrected_x = (sensor_x - offset_x)*scale_x

float X = (x-523.0)*1.0 ;
float Y = (y+190.0)*1.0 ;

// Calculate heading
  float heading = atan2(Y,X);
  
// Correct for heading < 0deg and heading > 360deg
  if (heading < 0)
  {
    heading += 2 * PI;
  }

  if (heading > 2 * PI)
  {
    heading -= 2 * PI;
  }

  // Convert to degrees
  float headingDegrees = heading * 180.0/M_PI; 

 
    /*Serial.print("X: ");
    Serial.print(x);
    Serial.print(", Y: ");
    Serial.print(y);
    Serial.print(", Z: ");
    Serial.println(z);
    
    Serial.print("offset x=");
    Serial.print(offX);
    Serial.print("offset y =");
    Serial.print(offY);
    Serial.print("echelle x =");
    Serial.print(ech_x);
    Serial.print("echelle y =");
    Serial.print(ech_y);
        
    */Serial.print(" Degress = ");
    Serial.print(headingDegrees);
    Serial.println("--------");
  }
}

En appliquant ce code, au lieu d'avoir un angle variant continuellement de 0 à 360° lorsque je fais tourner mon capteur; j'obtiens un angle qui va partir de 0°, croître jusque 41° et puis repartir vers 0°.. (voir PJ)

Sur la pièce jointe, on voit qu'au dessus de la ligne noire, l'angle croît. En dessous de cette ligne , il repart vers 0°...

Merci d'avance pour votre aide.