Problems with HMC5883L Module

I recently bought the HMC5883L module for a project, it just shows a dummy output.
I'm using an Arduino UNO R3 and the connections are as follows:

  1. SDA - A4 pin
  2. SCL - A5 pin
  3. GND - GND
  4. VCC - 5V

I tried everything to get it working but it prints the heading degrees as 237.61 constantly, I'm using the Example (magsensor) of Adafruit HMC5883 Unified's library.
Here's the code:

/***************************************************************************
  This is a library example for the HMC5883 magnentometer/compass

  Designed specifically to work with the Adafruit HMC5883 Breakout
  http://www.adafruit.com/products/1746
 
  *** You will also need to install the Adafruit_Sensor library! ***

  These displays use I2C to communicate, 2 pins are required to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Kevin Townsend for Adafruit Industries with some heading example from
  Love Electronics (loveelectronics.co.uk)
 
 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
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 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 <http://www.gnu.org/licenses/>.

 ***************************************************************************/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

void displaySensorDetails(void)
{
  sensor_t sensor;
  mag.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" uT");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" uT");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" uT");  
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
}

void setup(void) 
{
  Serial.begin(9600);
  Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
  
  /* Initialise the sensor */
  if(!mag.begin())
  {
    /* There was a problem detecting the HMC5883 ... check your connections */
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while(1);
  }
  
  /* Display some basic information on this sensor */
  displaySensorDetails();
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event; 
  mag.getEvent(&event);
 
  /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print("  ");
  Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print("  ");
  Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print("  ");Serial.println("uT");

  // Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
  // Calculate heading when the magnetometer is level, then correct for signs of axis.
  float heading = atan2(event.magnetic.y, event.magnetic.x);
  
  // 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: http://www.magnetic-declination.com/
  // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
  // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  float declinationAngle = 0.22;
  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; 
  
  Serial.print("Heading (degrees): "); Serial.println(headingDegrees);
  
  delay(500);

And here's an example of the output:

Heading (degrees): 237.61

X: -0.09 Y: -0.09 Z: -0.10 uT

Heading (degrees): 237.61

X: -0.09 Y: -0.09 Z: -0.10 uT

Heading (degrees): 237.61

X: -0.09 Y: -0.09 Z: -0.10 uT

Heading (degrees): 237.61

Please explain what I'm doing wrong.

Thank you,
Helio Phoebus

The HMC5883L was discontinued years ago.

You might have the QMC5883 imitation instead, which requires a different library.

In any case, magnetometers don't work "out of the box" as compasses, and must be calibrated before use. Overview and tutorial here: Tutorial: How to calibrate a compass (and accelerometer) with Arduino | Underwater Arduino Data Loggers

I tried but moving the sensor around doesn't make any difference in the reading.
I am constantly receiving 237.61 as the heading degrees.
I can't calibrate it if I can't get different readings.

Here's what the module looks like:

The photo doesn't show anything useful. Perhaps the module is defective.

There are much better choices, available from distributors like Adafruit, Pololu and Sparkfun, who also support their products.

Thank you so much for your reply

mebro
Just read your post regarding the lack of response from your "HMC5883L",
I have exactly the same problem , using the Adafruit library.I have also used a sketch from
Protoeshea LLC with the same result.I ran I2C Scanner which indicated a ID of 0x0D for my module, which if it was a genuine Honeywell product should have been 0x1E. In spite of this I have not been able to get any correct data out.
jremmingtons reply seems to be the best solution.
mebro.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.