Serial output for sensors on FRDM-KL46Z

Dependencies:   MAG3110 MMA8451Q TSI mbed

main.cpp

Committer:
aaronice
Date:
2014-02-07
Revision:
1:f3f39343f606
Parent:
0:6a47f35289ea

File content as of revision 1:f3f39343f606:

 #include "mbed.h"
 #include "MAG3110.h"
 #include "MMA8451Q.h"
 #include "TSISensor.h"
 //#include "TEMT5200.h"
 
 Serial pc(USBTX, USBRX); // tx, rx
 // Magnetometer
 #define MAG3110_I2C_ADDRESS (0x0e<<1)
 // MAG3110 mag(PTE25, PTE24, MAG3110_I2C_ADDRESS);
 MAG3110 mag(PTE25, PTE24, &pc);
 // Accelerometer
 #define MMA8451_I2C_ADDRESS (0x1d<<1)
 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
 
 // Slide sensor acts as a button
 TSISensor tsi;
 
 // Ambient light sensor
 // TEMPT5200 alux(PTE22);
 
 
 DigitalOut GreenLED(LED1);
 DigitalOut RedLED(LED2);
 
 void callback() {
    // Note: you need to actually read from the serial to clear the RX interrupt
    printf("%c\n", pc.getc());
    GreenLED = (!GreenLED)|(GreenLED);
    wait(10);
    GreenLED = !GreenLED;
 }
 

void calXY() //magnetometer calibration: finding max and min of X, Y axis
{
    int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY;

    RedLED = 1;

    printf("Waiting for initial press\n");
    // Wait for slider to be pressed
    while( tsi.readDistance() == 0 ) {
        RedLED = 1;
        wait(0.2);
        RedLED =0;
        wait(0.2);
    }

    printf("Waiting for release\n");

    // Wait for release
    while( tsi.readDistance() != 0 ) {
        RedLED =0;
        wait(0.2);
        RedLED = 1;
        wait(0.2);
    }
    RedLED =0;
    wait(0.5);

    printf("Rotate\n");

    tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB);
    tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB);

    while(tsi.readDistance() == 0) {
        GreenLED = 1;
        wait(0.1);
        GreenLED =0;
        wait(0.1);
        newX = mag.readVal(MAG_OUT_X_MSB);
        newY = mag.readVal(MAG_OUT_Y_MSB);
        if (newX > tempXmax) tempXmax = newX;
        if (newX < tempXmin) tempXmin = newX;
        if (newY > tempYmax) tempYmax = newY;
        if (newY < tempYmin) tempYmin = newY;
    }
   
    mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax );

    // Wait for release
    while( tsi.readDistance() != 0 ) {
        GreenLED =0;
        wait(0.2);
        GreenLED = 1;
        wait(0.2);
    }
    GreenLED =0;
    wait(1.0);

}


 int main(void){
    
    pc.attach(&callback);
    
    // MAG3110 Calibration
    printf("MAG3110 Test\n");

    RedLED =0;
    GreenLED = 1;
    
    // Get some values
    printf("DR_STATUS %X\n", mag.readReg( MAG_DR_STATUS ));
    printf("WHO_AM_I %X\n", mag.readReg( MAG_WHO_AM_I ));
    printf("SYSMOD %X\n", mag.readReg( MAG_SYSMOD ));
    printf("DIE_TEMP %d\n", mag.readReg( MAG_DIE_TEMP ));

    printf("OFF_X %d\n", mag.readVal( MAG_OFF_X_MSB ));
    printf("OFF_Y %d\n", mag.readVal( MAG_OFF_Y_MSB ));
    printf("OFF_Z %d\n", mag.readVal( MAG_OFF_Z_MSB ));

    printf("CTRL_REG1 %X\n", mag.readReg( MAG_CTRL_REG1 ));
    printf("CTRL_REG2 %X\n", mag.readReg( MAG_CTRL_REG2 ));

    printf("calibrate\n");
    calXY();
    printf("....Finished\n");

    RedLED = 0;
    GreenLED = 0;
    
    
    
    
    
    while(1){
        
        wait(0.5);
        int xVal = mag.readVal(MAG_OUT_X_MSB);
        int yVal = mag.readVal(MAG_OUT_Y_MSB);
        int zVal = mag.readVal(MAG_OUT_Z_MSB);
        float heading = mag.getHeading();
       
// Do something with heading - display direction and turn on blue LED if heading approx north
        if (abs(heading) <= 22.5) {
            printf("N\n");
            RedLED = 0;
        } else RedLED = 1;
        
        if (abs(heading) >= 157.5) pc.printf("S\n");
        if (heading >= 67.5 && heading <= 112.5) pc.printf("E \n");
        if (heading <= -67.5 && heading >= -112.5) pc.printf("W \n");
        if (heading > 22.5 && heading < 67.5) pc.printf("NE\n");
        if (heading < -22.5 && heading > -67.5) pc.printf("NW\n");
        if (heading > 112.5 && heading < 157.5) pc.printf("SE\n");
        if (heading < -112.5 && heading > -157.5) pc.printf("SW\n");
        //if (heading < 0) heading += 360.0;
        
        pc.printf("magX = %d, magY = %d, magZ = %d, Heading = %f ;\t", xVal, yVal, zVal, heading);

        pc.printf("accX = %f, accY = %f, accZ = %f;\t", abs(acc.getAccX()),abs(acc.getAccY()),abs(acc.getAccZ()));
                
        pc.printf("Touch Sensor Input: %f\n", tsi.readPercentage());
        
        //pc.printf("Ambient Light: %f", alux);
        wait(1);
        }
    
    
 }