{"id":59,"date":"2014-12-11T10:21:25","date_gmt":"2014-12-11T09:21:25","guid":{"rendered":"https:\/\/pa3csg.nl\/?page_id=59"},"modified":"2016-06-24T07:21:22","modified_gmt":"2016-06-24T05:21:22","slug":"electronic-compass-arduino","status":"publish","type":"page","link":"https:\/\/pa3csg.nl\/?page_id=59","title":{"rendered":"Electronic Compass Arduino"},"content":{"rendered":"<p>Electronic Compass with the HMC5883<\/p>\n<p>My friend Jac is active on 10 &amp; 24 GHz portable. To aim his 90cm offset dish which is mounted 90 degrees tilted, the idea was born to use an electronic compass. This needs no calibration and should have an accuracy of around 2 degrees. The HMC5883 is easily found on ebay for very little money. It was Jac&#8217;s idea to have 2 buttons to calibrate his dish and to compensat for his 31 degrees of off-set because of his mounting. The code for the compass was found as opensource on the web. A few additions and an LCD were added. It required a bit of simple coding.<\/p>\n<p>You have to make sure that the electronic compass is mounted levelled with the earth and that you donnot rotate it too quick. Keep it away from magnetic materials.<\/p>\n<p>The code can be found below. Make sure you have the libraries in the correct place. These can be found on the Adafruit website! Check:<\/p>\n<p><a href=\"https:\/\/learn.adafruit.com\/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor\/wiring-and-test\" target=\"_blank\">https:\/\/learn.adafruit.com\/adafruit-hmc5883l-breakout-triple-axis-magnetometer-compass-sensor\/wiring-and-test<\/a><\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush:xml\">\/<\/pre>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"xml plain\">\/***************************************************************************<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">This is a library example for the HMC5883 magnentometer\/compass<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Designed specifically to work with the Adafruit HMC5883 Breakout<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">http:\/\/www.adafruit.com\/products\/1746<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">*** You will also need to install the Adafruit_Sensor library! ***<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">These displays use I2C to communicate, 2 pins are required to interface.<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Adafruit invests time and resources providing this open source code,<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">please support Adafruit andopen-source hardware by purchasing products<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">from Adafruit!<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Written by Kevin Townsend for Adafruit Industries with some heading example from<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Love Electronics (loveelectronics.co.uk)<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">This program is free software: you can redistribute it and\/or modify<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">it under the terms of the version 3 GNU General Public License as<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">published by the Free Software Foundation.<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">This program is distributed in the hope that it will be useful,<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">but WITHOUT ANY WARRANTY; without even the implied warranty of<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\u00a0 See the<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">GNU General Public License for more details.<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">You should have received a copy of the GNU General Public License<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">along with this program.\u00a0 If not, see &lt;<\/code><code class=\"xml keyword\">http:<\/code><code class=\"xml plain\">\/\/www.gnu.org\/licenses\/&gt;.<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">***************************************************************************\/<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"xml plain\">#include &lt;<\/code><code class=\"xml keyword\">Wire.h<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"xml plain\">#include &lt;<\/code><code class=\"xml keyword\">Adafruit_Sensor.h<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"xml plain\">#include &lt;<\/code><code class=\"xml keyword\">Adafruit_HMC5883_U.h<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"xml plain\">#include &lt;<\/code><code class=\"xml keyword\">LiquidCrystal.h<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"xml plain\">#include &lt;<\/code><code class=\"xml keyword\">EEPROM.h<\/code><code class=\"xml plain\">&gt;<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><\/div>\n<div class=\"line number38 index37 alt1\"><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"xml plain\">\/\/ initialize the library with the numbers of the interface pins<\/code><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"xml plain\">LiquidCrystal lcd(12, 11, 5, 4, 3, 2);<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"xml plain\">int corr = 31;<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"xml plain\">int corraz = 0;<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"xml plain\">int incrementState = 0; \/\/will read increment<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"xml plain\">int lastIncrementState = 0;<\/code><\/div>\n<div class=\"line number46 index45 alt1\"><code class=\"xml plain\">int decrementState = 0; \/\/will read decrement<\/code><\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"xml plain\">int lastdecrementState = 0;<\/code><\/div>\n<div class=\"line number48 index47 alt1\"><\/div>\n<div class=\"line number49 index48 alt2\"><\/div>\n<div class=\"line number50 index49 alt1\"><code class=\"xml plain\">byte incrementButton = 6; \/\/ the pin that the pushbutton is attached to<\/code><\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"xml plain\">byte decrementButton = 7; \/\/ the pin that the pushbutton is attached to<\/code><\/div>\n<div class=\"line number52 index51 alt1\"><\/div>\n<div class=\"line number53 index52 alt2\"><code class=\"xml plain\">\/* Assign a unique ID to this sensor at the same time *\/<\/code><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"xml plain\">Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><\/div>\n<div class=\"line number56 index55 alt1\"><code class=\"xml plain\">void displaySensorDetails(void)<\/code><\/div>\n<div class=\"line number57 index56 alt2\"><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number58 index57 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">sensor_t sensor;<\/code><\/div>\n<div class=\"line number59 index58 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">mag.getSensor(&amp;sensor);<\/code><\/div>\n<div class=\"line number60 index59 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.println(\"------------------------------------\");<\/code><\/div>\n<div class=\"line number61 index60 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Sensor:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"); Serial.println(sensor.name);<\/code><\/div>\n<div class=\"line number62 index61 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Driver Ver:\u00a0\u00a0 \"); Serial.println(sensor.version);<\/code><\/div>\n<div class=\"line number63 index62 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Unique ID:\u00a0\u00a0\u00a0 \"); Serial.println(sensor.sensor_id);<\/code><\/div>\n<div class=\"line number64 index63 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Max Value:\u00a0\u00a0\u00a0 \"); Serial.print(sensor.max_value); Serial.println(\" uT\");<\/code><\/div>\n<div class=\"line number65 index64 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Min Value:\u00a0\u00a0\u00a0 \"); Serial.print(sensor.min_value); Serial.println(\" uT\");<\/code><\/div>\n<div class=\"line number66 index65 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print\u00a0 (\"Resolution:\u00a0\u00a0 \"); Serial.print(sensor.resolution); Serial.println(\" uT\");\u00a0 <\/code><\/div>\n<div class=\"line number67 index66 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.println(\"------------------------------------\");<\/code><\/div>\n<div class=\"line number68 index67 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.println(\"\");<\/code><\/div>\n<div class=\"line number69 index68 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">delay(500);<\/code><\/div>\n<div class=\"line number70 index69 alt1\"><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number71 index70 alt2\"><\/div>\n<div class=\"line number72 index71 alt1\"><code class=\"xml plain\">void setup(void) <\/code><\/div>\n<div class=\"line number73 index72 alt2\"><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number74 index73 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ set up the LCD's number of columns and rows:<\/code><\/div>\n<div class=\"line number75 index74 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.begin(20, 2);<\/code><\/div>\n<div class=\"line number76 index75 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number77 index76 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ A little bit of PR<\/code><\/div>\n<div class=\"line number78 index77 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(7,0);<\/code><\/div>\n<div class=\"line number79 index78 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"PE1KXH\");<\/code><\/div>\n<div class=\"line number80 index79 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(4,1);<\/code><\/div>\n<div class=\"line number81 index80 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"Kloat get aan!\");<\/code><\/div>\n<div class=\"line number82 index81 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">delay(1000);<\/code><\/div>\n<div class=\"line number83 index82 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.clear();<\/code><\/div>\n<div class=\"line number84 index83 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number85 index84 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number86 index85 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.begin(9600);<\/code><\/div>\n<div class=\"line number87 index86 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.println(\"HMC5883 Magnetometer Test\"); Serial.println(\"\");<\/code><\/div>\n<div class=\"line number88 index87 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number89 index88 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/* Initialise the sensor *\/<\/code><\/div>\n<div class=\"line number90 index89 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">if(!mag.begin())<\/code><\/div>\n<div class=\"line number91 index90 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number92 index91 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">\/* There was a problem detecting the HMC5883 ... check your connections *\/<\/code><\/div>\n<div class=\"line number93 index92 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.println(\"Ooops, no HMC5883 detected ... Check your wiring!\");<\/code><\/div>\n<div class=\"line number94 index93 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">while(1);<\/code><\/div>\n<div class=\"line number95 index94 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number96 index95 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number97 index96 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number98 index97 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number99 index98 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number100 index99 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/* Display some basic information on this sensor *\/<\/code><\/div>\n<div class=\"line number101 index100 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">displaySensorDetails();<\/code><\/div>\n<div class=\"line number102 index101 alt1\"><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number103 index102 alt2\"><\/div>\n<div class=\"line number104 index103 alt1\"><\/div>\n<div class=\"line number105 index104 alt2\"><code class=\"xml plain\">void loop(void) <\/code><\/div>\n<div class=\"line number106 index105 alt1\"><\/div>\n<div class=\"line number107 index106 alt2\"><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number108 index107 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number109 index108 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number110 index109 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number111 index110 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number112 index111 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/* Get a new sensor event *\/ <\/code><\/div>\n<div class=\"line number113 index112 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">sensors_event_t event; <\/code><\/div>\n<div class=\"line number114 index113 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">mag.getEvent(&amp;event);<\/code><\/div>\n<div class=\"line number115 index114 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number116 index115 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/* Display the results (magnetic vector values are in micro-Tesla (uT)) *\/<\/code><\/div>\n<div class=\"line number117 index116 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"X: \"); Serial.print(event.magnetic.x); Serial.print(\"\u00a0 \");<\/code><\/div>\n<div class=\"line number118 index117 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"Y: \"); Serial.print(event.magnetic.y); Serial.print(\"\u00a0 \");<\/code><\/div>\n<div class=\"line number119 index118 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"Z: \"); Serial.print(event.magnetic.z); Serial.print(\"\u00a0 \");Serial.println(\"uT\");<\/code><\/div>\n<div class=\"line number120 index119 alt1\"><\/div>\n<div class=\"line number121 index120 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Hold the module so that Z is pointing 'up' and you can measure the heading with x&amp;y<\/code><\/div>\n<div class=\"line number122 index121 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Calculate heading when the magnetometer is level, then correct for signs of axis.<\/code><\/div>\n<div class=\"line number123 index122 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">float heading = atan2(event.magnetic.y, event.magnetic.x);<\/code><\/div>\n<div class=\"line number124 index123 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number125 index124 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.<\/code><\/div>\n<div class=\"line number126 index125 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Find yours here: http:\/\/www.magnetic-declination.com\/<\/code><\/div>\n<div class=\"line number127 index126 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians<\/code><\/div>\n<div class=\"line number128 index127 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ If you cannot find your Declination, comment out these two lines, your compass will be slightly off.<\/code><\/div>\n<div class=\"line number129 index128 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">float declinationAngle = 0.017453292519943; \/\/value for JO21wd abt 1 degree in radians<\/code><\/div>\n<div class=\"line number130 index129 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">heading += declinationAngle;<\/code><\/div>\n<div class=\"line number131 index130 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number132 index131 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Correct for when signs are reversed.<\/code><\/div>\n<div class=\"line number133 index132 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">if(heading &lt; <\/code><code class=\"xml keyword\">0<\/code><code class=\"xml plain\">)<\/code><\/div>\n<div class=\"line number134 index133 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">heading += 2*PI;<\/code><\/div>\n<div class=\"line number135 index134 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number136 index135 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Check for wrap due to addition of declination.<\/code><\/div>\n<div class=\"line number137 index136 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">if(heading &gt; 2*PI)<\/code><\/div>\n<div class=\"line number138 index137 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">heading -= 2*PI;<\/code><\/div>\n<div class=\"line number139 index138 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number140 index139 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/ Convert radians to degrees for readability.<\/code><\/div>\n<div class=\"line number141 index140 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">float headingDegrees = heading * 180\/M_PI; <\/code><\/div>\n<div class=\"line number142 index141 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number143 index142 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number144 index143 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number145 index144 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/Reading and counting the UP button<\/code><\/div>\n<div class=\"line number146 index145 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number147 index146 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">incrementState = digitalRead(incrementButton); \/\/read the increment button state<\/code><\/div>\n<div class=\"line number148 index147 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">if(incrementState != lastIncrementState) \/\/compare increment button state to its last state<\/code><\/div>\n<div class=\"line number149 index148 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number150 index149 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">if(incrementState == LOW)\/\/increment button is pressed<\/code><\/div>\n<div class=\"line number151 index150 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number152 index151 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">corr = corr + 1; \/\/increment the corr value<\/code><\/div>\n<div class=\"line number153 index152 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">delay(10); \/\/debounce delay<\/code><\/div>\n<div class=\"line number154 index153 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number155 index154 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number156 index155 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">lastIncrementState = incrementState;<\/code><\/div>\n<div class=\"line number157 index156 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number158 index157 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">\/\/Reading and counting the DOWN button<\/code><\/div>\n<div class=\"line number159 index158 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number160 index159 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">decrementState = digitalRead(decrementButton); \/\/read the increment button state<\/code><\/div>\n<div class=\"line number161 index160 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">if(decrementState != lastdecrementState) \/\/compare increment button state to its last state<\/code><\/div>\n<div class=\"line number162 index161 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number163 index162 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">if(decrementState == LOW)\/\/increment button is pressed<\/code><\/div>\n<div class=\"line number164 index163 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">{<\/code><\/div>\n<div class=\"line number165 index164 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">corr = corr - 1; \/\/increment the corr value<\/code><\/div>\n<div class=\"line number166 index165 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">delay(10); \/\/debounce delay<\/code><\/div>\n<div class=\"line number167 index166 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number168 index167 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">}<\/code><\/div>\n<div class=\"line number169 index168 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">lastdecrementState = decrementState;<\/code><\/div>\n<div class=\"line number170 index169 alt1\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0<\/code><\/div>\n<div class=\"line number171 index170 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">corraz = headingDegrees - corr;<\/code><\/div>\n<div class=\"line number172 index171 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">if(corraz &lt; 0)<\/code><\/div>\n<div class=\"line number173 index172 alt2\"><code class=\"xml spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"xml plain\">corraz = (corraz + 360);<\/code><\/div>\n<div class=\"line number174 index173 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number175 index174 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"Heading (degrees): \"); Serial.println(headingDegrees);<\/code><\/div>\n<div class=\"line number176 index175 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"Correction (degrees): \"); Serial.println(corr);<\/code><\/div>\n<div class=\"line number177 index176 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">Serial.print(\"Corrected Azimuth): \"); Serial.println(corraz);<\/code><\/div>\n<div class=\"line number178 index177 alt1\"><\/div>\n<div class=\"line number179 index178 alt2\"><code class=\"xml plain\">\/\/first line<\/code><\/div>\n<div class=\"line number180 index179 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(9,0);<\/code><\/div>\n<div class=\"line number181 index180 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(0,0);<\/code><\/div>\n<div class=\"line number182 index181 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"Azimuth: \");<\/code><\/div>\n<div class=\"line number183 index182 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(9,0);<\/code><\/div>\n<div class=\"line number184 index183 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"\u00a0\u00a0 \");<\/code><\/div>\n<div class=\"line number185 index184 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(9,0);<\/code><\/div>\n<div class=\"line number186 index185 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(headingDegrees, 0);<\/code><\/div>\n<div class=\"line number187 index186 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(14,0);<\/code><\/div>\n<div class=\"line number188 index187 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"Cor:\");<\/code><\/div>\n<div class=\"line number189 index188 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(18,0);<\/code><\/div>\n<div class=\"line number190 index189 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(\"\u00a0 \");<\/code><\/div>\n<div class=\"line number191 index190 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(18,0);<\/code><\/div>\n<div class=\"line number192 index191 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">lcd.print(corr);<\/code><\/div>\n<div class=\"line number193 index192 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number194 index193 alt1\"><code class=\"xml plain\">\/\/second line<\/code><\/div>\n<div class=\"line number195 index194 alt2\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number196 index195 alt1\"><code class=\"xml spaces\">\u00a0<\/code><\/div>\n<div class=\"line number197 index196 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(0,1);<\/code><\/div>\n<div class=\"line number198 index197 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.print(\"Calc Az: \");<\/code><\/div>\n<div class=\"line number199 index198 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(9,1);<\/code><\/div>\n<div class=\"line number200 index199 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.print(\"\u00a0\u00a0 \");<\/code><\/div>\n<div class=\"line number201 index200 alt2\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.setCursor(9,1);<\/code><\/div>\n<div class=\"line number202 index201 alt1\"><code class=\"xml spaces\">\u00a0<\/code><code class=\"xml plain\">lcd.print(corraz);<\/code><\/div>\n<div class=\"line number203 index202 alt2\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><\/div>\n<div class=\"line number204 index203 alt1\"><code class=\"xml spaces\">\u00a0\u00a0<\/code><code class=\"xml plain\">delay(500);<\/code><\/div>\n<div class=\"line number205 index204 alt2\"><code class=\"xml plain\">}<\/code><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Electronic Compass with the HMC5883 My friend Jac is active on 10 &amp; 24 GHz portable. To aim his 90cm offset dish which is mounted <a class=\"mh-excerpt-more\" href=\"https:\/\/pa3csg.nl\/?page_id=59\" title=\"Electronic Compass Arduino\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":928,"parent":0,"menu_order":14,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"categories":[29],"tags":[],"_links":{"self":[{"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/pages\/59"}],"collection":[{"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=59"}],"version-history":[{"count":2,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/pages\/59\/revisions"}],"predecessor-version":[{"id":920,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/pages\/59\/revisions\/920"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=\/wp\/v2\/media\/928"}],"wp:attachment":[{"href":"https:\/\/pa3csg.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=59"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=59"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pa3csg.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=59"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}