SparkFun Forums 

Where electronics enthusiasts find answers.

For the discussion of Arduino related topics.
By gugu_1610
#194716
Hi, I am completely new to Arduino and am trying to build a swimming lap counter using a magnetic compass (Hmc5883l). The logic I am thinking of is every time there is a 180-degree change in direction the lap count will go up.

So far I have tried putting some code together, but I haven't been successful in getting the count to go up. If anyone has any suggestions I would be very appreciative for you help, thanks.

Below is the code that I have so far.


/***************************************************************************
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);
int contLaps;
float degreesAux;

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("");
contLaps = 0;
degreesAux = 0;

/* 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;
if (degreesAux == 1000) {
degreesAux = headingDegrees;
}
else {
if (headingDegrees != degreesAux) {
if (((headingDegrees - degreesAux) < 45) || ((headingDegrees - degreesAux) > -45)) {
degreesAux = headingDegrees;
Serial.println("enter1");
Serial.println(headingDegrees - degreesAux);
}
else {
Serial.println("enter2");
degreesAux = headingDegrees;
contLaps++;
}
}
}

Serial.print("Heading (degrees): ");
Serial.println(headingDegrees);
//Serial.print("Laps");
//Serial.println(contLaps);



delay(50);