HW 3.2 Ambient Computing Modifications

Dependencies:   MMA8451Q8a SLCD mbed

Fork of LCD_punch_mtr_8_v5_class by Stanley Cohen

LCD_punch_mtr8_v5.cpp

Committer:
bomalley
Date:
2015-01-31
Revision:
8:71d04967282d
Parent:
7:6aa16a6fde70

File content as of revision 8:71d04967282d:

#include "mbed.h"
#include "MMA8451Q8.h"
#include "SLCD.h"
/* 
Test of the accelerometer, digital I/O, on-board LCD screen, and 16-bit ADC.
 Looing at vector product of the x-y components of the accelerometer.
 Works pretty well. Still rough, program wise - sc 140710
 Addiing touch sensor to replace potentiometer.
 Show x and y components 
 */

#define BLINKTIME 0.7
#define DATATIME 0.1
#define DATADISPDWELL 0.2
#define NUMLEDS 2
#define LEDON 0
#define LEDOFF 1
#define SCALING 13
#define LCDLEN 10
#define RSTARTMESS "PNCH"
#define MAXVECT "MAXV"
#define XCOMP "XCMP"
#define YCOMP "YCMP"
#define ZCOMP "ZCMP"
#define ANALTOVOLTS 3.3
#define LEDDELAY 0.400
//define states
#define NUMSTATES 4
#define XCOMPD 0
#define YCOMPD 1
#define ZCOMPD 2
#define VMAXD 3
#define MAXGS 8
#define COUNTSCALE 10
#define REG_WHO_AM_I      0x0D
#define XYZ_DATA_CFG      0x0E

#define REG_OUT_X_MSB     0x01
#define REG_OUT_Y_MSB     0x03
#define REG_OUT_Z_MSB     0x05

#define MAX_2G            0x00
#define MAX_4G            0x01
#define MAX_8G            0x02


#define PROGNAME "LCD_punch_mtr 8 v5\r/n"
#define LCDNAME "PC.V5"


//#define PRINTDBUG
// Accelerometer SPI pins
#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
  PinName const SDA = PTE25;
  PinName const SCL = PTE24;
#elif defined (TARGET_KL05Z)
  PinName const SDA = PTB4;
  PinName const SCL = PTB3;
#else
  #error TARGET NOT DEFINED
#endif

#define MMA8451_I2C_ADDRESS (0x1d<<1)

SLCD slcd; //define LCD display
Timer blinkTimer;
Timer dataTimer;
Timer displayTimer;
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
AnalogIn TMP01(PTB1);
DigitalOut LEDs[NUMLEDS]={LED_RED, LED_GREEN}; //Indicator LEDs
Serial pc(USBTX, USBRX);
char displayTitles[NUMSTATES][LCDLEN] = {XCOMP,YCOMP,ZCOMP,MAXVECT};
float accaxisdata[NUMSTATES];
char displayformats[NUMSTATES][LCDLEN] = {"%4.0f","y.%3.2f","z.%3.2f","v.%3.2f"};
//char displayformats[NUMSTATES][LCDLEN] = {"%4.3f","%4.3f","%4.3f","%4.3f"};

void LCDMess(char *lMess, float dWait){
        slcd.Home();
        slcd.clear();
        slcd.printf(lMess);
        wait(dWait);
} 
void LCDMessNoDwell(char *lMess){
        slcd.Home();
        slcd.clear();
        slcd.printf(lMess);
} 


void allLEDsOFF(int numberOfLEDS) {
    int i;
    for (i=0;i<numberOfLEDS; i++){
            LEDs[i] = LEDOFF;
        }

}

void runLEDs(int numberOfLEDS) {
    int i;
    for (i=0;i<numberOfLEDS; i++){
            LEDs[i] = LEDON;
            wait(0.2);
        }
   allLEDsOFF(numberOfLEDS);     
}



