Playing around with accelerometer and magnetometer on mbed KL46Z

Dependencies:   MAG3110 MMA8451Q PinDetect mbed TSI

main.cpp

Committer:
mohammmo
Date:
2014-02-04
Revision:
7:1cd1e239acf0
Parent:
5:4ccda4b4f345

File content as of revision 7:1cd1e239acf0:

#include "mbed.h"
#include "PinDetect.h"
#include "MMA8451Q.h"
#include "MAG3110.h"
#include "TSISensor.h"
#include <string>

#define MMA8451_I2C_ADDRESS (0x1d<<1)

// Declare output LEDs
DigitalOut ledgreen(PTD5);
DigitalOut ledred(PTE29);

// Declare USB serial connection
Serial pc(USBTX,USBRX);

// Declare timer interrupt
Ticker timerAcc;
Ticker timerMag;
Ticker timerLight; 
Ticker timerTouch;

//Sampling rate
float sample = 0.5;

// Declare pointer variables
float xAcc;
float yAcc;
float zAcc;
int xMag;
int yMag;
int zMag;
float xLight; 
float xTouch; 

// Declare Accelerometer pins and I2C address
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS, 0, 0);
// Declare Magnetometer pins
MAG3110 mag(PTE25, PTE24);
// Declare touch sensor pin
TSISensor touch;
// Declare light sensor pin
AnalogIn light(PTE22);
// variables for receive interrupt  
const int buffer_size = 255;
char rx_buffer[buffer_size];
int track_rx = 0;
bool received = false; 

// Functions
void init();
void accTime();
void magTime();
void lightTime();
void touchTime();
void receive_handler();
void change_interval(float sample);

void init()
{
    // Attach timerAcc
    timerAcc.attach(&accTime, sample);
    timerMag.attach(&magTime, sample);
    timerLight.attach(&lightTime, sample);
    timerTouch.attach(&touchTime, sample);
    pc.attach(&receive_handler,Serial::RxIrq);
    ledred = 0; 
    ledgreen = 0;   
}

int main() 
{
    // Initialize
    init();

    while(1)
    {
        // read all sensor data 
        //pc.printf("%f %f %f %d %d %d %f %f\n", xAcc, yAcc, zAcc, xMag, yMag, zMag, xLight, xTouch);
        //wait(0.05);
        if (received){
            __disable_irq();    
            sscanf(rx_buffer,"%f",&sample);
            pc.printf("%f\r\n", sample);
            change_interval(sample);
            received = false; 
            __enable_irq();     
        }
    }
}

void accTime() 
{
    xAcc = abs(acc.getAccX());
    yAcc = abs(acc.getAccY());
    zAcc = abs(acc.getAccZ());
    ledgreen = !ledgreen;
}

void magTime()
{
    xMag = mag.getXVal();
    yMag = mag.getYVal();
    zMag = mag.getZVal();
    ledred = !ledred;
}

void lightTime()
{
    xLight = 1 - light.read();
}

void touchTime()
{
    xTouch = 1 - touch.readPercentage();
}

void receive_handler(){
    while (pc.readable() && track_rx < buffer_size){
        rx_buffer[track_rx] = pc.getc();
        if (rx_buffer[track_rx] == '#'){
            rx_buffer[track_rx] = '\0';
            track_rx=0;
            received = true; 
            break;
        }
        track_rx++;
    }
    return;
}

void change_interval(float sample)
{
    timerAcc.detach();
    timerMag.detach();
    timerLight.detach();
    timerTouch.detach();
    timerAcc.attach(&accTime, sample);
    timerMag.attach(&magTime, sample);
    timerLight.attach(&lightTime, sample);
    timerTouch.attach(&touchTime, sample);
}