Strange HMC5883 Magnetometer Output

Hello, I got a strange output from a HMC5883L Magnetometer Module,and i dont know how to get usefull data. The following schema repeats all the time Is this normal or is the module defective? I tested it with 3V on two modules from China, and got the same Result every time.

Here is the image:

Post your code, using code tags, and a wiring diagram.

Thank you very much

HMC5883L_Example.pde - Example sketch for integration with an HMC5883L triple axis magnetomerwe.

This program is free software: you can redistribute it and/or modify
it under the terms of the version 3 GNU General Public License as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <>.


// Reference the I2C Library
#include <Wire.h>
// Reference the HMC5883L Compass Library
#include <HMC5883L.h>

// Store our compass as a variable.
HMC5883L compass;
// Record any errors that may occur in the compass.
int error = 0;

// Out setup routine, here we will configure the microcontroller and compass.
void setup()
  // Initialize the serial port.

  Serial.println("Starting the I2C interface.");
  Wire.begin(); // Start the I2C interface.

  Serial.println("Constructing new HMC5883L");
  compass = HMC5883L(); // Construct a new HMC5883 compass.
  Serial.println("Setting scale to +/- 1.3 Ga");
  error = compass.SetScale(1.3); // Set the scale of the compass.
  if(error != 0) // If there is an error, print it out.
  Serial.println("Setting measurement mode to continous.");
  error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
  if(error != 0) // If there is an error, print it out.

// Our main program loop.
void loop()
  // Retrive the raw values from the compass (not scaled).
  MagnetometerRaw raw = compass.ReadRawAxis();
  // Retrived the scaled values from the compass (scaled to the configured scale).
  MagnetometerScaled scaled = compass.ReadScaledAxis();
  // Values are accessed like so:
  int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)

  // Calculate heading when the magnetometer is level, then correct for signs of axis.
  float heading = atan2(scaled.YAxis, scaled.XAxis);
  // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.
  // Find yours here:
  // Mine is: 2� 37' W, which is 2.617 Degrees, or (which we need) 0.0456752665 radians, I will use 0.0457
  // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  float declinationAngle = 0.0457;
  heading += declinationAngle;
  // Correct for when signs are reversed.
  if(heading < 0)
    heading += 2*PI;
  // Check for wrap due to addition of declination.
  if(heading > 2*PI)
    heading -= 2*PI;
  // Convert radians to degrees for readability.
  float headingDegrees = heading * 180/M_PI; 

  // Output the data via the serial port.
  Output(raw, scaled, heading, headingDegrees);

  // Normally we would delay the application by 66ms to allow the loop
  // to run at 15Hz (default bandwidth for the HMC5883L).
  // However since we have a long serial out (104ms at 9600) we will let
  // it run at its natural speed.

// Output the data down the serial port.
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
   Serial.print("   ");   
   Serial.print("   ");   
   Serial.print("   \tScaled:\t");
  /* Serial.print("   ");   
   Serial.print("   ");   

   /*Serial.print("   \tHeading:\t");
   Serial.print(" Radians   \t");
   Serial.println(" Degrees   \t");*/

The wiring: An Arduino Uno, Vcc to 3v, now I allso tried it with 5v, SDA to SDA, SCL to SCL, GND to GND

The HMC5883 is a 3V device. Unless your module has a built in voltage regulator, it was probably damaged by connection to 5V.

Generally it is best to use 3V Arduino boards with 3V sensors, or good level shifters for I/O.

It seems, that it has a regulator, and before I used It with 3v before, i did not use it with 5v. Thats obviously the plan, but I asked myself, if it could be a problem with to low voltage.

Post a link to the module.

Your wiring diagram shows the module connected to 5V. If that is NOT your wiring diagram, why did you post it? Do you expect helpful answers, proceeding in this way?

The blog did not display images which i uploaded to , so I took an Image that was already online ;) sorry for that

There is no useful information on the eBay page.

If you insist on buying completely undocumented modules, good luck with your projects!

Here is the schematic: