First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5

main.cpp

Committer:
skyscraper
Date:
2020-03-24
Revision:
5:47026facc081
Parent:
4:53e468c49c17
Child:
6:cc08f2d64773

File content as of revision 5:47026facc081:


#include "mbed.h"
#include "hmc5883.h"
#include <quan/max.hpp>
#include <quan/min.hpp>
#include <quan/time.hpp>

void mag_adjusted_values(
    quan::time::ms const & update_rate, 
    quan::three_d::vect<quan::magnetic_flux_density::uT> const & offset
);
void mag_raw_values(quan::time::ms const & update_rate);
void mag_offset_calibrate();

namespace {
    
    QUAN_QUANTITY_LITERAL(magnetic_flux_density,gauss);
    QUAN_QUANTITY_LITERAL(magnetic_flux_density,milli_gauss);
    QUAN_QUANTITY_LITERAL(magnetic_flux_density,uT);
    QUAN_QUANTITY_LITERAL(time,ms);

    // terminal loop, printing message periodically
    void loop_forever(std::string const & str)
    {
        DigitalOut led2(LED2);
        // stop but print error dynamically
        int count = 0;
        for (;;) {
            led2 = 1;
            std::cout << str << " " << count++ << '\n';
            ThisThread::sleep_for(200U);
            led2 = 0;
            ThisThread::sleep_for(800U);
        }
    }
}// namespace

int main()
{
    std::cout << "HMC5883 test\n";
    //wait for mag to init
    ThisThread::sleep_for(500U);

    if ( mag_detected() ) {
        std::cout << "Detected a HMC5883\n";
    } else {
        loop_forever("Failed to detect HMC5883");
    }

    // N.b after offsets removed mag was reading around 34.49 uT, so not bad!
    constexpr auto earth_magnetic_field_flux_density = 31.869_uT;
    bool const success =
        mag_set_samples_average(8) &&
        mag_set_range( earth_magnetic_field_flux_density * 2U);
    if ( !success) {
        loop_forever("HMC5883 setup failed");
    }
    std::cout << " mag range set to " << mag_get_range() << '\n';
    
    // offsets from calib engine
    quan::three_d::vect<
        quan::magnetic_flux_density::uT
    > offsets{7.96466_uT,-8.10162_uT,1.50555_uT};
     
    mag_adjusted_values(20_ms,offsets);
   // mag_raw_values(20_ms);
   // mag_offset_calibrate();
    
}