int main() {
    
    int RButtonState;
    int LButtonState;
    DigitalIn RtButton(PTC12);
    DigitalIn LftButton(PTC3);
    int displayState = XCOMPD; 
    float xAcc = 0.0;
    float yAcc = 0.0;
    float zAcc = 0.0;
    float vector;
    float vMax = 0.0;
    float DisplayTime = DATADISPDWELL;
    float LEDDwell = BLINKTIME;
    int outState = false;
    char lcdData[LCDLEN]; //buffer needs places dor decimal pt and colon
    uint8_t regData = MAX_4G; // test value must change after G setting
    int16_t xCounts;
    int16_t yCounts;
    int16_t zCounts;
    
#ifdef PRINTDBUG
        pc.printf(PROGNAME);
#endif
    LCDMess(LCDNAME, BLINKTIME);
// Initialze readings and sequence the LED's for dramtic effect.
    allLEDsOFF(NUMLEDS);
    blinkTimer.start();
    blinkTimer.reset();
    displayTimer.start();
    displayTimer.reset();
    dataTimer.start();
    dataTimer.reset();
    LCDMess(RSTARTMESS, BLINKTIME);
// Go into registers ofn Accelerometer, change sensitivity then test.
// http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
// See page 26
// Set 2 g max limit ****************** Note limits
    acc.setGLimit(MAX_2G); // For now set to 2g
    acc.readRegs(XYZ_DATA_CFG, &regData, 1);
    sprintf (lcdData,"%d",regData);
    LCDMess(lcdData,BLINKTIME);
    acc.readRegs(REG_WHO_AM_I, &regData, 1);
    sprintf (lcdData,"%d",regData);
    LCDMess(lcdData,BLINKTIME);   
// main loop forever 
    while(true) {

// Handle user input for display selections
        RButtonState = !RtButton; // button is pulled up so false is when button is pushed it's inverted to avoid confusion downstream
        if (RButtonState){
            vMax = 0.0; // Clear vMax
            LCDMess(RSTARTMESS, BLINKTIME);
        }
        LButtonState = !LftButton;
        if (LButtonState) {  //Change data that is displayed
            displayState = (displayState + 1) % NUMSTATES;
            // Change to switch/case soon.
            LCDMess(displayTitles[displayState],BLINKTIME);     
        }
        
// --------------------------------------------
        while (dataTimer.read() > DATATIME){

// No offset
            xAcc = abs(acc.getAccX());
            xCounts = acc.getAccAxis(REG_OUT_X_MSB);
            
            yAcc = abs(acc.getAccY());
            yCounts = acc.getAccAxis(REG_OUT_Y_MSB);
            
            zAcc = abs(acc.getAccZ());
            zCounts = acc.getAccAxis(REG_OUT_Z_MSB);
 // Calulate vector sum of x,y and z reading.       
            vector = sqrt(pow(xAcc,2) + pow(zAcc,2));
            vector = zAcc;
            if (vector > vMax) {
                vMax = vector;
            }
//Prepare data for LCD display 
            accaxisdata[XCOMPD] = abs((float)xCounts/COUNTSCALE); // scalling is set to 1 at this point
            accaxisdata[YCOMPD] = abs((float)yCounts/COUNTSCALE);;
            accaxisdata[ZCOMPD] = abs((float)zCounts/COUNTSCALE);;
            accaxisdata[VMAXD] = vMax;
            dataTimer.reset();
            LEDDwell = 1.1 - vMax/MAXGS;
        }

// Display the appropriate data on the LCD based upon what mode was chosen
        while (displayTimer.read() > DisplayTime){
            sprintf (lcdData,displayformats[displayState],accaxisdata[displayState]);          
            LCDMessNoDwell(lcdData);
            displayTimer.reset();
        } // displaytimer 
// Wait then do the whole thing again.  
// Alive LEDs
        while(blinkTimer.read()> LEDDwell) {     
            LEDs[0].write(outState);
            LEDs[1].write(!outState);
            outState = !outState; 
            blinkTimer.reset();
        } 
    }//forever loop
}// main