Homework 8.1

Dependencies:   MMA8451Q8 SLCD mbed

Committer:
CKMonroe
Date:
Mon Mar 06 21:22:11 2017 +0000
Revision:
0:fbf7e19e0e61
HW 8.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CKMonroe 0:fbf7e19e0e61 1 #include "mbed.h"
CKMonroe 0:fbf7e19e0e61 2 #include "MMA8451Q8.h"
CKMonroe 0:fbf7e19e0e61 3 #include "SLCD.h"
CKMonroe 0:fbf7e19e0e61 4 /*
CKMonroe 0:fbf7e19e0e61 5 Test of the accelerometer, digital I/O, on-board LCD screen, and 16-bit ADC.
CKMonroe 0:fbf7e19e0e61 6
CKMonroe 0:fbf7e19e0e61 7 */
CKMonroe 0:fbf7e19e0e61 8
CKMonroe 0:fbf7e19e0e61 9 #define BLINKTIME 0.7
CKMonroe 0:fbf7e19e0e61 10 #define DATATIME 0.1
CKMonroe 0:fbf7e19e0e61 11 #define DATADISPDWELL 0.2
CKMonroe 0:fbf7e19e0e61 12 #define NUMLEDS 2
CKMonroe 0:fbf7e19e0e61 13 #define LEDON 0
CKMonroe 0:fbf7e19e0e61 14 #define LEDOFF 1
CKMonroe 0:fbf7e19e0e61 15 #define SCALING 13
CKMonroe 0:fbf7e19e0e61 16 #define RSTARTMESS "RSET"
CKMonroe 0:fbf7e19e0e61 17 #define MAXVECT "MAXV"
CKMonroe 0:fbf7e19e0e61 18 #define XCOMP "XCMP"
CKMonroe 0:fbf7e19e0e61 19 #define YCOMP "YCMP"
CKMonroe 0:fbf7e19e0e61 20 #define ZCOMP "ZCMP"
CKMonroe 0:fbf7e19e0e61 21 #define ANALTOVOLTS 3.3
CKMonroe 0:fbf7e19e0e61 22 #define LEDDELAY 0.400
CKMonroe 0:fbf7e19e0e61 23 //define states
CKMonroe 0:fbf7e19e0e61 24 #define NUMSTATES 4
CKMonroe 0:fbf7e19e0e61 25 #define XCOMPD 0
CKMonroe 0:fbf7e19e0e61 26 #define YCOMPD 1
CKMonroe 0:fbf7e19e0e61 27 #define ZCOMPD 2
CKMonroe 0:fbf7e19e0e61 28 #define VMAXD 3
CKMonroe 0:fbf7e19e0e61 29
CKMonroe 0:fbf7e19e0e61 30 #define REG_WHO_AM_I 0x0D
CKMonroe 0:fbf7e19e0e61 31 #define XYZ_DATA_CFG 0x0E
CKMonroe 0:fbf7e19e0e61 32
CKMonroe 0:fbf7e19e0e61 33 #define MAX_2G 0x00
CKMonroe 0:fbf7e19e0e61 34 #define MAX_4G 0x01
CKMonroe 0:fbf7e19e0e61 35 #define MAX_8G 0x02
CKMonroe 0:fbf7e19e0e61 36
CKMonroe 0:fbf7e19e0e61 37 #define PROGNAME "LCD_ACC_LCDv3 46\r/n"
CKMonroe 0:fbf7e19e0e61 38
CKMonroe 0:fbf7e19e0e61 39 //#define PRINTDBUG
CKMonroe 0:fbf7e19e0e61 40 // Accelerometer SPI pins
CKMonroe 0:fbf7e19e0e61 41 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
CKMonroe 0:fbf7e19e0e61 42 PinName const SDA = PTE25;
CKMonroe 0:fbf7e19e0e61 43 PinName const SCL = PTE24;
CKMonroe 0:fbf7e19e0e61 44 #elif defined (TARGET_KL05Z)
CKMonroe 0:fbf7e19e0e61 45 PinName const SDA = PTB4;
CKMonroe 0:fbf7e19e0e61 46 PinName const SCL = PTB3;
CKMonroe 0:fbf7e19e0e61 47 #else
CKMonroe 0:fbf7e19e0e61 48 #error TARGET NOT DEFINED
CKMonroe 0:fbf7e19e0e61 49 #endif
CKMonroe 0:fbf7e19e0e61 50
CKMonroe 0:fbf7e19e0e61 51 #define MMA8451_I2C_ADDRESS (0x1d<<1)
CKMonroe 0:fbf7e19e0e61 52
CKMonroe 0:fbf7e19e0e61 53 SLCD slcd; //define LCD display
CKMonroe 0:fbf7e19e0e61 54 Timer blinkTimer;
CKMonroe 0:fbf7e19e0e61 55 Timer dataTimer;
CKMonroe 0:fbf7e19e0e61 56 Timer displayTimer;
CKMonroe 0:fbf7e19e0e61 57 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
CKMonroe 0:fbf7e19e0e61 58 AnalogIn TMP01(PTB1);
CKMonroe 0:fbf7e19e0e61 59 DigitalOut LEDs[NUMLEDS]={LED_RED, LED_GREEN}; //Indicator LEDs
CKMonroe 0:fbf7e19e0e61 60 Serial pc(USBTX, USBRX);
CKMonroe 0:fbf7e19e0e61 61
CKMonroe 0:fbf7e19e0e61 62
CKMonroe 0:fbf7e19e0e61 63 void LCDMess(char *lMess, float dWait){
CKMonroe 0:fbf7e19e0e61 64 slcd.Home();
CKMonroe 0:fbf7e19e0e61 65 slcd.clear();
CKMonroe 0:fbf7e19e0e61 66 slcd.printf(lMess);
CKMonroe 0:fbf7e19e0e61 67 wait(dWait);
CKMonroe 0:fbf7e19e0e61 68 }
CKMonroe 0:fbf7e19e0e61 69 void LCDMessNoDwell(char *lMess){
CKMonroe 0:fbf7e19e0e61 70 slcd.Home();
CKMonroe 0:fbf7e19e0e61 71 slcd.clear();
CKMonroe 0:fbf7e19e0e61 72 slcd.printf(lMess);
CKMonroe 0:fbf7e19e0e61 73 }
CKMonroe 0:fbf7e19e0e61 74
CKMonroe 0:fbf7e19e0e61 75
CKMonroe 0:fbf7e19e0e61 76 void allLEDsOFF(int numberOfLEDS) {
CKMonroe 0:fbf7e19e0e61 77 int i;
CKMonroe 0:fbf7e19e0e61 78 for (i=0;i<numberOfLEDS; i++){
CKMonroe 0:fbf7e19e0e61 79 LEDs[i] = LEDOFF;
CKMonroe 0:fbf7e19e0e61 80 }
CKMonroe 0:fbf7e19e0e61 81
CKMonroe 0:fbf7e19e0e61 82 }
CKMonroe 0:fbf7e19e0e61 83
CKMonroe 0:fbf7e19e0e61 84
CKMonroe 0:fbf7e19e0e61 85
CKMonroe 0:fbf7e19e0e61 86 int main() {
CKMonroe 0:fbf7e19e0e61 87
CKMonroe 0:fbf7e19e0e61 88 int RButtonState;
CKMonroe 0:fbf7e19e0e61 89 int LButtonState;
CKMonroe 0:fbf7e19e0e61 90 DigitalIn RtButton(PTC12);
CKMonroe 0:fbf7e19e0e61 91 DigitalIn LftButton(PTC3);
CKMonroe 0:fbf7e19e0e61 92 int displayState = XCOMPD;
CKMonroe 0:fbf7e19e0e61 93 float xAcc = 0.0;
CKMonroe 0:fbf7e19e0e61 94 float yAcc = 0.0;
CKMonroe 0:fbf7e19e0e61 95 float zAcc = 0.0;
CKMonroe 0:fbf7e19e0e61 96 float vector;
CKMonroe 0:fbf7e19e0e61 97 float vMax = 0.0;
CKMonroe 0:fbf7e19e0e61 98 float DisplayTime = DATADISPDWELL;
CKMonroe 0:fbf7e19e0e61 99 int outState = false;
CKMonroe 0:fbf7e19e0e61 100 char lcdData[10]; //buffer needs places for decimal pt and colon
CKMonroe 0:fbf7e19e0e61 101 uint8_t regData = MAX_4G;
CKMonroe 0:fbf7e19e0e61 102
CKMonroe 0:fbf7e19e0e61 103
CKMonroe 0:fbf7e19e0e61 104 #ifdef PRINTDBUG
CKMonroe 0:fbf7e19e0e61 105 pc.printf(PROGNAME);
CKMonroe 0:fbf7e19e0e61 106 #endif
CKMonroe 0:fbf7e19e0e61 107 LCDMess(RSTARTMESS, BLINKTIME);
CKMonroe 0:fbf7e19e0e61 108 // Initialze readings and sequence the LED's for dramtic effect.
CKMonroe 0:fbf7e19e0e61 109 allLEDsOFF(NUMLEDS);
CKMonroe 0:fbf7e19e0e61 110 blinkTimer.start();
CKMonroe 0:fbf7e19e0e61 111 blinkTimer.reset();
CKMonroe 0:fbf7e19e0e61 112 displayTimer.start();
CKMonroe 0:fbf7e19e0e61 113 displayTimer.reset();
CKMonroe 0:fbf7e19e0e61 114 dataTimer.start();
CKMonroe 0:fbf7e19e0e61 115 dataTimer.reset();
CKMonroe 0:fbf7e19e0e61 116
CKMonroe 0:fbf7e19e0e61 117 // change sensititivity experimental
CKMonroe 0:fbf7e19e0e61 118 // this is where the call to change the g limit is made.
CKMonroe 0:fbf7e19e0e61 119 // switch this 2,4,or 8
CKMonroe 0:fbf7e19e0e61 120 acc.setGLimit(8);
CKMonroe 0:fbf7e19e0e61 121
CKMonroe 0:fbf7e19e0e61 122
CKMonroe 0:fbf7e19e0e61 123 acc.readRegs(XYZ_DATA_CFG, &regData, 1);
CKMonroe 0:fbf7e19e0e61 124 sprintf (lcdData,"%d",regData);
CKMonroe 0:fbf7e19e0e61 125 LCDMess(lcdData,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 126 acc.readRegs(REG_WHO_AM_I, &regData, 1);
CKMonroe 0:fbf7e19e0e61 127 sprintf (lcdData,"%d",regData);
CKMonroe 0:fbf7e19e0e61 128 LCDMess(lcdData,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 129
CKMonroe 0:fbf7e19e0e61 130 // main loop forever
CKMonroe 0:fbf7e19e0e61 131 while(true) {
CKMonroe 0:fbf7e19e0e61 132
CKMonroe 0:fbf7e19e0e61 133 // Handle user input for display selections
CKMonroe 0:fbf7e19e0e61 134 RButtonState = !RtButton; // button is pulled up so false is when button is pushed it's inverted to avoid confusion downstream
CKMonroe 0:fbf7e19e0e61 135 if (RButtonState){
CKMonroe 0:fbf7e19e0e61 136 vMax = 0.0; // Clear vMax
CKMonroe 0:fbf7e19e0e61 137 LCDMess(RSTARTMESS, BLINKTIME);
CKMonroe 0:fbf7e19e0e61 138 }
CKMonroe 0:fbf7e19e0e61 139 LButtonState = !LftButton;
CKMonroe 0:fbf7e19e0e61 140 if (LButtonState) { //Change data that is displayed
CKMonroe 0:fbf7e19e0e61 141 displayState = (displayState + 1) % NUMSTATES;
CKMonroe 0:fbf7e19e0e61 142 // Change to switch/case soon.
CKMonroe 0:fbf7e19e0e61 143 switch (displayState){
CKMonroe 0:fbf7e19e0e61 144 case XCOMPD: {
CKMonroe 0:fbf7e19e0e61 145 LCDMess(XCOMP,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 146 break;
CKMonroe 0:fbf7e19e0e61 147 }
CKMonroe 0:fbf7e19e0e61 148 case YCOMPD: {
CKMonroe 0:fbf7e19e0e61 149 LCDMess(YCOMP,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 150 break;
CKMonroe 0:fbf7e19e0e61 151 }
CKMonroe 0:fbf7e19e0e61 152 case ZCOMPD: {
CKMonroe 0:fbf7e19e0e61 153 LCDMess(ZCOMP,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 154 break;
CKMonroe 0:fbf7e19e0e61 155 }
CKMonroe 0:fbf7e19e0e61 156 case VMAXD:{
CKMonroe 0:fbf7e19e0e61 157 LCDMess(MAXVECT,BLINKTIME);
CKMonroe 0:fbf7e19e0e61 158 break;
CKMonroe 0:fbf7e19e0e61 159 }
CKMonroe 0:fbf7e19e0e61 160 }// switch
CKMonroe 0:fbf7e19e0e61 161 }
CKMonroe 0:fbf7e19e0e61 162
CKMonroe 0:fbf7e19e0e61 163 // --------------------------------------------
CKMonroe 0:fbf7e19e0e61 164 while (dataTimer.read() > DATATIME){
CKMonroe 0:fbf7e19e0e61 165 // No offset
CKMonroe 0:fbf7e19e0e61 166 xAcc = abs(acc.getAccX());
CKMonroe 0:fbf7e19e0e61 167 yAcc = abs(acc.getAccY());
CKMonroe 0:fbf7e19e0e61 168 zAcc = abs(acc.getAccZ());
CKMonroe 0:fbf7e19e0e61 169 // Calulate vector sum of x,y and z reading.
CKMonroe 0:fbf7e19e0e61 170 // vector = sqrt(pow(xAcc,2) + pow(zAcc,2));
CKMonroe 0:fbf7e19e0e61 171 vector = zAcc;
CKMonroe 0:fbf7e19e0e61 172 if (vector > vMax) {
CKMonroe 0:fbf7e19e0e61 173 vMax = vector;
CKMonroe 0:fbf7e19e0e61 174 }
CKMonroe 0:fbf7e19e0e61 175 dataTimer.reset();
CKMonroe 0:fbf7e19e0e61 176 }
CKMonroe 0:fbf7e19e0e61 177
CKMonroe 0:fbf7e19e0e61 178 // Display the appropriate data on the LCD based upon what mode was chosen
CKMonroe 0:fbf7e19e0e61 179 while (displayTimer.read() > DisplayTime){
CKMonroe 0:fbf7e19e0e61 180 switch (displayState) {
CKMonroe 0:fbf7e19e0e61 181 case XCOMPD: {
CKMonroe 0:fbf7e19e0e61 182 sprintf (lcdData,"%4.3f",xAcc);
CKMonroe 0:fbf7e19e0e61 183 break;
CKMonroe 0:fbf7e19e0e61 184 }
CKMonroe 0:fbf7e19e0e61 185 case YCOMPD: {
CKMonroe 0:fbf7e19e0e61 186 sprintf (lcdData,"%4.3f",yAcc);
CKMonroe 0:fbf7e19e0e61 187 break;
CKMonroe 0:fbf7e19e0e61 188 }
CKMonroe 0:fbf7e19e0e61 189 case ZCOMPD: {
CKMonroe 0:fbf7e19e0e61 190 sprintf (lcdData,"%4.3f",zAcc);
CKMonroe 0:fbf7e19e0e61 191 break;
CKMonroe 0:fbf7e19e0e61 192 }
CKMonroe 0:fbf7e19e0e61 193 case VMAXD:{
CKMonroe 0:fbf7e19e0e61 194 sprintf (lcdData,"%4.3f",vMax);
CKMonroe 0:fbf7e19e0e61 195 break;
CKMonroe 0:fbf7e19e0e61 196 }
CKMonroe 0:fbf7e19e0e61 197 }
CKMonroe 0:fbf7e19e0e61 198 LCDMessNoDwell(lcdData);
CKMonroe 0:fbf7e19e0e61 199 displayTimer.reset();
CKMonroe 0:fbf7e19e0e61 200 } // displaytimer
CKMonroe 0:fbf7e19e0e61 201 // Wait then do the whole thing again.
CKMonroe 0:fbf7e19e0e61 202 // Alive LEDs
CKMonroe 0:fbf7e19e0e61 203 while(blinkTimer.read()> LEDDELAY) {
CKMonroe 0:fbf7e19e0e61 204 LEDs[0].write(outState);
CKMonroe 0:fbf7e19e0e61 205 LEDs[1].write(!outState);
CKMonroe 0:fbf7e19e0e61 206 outState = !outState;
CKMonroe 0:fbf7e19e0e61 207 blinkTimer.reset();
CKMonroe 0:fbf7e19e0e61 208 }
CKMonroe 0:fbf7e19e0e61 209 }//forever loop
CKMonroe 0:fbf7e19e0e61 210 }// main