<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://w.electrodragon.com/w/index.php?action=history&amp;feed=atom&amp;title=HMC5883L</id>
	<title>HMC5883L - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://w.electrodragon.com/w/index.php?action=history&amp;feed=atom&amp;title=HMC5883L"/>
	<link rel="alternate" type="text/html" href="https://w.electrodragon.com/w/index.php?title=HMC5883L&amp;action=history"/>
	<updated>2026-06-07T22:08:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://w.electrodragon.com/w/index.php?title=HMC5883L&amp;diff=29762&amp;oldid=prev</id>
		<title>Chao at 10:52, 19 February 2021</title>
		<link rel="alternate" type="text/html" href="https://w.electrodragon.com/w/index.php?title=HMC5883L&amp;diff=29762&amp;oldid=prev"/>
		<updated>2021-02-19T10:52:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Datasheet link: http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf&lt;br /&gt;
== Schematic ==&lt;br /&gt;
[[:File:HMC5883L.pdf|HMC5883L module schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dimension, schematic ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:HMC5883L_Three-Axis_Compass_Magneticfield_Module_dimension.jpg&lt;br /&gt;
File:HMC5883L_Three-Axis_Compass_Magneticfield_Module-SCH.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Demo code ==&lt;br /&gt;
* [[File:HMC5883L_-_arduino.zip|HMC5883L arduino.zip]]&lt;br /&gt;
* [[File:AVR_HMC5883L.zip]]&lt;br /&gt;
* [[File:STC51_HMC5883L-GY271.zip]]&lt;br /&gt;
=== Arduino demo code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot;&amp;gt;&lt;br /&gt;
#define HMC5883_WriteAddress 0x1E //  i.e 0x3C &amp;gt;&amp;gt; 1&lt;br /&gt;
#define HMC5883_ModeRegisterAddress 0x02&lt;br /&gt;
#define HMC5883_ContinuousModeCommand 0x00&lt;br /&gt;
#define HMC5883_DataOutputXMSBAddress  0x03&lt;br /&gt;
 &lt;br /&gt;
int regb=0x01;&lt;br /&gt;
int regbdata=0x40;&lt;br /&gt;
 &lt;br /&gt;
int outputData[6];&lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{  &lt;br /&gt;
    Serial.begin(9600);&lt;br /&gt;
    Wire.begin();       //Initiate the Wire library and join the I2C bus as a master&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
    int i,x,y,z;&lt;br /&gt;
    double angle;&lt;br /&gt;
 &lt;br /&gt;
    Wire.beginTransmission(HMC5883_WriteAddress);&lt;br /&gt;
    Wire.send(regb);&lt;br /&gt;
    Wire.send(regbdata);&lt;br /&gt;
    Wire.endTransmission();&lt;br /&gt;
 &lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Wire.beginTransmission(HMC5883_WriteAddress); //Initiate a transmission with HMC5883 (Write address).&lt;br /&gt;
    Wire.send(HMC5883_ModeRegisterAddress);       //Place the Mode Register Address in send-buffer.&lt;br /&gt;
    Wire.send(HMC5883_ContinuousModeCommand);     //Place the command for Continuous operation Mode in send-buffer.&lt;br /&gt;
    Wire.endTransmission();                       //Send the send-buffer to HMC5883 and end the I2C transmission.&lt;br /&gt;
    delay(100);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    Wire.beginTransmission(HMC5883_WriteAddress);  //Initiate a transmission with HMC5883 (Write address).&lt;br /&gt;
    Wire.requestFrom(HMC5883_WriteAddress,6);      //Request 6 bytes of data from the address specified.&lt;br /&gt;
 &lt;br /&gt;
    delay(500);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    //Read the value of magnetic components X,Y and Z&lt;br /&gt;
 &lt;br /&gt;
    if(6 &amp;lt;= Wire.available()) // If the number of bytes available for reading be &amp;lt;=6.&lt;br /&gt;
    {&lt;br /&gt;
        for(i=0;i&amp;lt;6;i++)&lt;br /&gt;
        {&lt;br /&gt;
            outputData=Wire.receive();  //Store the data in outputData buffer&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    x=outputData[0] &amp;lt;&amp;lt; 8 | outputData[1]; //Combine MSB and LSB of X Data output register&lt;br /&gt;
    z=outputData[2] &amp;lt;&amp;lt; 8 | outputData[3]; //Combine MSB and LSB of Z Data output register&lt;br /&gt;
    y=outputData[4] &amp;lt;&amp;lt; 8 | outputData[5]; //Combine MSB and LSB of Y Data output register&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
 &lt;br /&gt;
  Refer the following application note for heading calculation.&lt;br /&gt;
  http://www.ssec.honeywell.com/magnetic/datasheets/lowcost.pdf  &lt;br /&gt;
  ----------------------------------------------------------------------------------------&lt;br /&gt;
  atan2(y, x) is the angle in radians between the positive x-axis of a plane and the point&lt;br /&gt;
  given by the coordinates (x, y) on it. &lt;br /&gt;
  ----------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
  This sketch does not utilize the magnetic component Z as tilt compensation can not be done without an Accelerometer&lt;br /&gt;
 &lt;br /&gt;
  -----------------&amp;gt;y&lt;br /&gt;
  |&lt;br /&gt;
  |&lt;br /&gt;
  |&lt;br /&gt;
  |&lt;br /&gt;
  |&lt;br /&gt;
  |&lt;br /&gt;
 \/&lt;br /&gt;
  x &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     N &lt;br /&gt;
 NW  |  NE&lt;br /&gt;
     |  &lt;br /&gt;
W----------E&lt;br /&gt;
     |&lt;br /&gt;
 SW  |  SE&lt;br /&gt;
     S&lt;br /&gt;
 &lt;br /&gt;
 */ &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    //Print the approximate direction&lt;br /&gt;
 &lt;br /&gt;
    Serial.print(&amp;quot;You are heading &amp;quot;);&lt;br /&gt;
    if((angle &amp;lt; 22.5) || (angle &amp;gt; 337.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;South&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 22.5) &amp;amp;&amp;amp; (angle &amp;lt; 67.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;South-West&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 67.5) &amp;amp;&amp;amp; (angle &amp;lt; 112.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;West&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 112.5) &amp;amp;&amp;amp; (angle &amp;lt; 157.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;North-West&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 157.5) &amp;amp;&amp;amp; (angle &amp;lt; 202.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;North&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 202.5) &amp;amp;&amp;amp; (angle &amp;lt; 247.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;NorthEast&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 247.5) &amp;amp;&amp;amp; (angle &amp;lt; 292.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;East&amp;quot;);&lt;br /&gt;
    if((angle &amp;gt; 292.5) &amp;amp;&amp;amp; (angle &amp;lt; 337.5 ))&lt;br /&gt;
        Serial.print(&amp;quot;SouthEast&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    Serial.print(&amp;quot;: Angle between X-axis and the South direction &amp;quot;);&lt;br /&gt;
    if((0 &amp;lt; angle) &amp;amp;&amp;amp; (angle &amp;lt; 180) )&lt;br /&gt;
    {&lt;br /&gt;
        angle=angle;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        angle=360-angle;&lt;br /&gt;
    }&lt;br /&gt;
    Serial.print(angle,2);&lt;br /&gt;
    Serial.println(&amp;quot; Deg&amp;quot;);&lt;br /&gt;
    delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Demo Code with library V2 ==&lt;br /&gt;
=== Wiring ===&lt;br /&gt;
* Arduino GND -&amp;gt; HMC5883L GND&lt;br /&gt;
* Arduino 3.3V -&amp;gt; HMC5883L VCC&lt;br /&gt;
* Arduino A4 (SDA) -&amp;gt; HMC5883L SDA&lt;br /&gt;
* Arduino A5 (SCL) -&amp;gt; HMC5883L SCL&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
* get the library [[:File:HMC5883.zip|Here]] and put in your library folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simplied Arduino Code ===&lt;br /&gt;
* Use the example or demo code below, Open the Arduino serial monitor to see the results (X plane angle, Y plane angle, Z plane angle):&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:210631cqcqcocchk4pak94.jpg|thumbnail]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;HMC5883L.h&amp;gt; &lt;br /&gt;
HMC5883L compass; &lt;br /&gt;
void setup() &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Wire.begin(); &lt;br /&gt;
  compass = HMC5883L(); &lt;br /&gt;
  compass.SetScale(1.3); &lt;br /&gt;
  compass.SetMeasurementMode(Measurement_Continuous); &lt;br /&gt;
} &lt;br /&gt;
void loop() &lt;br /&gt;
{ &lt;br /&gt;
  MagnetometerRaw raw = compass.ReadRawAxis(); &lt;br /&gt;
  MagnetometerScaled scaled = compass.ReadScaledAxis(); &lt;br /&gt;
  float xHeading = atan2(scaled.YAxis, scaled.XAxis); &lt;br /&gt;
  float yHeading = atan2(scaled.ZAxis, scaled.XAxis); &lt;br /&gt;
  float zHeading = atan2(scaled.ZAxis, scaled.YAxis); &lt;br /&gt;
  if(xHeading &amp;lt; 0) xHeading += 2*PI; &lt;br /&gt;
  if(xHeading &amp;gt; 2*PI) xHeading -= 2*PI; &lt;br /&gt;
  if(yHeading &amp;lt; 0) yHeading += 2*PI; &lt;br /&gt;
  if(yHeading &amp;gt; 2*PI) yHeading -= 2*PI; &lt;br /&gt;
  if(zHeading &amp;lt; 0) zHeading += 2*PI; &lt;br /&gt;
  if(zHeading &amp;gt; 2*PI) zHeading -= 2*PI; &lt;br /&gt;
  float xDegrees = xHeading * 180/M_PI; &lt;br /&gt;
  float yDegrees = yHeading * 180/M_PI; &lt;br /&gt;
  float zDegrees = zHeading * 180/M_PI; &lt;br /&gt;
  Serial.print(xDegrees); &lt;br /&gt;
  Serial.print(&amp;quot;,&amp;quot;); &lt;br /&gt;
  Serial.print(yDegrees); &lt;br /&gt;
  Serial.print(&amp;quot;,&amp;quot;); &lt;br /&gt;
  Serial.print(zDegrees); &lt;br /&gt;
  Serial.println(&amp;quot;;&amp;quot;); &lt;br /&gt;
  delay(100); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datasheet ==&lt;br /&gt;
* [[:File: HMC5883L.pdf|HMC5883L datasheet]]&lt;br /&gt;
* [[:File:HMC5983_Datasheet.pdf HMC5983L Datasheet]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: HMC]]&lt;/div&gt;</summary>
		<author><name>Chao</name></author>
	</entry>
</feed>