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

Committer:
skyscraper
Date:
Tue Mar 24 22:43:44 2020 +0000
Revision:
3:2834be4e10ef
Parent:
2:9ffb2f18756b
Child:
4:53e468c49c17
Moved calibrate function out to separate source file.; Added raw values function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skyscraper 0:37dbfb036586 1
skyscraper 0:37dbfb036586 2 #include "mbed.h"
skyscraper 2:9ffb2f18756b 3 #include "hmc5883.h"
skyscraper 0:37dbfb036586 4 #include <quan/max.hpp>
skyscraper 0:37dbfb036586 5 #include <quan/min.hpp>
skyscraper 3:2834be4e10ef 6 #include <quan/time.hpp>
skyscraper 3:2834be4e10ef 7
skyscraper 3:2834be4e10ef 8 void mag_raw_values(quan::time::ms const & update_rate);
skyscraper 3:2834be4e10ef 9 void mag_offset_calibrate();
skyscraper 0:37dbfb036586 10
skyscraper 2:9ffb2f18756b 11 namespace {
skyscraper 2:9ffb2f18756b 12
skyscraper 2:9ffb2f18756b 13 QUAN_QUANTITY_LITERAL(magnetic_flux_density,gauss);
skyscraper 2:9ffb2f18756b 14 QUAN_QUANTITY_LITERAL(magnetic_flux_density,milli_gauss);
skyscraper 2:9ffb2f18756b 15 QUAN_QUANTITY_LITERAL(magnetic_flux_density,uT);
skyscraper 3:2834be4e10ef 16 QUAN_QUANTITY_LITERAL(time,ms);
skyscraper 0:37dbfb036586 17
skyscraper 2:9ffb2f18756b 18 // terminal loop, printing message periodically
skyscraper 2:9ffb2f18756b 19 void loop_forever(std::string const & str)
skyscraper 2:9ffb2f18756b 20 {
skyscraper 3:2834be4e10ef 21 DigitalOut led2(LED2);
skyscraper 2:9ffb2f18756b 22 // stop but print error dynamically
skyscraper 2:9ffb2f18756b 23 int count = 0;
skyscraper 2:9ffb2f18756b 24 for (;;) {
skyscraper 2:9ffb2f18756b 25 led2 = 1;
skyscraper 2:9ffb2f18756b 26 std::cout << str << " " << count++ << '\n';
skyscraper 2:9ffb2f18756b 27 ThisThread::sleep_for(200U);
skyscraper 2:9ffb2f18756b 28 led2 = 0;
skyscraper 2:9ffb2f18756b 29 ThisThread::sleep_for(800U);
skyscraper 2:9ffb2f18756b 30 }
skyscraper 0:37dbfb036586 31 }
skyscraper 0:37dbfb036586 32 }// namespace
skyscraper 0:37dbfb036586 33
skyscraper 0:37dbfb036586 34 int main()
skyscraper 0:37dbfb036586 35 {
skyscraper 0:37dbfb036586 36 std::cout << "HMC5883 test\n";
skyscraper 0:37dbfb036586 37 //wait for mag to init
skyscraper 0:37dbfb036586 38 ThisThread::sleep_for(500U);
skyscraper 0:37dbfb036586 39
skyscraper 3:2834be4e10ef 40 if ( mag_detected() ) {
skyscraper 0:37dbfb036586 41 std::cout << "Detected a HMC5883\n";
skyscraper 0:37dbfb036586 42 } else {
skyscraper 0:37dbfb036586 43 loop_forever("Failed to detect HMC5883");
skyscraper 0:37dbfb036586 44 }
skyscraper 0:37dbfb036586 45
skyscraper 0:37dbfb036586 46 // N.b after offsets removed mag was reading around 33.6 uT, so not bad!
skyscraper 0:37dbfb036586 47 constexpr auto earth_magnetic_field_flux_density = 31.869_uT;
skyscraper 3:2834be4e10ef 48 bool const success =
skyscraper 0:37dbfb036586 49 mag_set_samples_average(8) &&
skyscraper 0:37dbfb036586 50 mag_set_range( earth_magnetic_field_flux_density * 2U);
skyscraper 0:37dbfb036586 51 if ( !success) {
skyscraper 0:37dbfb036586 52 loop_forever("HMC5883 setup failed");
skyscraper 0:37dbfb036586 53 }
skyscraper 3:2834be4e10ef 54 std::cout << " mag range set to " << mag_get_range() << '\n';
skyscraper 2:9ffb2f18756b 55
skyscraper 3:2834be4e10ef 56 mag_raw_values(20_ms);
skyscraper 3:2834be4e10ef 57
skyscraper 3:2834be4e10ef 58 // mag_offset_calibrate();
skyscraper 3:2834be4e10ef 59
skyscraper 0:37dbfb036586 60 }