This is project one

Dependencies:   MMA8451Q8_1 SLCD mbed

Fork of LCD_punch_mtr_8_v5 by Stanley Cohen

Files at this revision

API Documentation at this revision

Comitter:
sphasim
Date:
Mon Mar 30 19:29:26 2015 +0000
Parent:
5:6ec1dac45861
Commit message:
Done

Changed in this revision

LCD_punch_mtr8_v5.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/LCD_punch_mtr8_v5.cpp	Sat Jan 10 16:48:10 2015 +0000
+++ b/LCD_punch_mtr8_v5.cpp	Mon Mar 30 19:29:26 2015 +0000
@@ -10,7 +10,7 @@
  */
 
 #define BLINKTIME 0.7
-#define DATATIME 0.1
+#define DATATIME 0.5
 #define DATADISPDWELL 0.2
 #define NUMLEDS 2
 #define LEDON 0
@@ -70,7 +70,216 @@
 float accaxisdata[NUMSTATES];
 char displayformats[NUMSTATES][LCDLEN] = {"x.%3.2f","y.%3.2f","z.%3.2f","v.%3.2f"};
 //char displayformats[NUMSTATES][LCDLEN] = {"%4.3f","%4.3f","%4.3f","%4.3f"};
+#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 1
+#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"};
+
+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
 void LCDMess(char *lMess, float dWait){
         slcd.Home();
         slcd.clear();
@@ -138,7 +347,7 @@
 // http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf
 // See page 26
 // Set 8 g max limit
-    acc.setGLimit(MAX_8G); // For now set to 8g
+    acc.setGLimit(MAX_2G); // For now set to 8g
     acc.readRegs(XYZ_DATA_CFG, &regData, 1);
     sprintf (lcdData,"%d",regData);
     LCDMess(lcdData,BLINKTIME);