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

Déjà, tu utilises PI partout sauf dans cette ligne ou tu mets M_PI :
float headingDegrees = heading * 180.0/M_PI;Conserve PI ici aussi.

Ensuite, le programme fait ce que tu lui demandes :

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

// Calculate heading
  float heading = atan2(Y,X);

Les 2 arguments de atan2 peuvent varier entre -1 et 1 et quand tu fais un tour complet avec ton capteur, ces deux arguments devraient en effet passer par les valeurs -1 et 1, ce qui te donnerait des angles variant entre 0 et 360°.

Mais tu fais une compensation avant le atan2, donc il n'est plus sûr que les arguments varient dans cet intervalle. Si tu veux en savoir plus, il te faut afficher les valeurs de X et Y : remplace

Serial.print(" Degress = ");
    Serial.print(headingDegrees);
    Serial.println("--------");

par

    Serial.print(" X = ");
    Serial.print(X);
    Serial.print(" Y = ");
    Serial.print(Y);
    Serial.print(" Degrees = ");
    Serial.println(headingDegrees);

et regarde ce que ça donne sur la console.