Magnetometer program example of use for NMHU students and others.
Dependencies: MAG3110 SLCD TSI mbed
Fork of magsensor_46_v2 by
Diff: magsensorv4.cpp
- Revision:
- 1:cba20461ceec
- Child:
- 2:06d3417f068e
diff -r 8664d36d4ff3 -r cba20461ceec magsensorv4.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/magsensorv4.cpp Sun Mar 29 18:24:10 2015 +0000 @@ -0,0 +1,158 @@ + +#include "mbed.h" +#include "MAG3110sc.h" +#include "SLCD.h" +#include "TSISensor.h" +/* +Test of magnetometer and other sensors on the KL46Z board. Not clear to me at this +time what the conversion factor of the magnetic field values map to. +set up state machine to cycle through what is displayed on the LCD screen. Remember +there are 4 characthers plus a "free" decimal point. - 140721 sc +*/ +#define MESSTIME 0.5 +#define BLINKTIME 200 // ms offset +#define BLINKMAX 1000 // touch sensor returns 0 - 0.99 +#define DATATIME 200 +#define LEDOFF 1 +#define LEDON 0 +#define MESSAGETIME 0.3 +#define LIGHT "LGHT" +#define MAGX_LBL "MAGX" +#define MAGY_LBL "MAGY" +#define BOTIX_LBL "TEMP" +#define ONEORDER 10 +#define TWOORDERS 100 +#define NULLVAL 20 + +// States +#define NUMSTATES 3 +#define L_STATE 0 +#define MAGX_STATE 1 +#define MAGY_STATE 2 + + +#define PROGNAME "MAG v4.0" +#define LPRNAME "MV4.0" + +// look at this site for PIN defintions. http://mbed.org/platforms/FRDM-KL46Z/ +// #define PRINTDBUG + +MAG3110 mag(PTE25, PTE24); + +SLCD slcd; //define LCD display +AnalogIn LightSensor(PTE22); +Serial pc(USBTX, USBRX); +Timer LEDTimer; +Timer DATATimer; +TSISensor tsiScaling; // Capacitive sensor/slider + +void LCDMess(char *lMess){ + slcd.Home(); + slcd.clear(); + slcd.printf(lMess); +} + +void LCDTMess(char *lMess, float Ddelay){ + slcd.Home(); + slcd.clear(); + slcd.printf(lMess); + wait(Ddelay); +} +int main() { + DigitalOut Rled(LED_RED); + DigitalOut Gled(LED_GREEN); + int displayState = 2; // show magy first on LCD + int LButtonState; + DigitalIn LftButton(PTC3); + int ledState = true; + float lightValue; //Read from ADC connected to ambient light sensor (photo transistor) + int magX = 0, magY = 0, magZ = 0; // Magnetic field data + //float Heading; + char lcdData[10]; + int magXVal; + int nullState = false; + float touchValue = 0.0; + float tempValue; + int LEDTime = BLINKTIME; + +// Do once... equivalent to the setup fucntion in the Arduino paradigm + mag.begin(); +// Setup event timers for LED blink and taking magnetometer data + LEDTimer.start(); + LEDTimer.reset(); + DATATimer.start(); + DATATimer.reset(); + // Show program name LCD and Serial + pc.printf(PROGNAME); + LCDTMess(LPRNAME,MESSTIME); +// Do forever... equivalent to the loop fucntion in the Arduino paradigm + while (true) { + tempValue = tsiScaling.readPercentage(); + if(tempValue > 0) touchValue = tempValue; + // read the inverted logic of the left button on the board. + LButtonState = !LftButton; + if (LButtonState) { //Change data that is displayed cycle through states + displayState++; + displayState = displayState % NUMSTATES; // Roll over if greater than the number of states defined + switch (displayState) { + case L_STATE: { + LCDTMess(LIGHT,MESSTIME); + break; + } + case MAGX_STATE: { + LCDTMess(MAGX_LBL,MESSTIME); + break; + } + case MAGY_STATE:{ + LCDTMess(MAGY_LBL,MESSTIME); + break; + } + } + } +// Manage mag and light data + if (DATATimer.read_ms() > DATATIME){ //take data at DATATIME intervals + DATATimer.reset(); + lightValue = 1.0-LightSensor.read(); + mag.getValues(&magX, &magY, &magZ); + // Heading = mag.getHeading(); + +#ifdef PRINTDBUG + pc.printf("%f\r\n", lightValue); + pc.printf("%d\r\n", magX); + pc.printf("%d\r\n", magY); +#endif + + switch (displayState) { + case L_STATE: { + sprintf (lcdData,"%4.3f",lightValue); + break; + } + case MAGX_STATE: { + magXVal =abs(magX)/ONEORDER; + nullState = (magXVal < NULLVAL); + sprintf (lcdData,"%4d",magXVal); + break; + } + case MAGY_STATE: { + sprintf (lcdData,"%4d",magY); + break; + } + } + LCDMess(lcdData); + } +// Manage LED's + if(LEDTimer.read_ms() > LEDTime) { // Blink LED's for dramatic effect. + LEDTime = BLINKTIME + (int)(touchValue*BLINKMAX); + LEDTimer.reset(); + if (nullState){ + Rled =LEDON; + Gled = LEDON; + } else { + ledState = !ledState; + Rled = ledState; + Gled = !ledState; + } + } + + } +} \ No newline at end of file