Homework 8.1
Dependencies: MMA8451Q8 SLCD mbed
Revision 0:fbf7e19e0e61, committed 2017-03-06
- Comitter:
- CKMonroe
- Date:
- Mon Mar 06 21:22:11 2017 +0000
- Commit message:
- HW 8.1
Changed in this revision
diff -r 000000000000 -r fbf7e19e0e61 MMA8451Q8.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q8.lib Mon Mar 06 21:22:11 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/CKMonroe/code/MMA8451Q8/#ebf150f92734
diff -r 000000000000 -r fbf7e19e0e61 SLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SLCD.lib Mon Mar 06 21:22:11 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Sissors/code/SLCD/#ef2b3b7f1b01
diff -r 000000000000 -r fbf7e19e0e61 lcd_acc_46_v4-8g.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lcd_acc_46_v4-8g.cpp Mon Mar 06 21:22:11 2017 +0000 @@ -0,0 +1,210 @@ +#include "mbed.h" +#include "MMA8451Q8.h" +#include "SLCD.h" +/* +Test of the accelerometer, digital I/O, on-board LCD screen, and 16-bit ADC. + + */ + +#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 RSTARTMESS "RSET" +#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 REG_WHO_AM_I 0x0D +#define XYZ_DATA_CFG 0x0E + +#define MAX_2G 0x00 +#define MAX_4G 0x01 +#define MAX_8G 0x02 + +#define PROGNAME "LCD_ACC_LCDv3 46\r/n" + +//#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); + + +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; + } + +} + + + +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; + int outState = false; + char lcdData[10]; //buffer needs places for decimal pt and colon + uint8_t regData = MAX_4G; + + +#ifdef PRINTDBUG + pc.printf(PROGNAME); +#endif + LCDMess(RSTARTMESS, 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(); + +// change sensititivity experimental +// this is where the call to change the g limit is made. +// switch this 2,4,or 8 + acc.setGLimit(8); + + + acc.readRegs(XYZ_DATA_CFG, ®Data, 1); + sprintf (lcdData,"%d",regData); + LCDMess(lcdData,BLINKTIME); + acc.readRegs(REG_WHO_AM_I, ®Data, 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. + switch (displayState){ + case XCOMPD: { + LCDMess(XCOMP,BLINKTIME); + break; + } + case YCOMPD: { + LCDMess(YCOMP,BLINKTIME); + break; + } + case ZCOMPD: { + LCDMess(ZCOMP,BLINKTIME); + break; + } + case VMAXD:{ + LCDMess(MAXVECT,BLINKTIME); + break; + } + }// switch + } + +// -------------------------------------------- + while (dataTimer.read() > DATATIME){ +// No offset + xAcc = abs(acc.getAccX()); + yAcc = abs(acc.getAccY()); + zAcc = abs(acc.getAccZ()); + // Calulate vector sum of x,y and z reading. +// vector = sqrt(pow(xAcc,2) + pow(zAcc,2)); + vector = zAcc; + if (vector > vMax) { + vMax = vector; + } + dataTimer.reset(); + } + +// Display the appropriate data on the LCD based upon what mode was chosen + while (displayTimer.read() > DisplayTime){ + switch (displayState) { + case XCOMPD: { + sprintf (lcdData,"%4.3f",xAcc); + break; + } + case YCOMPD: { + sprintf (lcdData,"%4.3f",yAcc); + break; + } + case ZCOMPD: { + sprintf (lcdData,"%4.3f",zAcc); + break; + } + case VMAXD:{ + sprintf (lcdData,"%4.3f",vMax); + break; + } + } + LCDMessNoDwell(lcdData); + displayTimer.reset(); + } // displaytimer +// Wait then do the whole thing again. +// Alive LEDs + while(blinkTimer.read()> LEDDELAY) { + LEDs[0].write(outState); + LEDs[1].write(!outState); + outState = !outState; + blinkTimer.reset(); + } + }//forever loop +}// main \ No newline at end of file
diff -r 000000000000 -r fbf7e19e0e61 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Mar 06 21:22:11 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/04dd9b1680ae \ No newline at end of file