SB-Midterm

Dependencies:   MMA8451Q8b SLCD mbed

Fork of KL46z_single_tap_2017_blank by Stanley Cohen

Committer:
sbart
Date:
Mon Mar 13 03:51:30 2017 +0000
Revision:
15:fb9e64c59187
Parent:
14:65d6d50062ed
-

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scohennm 12:10e6d0d12833 1 #include "mbed.h"
scohennm 12:10e6d0d12833 2 #include "MMA8451Q8g.h"
scohennm 12:10e6d0d12833 3 #include "SLCD.h"
scohennm 12:10e6d0d12833 4
scohennm 12:10e6d0d12833 5 #define BLINKTIME 1.5
scohennm 12:10e6d0d12833 6 #define RELAYON 0
scohennm 12:10e6d0d12833 7 #define RELAYOFF 1
scohennm 12:10e6d0d12833 8 #define LEDDELAY 0.4
scohennm 12:10e6d0d12833 9 #define WAITDELAY 0.7
scohennm 12:10e6d0d12833 10 #define LCDLEN 10
scohennm 12:10e6d0d12833 11
scohennm 12:10e6d0d12833 12 #define REG_WHO_AM_I 0x0D
scohennm 12:10e6d0d12833 13 #define XYZ_DATA_CFG 0x0E
scohennm 12:10e6d0d12833 14
scohennm 12:10e6d0d12833 15 #define REG_OUT_X_MSB 0x01
scohennm 12:10e6d0d12833 16 #define REG_OUT_Y_MSB 0x03
scohennm 12:10e6d0d12833 17 #define REG_OUT_Z_MSB 0x05
scohennm 12:10e6d0d12833 18 #define REG_PULSE_CFG 0x21
scohennm 12:10e6d0d12833 19 #define REG_PULSE_SRC 0x22
scohennm 12:10e6d0d12833 20 #define REG_PULSE_THSZ 0x25
sbart 13:c7b3e97f9bc6 21 #define REG_PULSE_TMLT 0x26
scohennm 12:10e6d0d12833 22 #define REG_CTRL_4 0x2D
scohennm 12:10e6d0d12833 23 #define REG_CTRL_5 0x2E
scohennm 12:10e6d0d12833 24
scohennm 12:10e6d0d12833 25 #define MAX_2G 0x00
scohennm 12:10e6d0d12833 26 #define MAX_4G 0x01
scohennm 12:10e6d0d12833 27 #define MAX_8G 0x02
scohennm 12:10e6d0d12833 28 /**************************************
sbart 13:c7b3e97f9bc6 29 You need to fill in the missing numbers below for this to work
scohennm 12:10e6d0d12833 30 0x00 is just a place holder
scohennm 12:10e6d0d12833 31 *************************************/
sbart 14:65d6d50062ed 32
sbart 13:c7b3e97f9bc6 33 //SB - sets the pulse register for the Z-axis single tap
sbart 14:65d6d50062ed 34 //line 140 - OR these two numbers to make 11010000 to enable single tap on the Z-axis
sbart 15:fb9e64c59187 35 //Mainly want to enable bit 4 in register 0x21: PULSE_CFG
sbart 14:65d6d50062ed 36 #define LATCH_DATA 0xC0
sbart 13:c7b3e97f9bc6 37 #define AXIS_DATA 0x10
sbart 13:c7b3e97f9bc6 38
sbart 13:c7b3e97f9bc6 39 //SB - Sets the interrupt for only the Z-axis single tap
sbart 15:fb9e64c59187 40 //Activate bit 3 with 00000100 = 0x08
sbart 14:65d6d50062ed 41 #define SET_INTERRUPT 0x08
scohennm 12:10e6d0d12833 42
sbart 13:c7b3e97f9bc6 43 //SB - sets the interrupt line for the Z-axis single tap to INT1
sbart 15:fb9e64c59187 44 //Activate bit 3 with 00000100 = 0x08
sbart 13:c7b3e97f9bc6 45 #define SET_INT_LINE 0x08
sbart 13:c7b3e97f9bc6 46
sbart 14:65d6d50062ed 47 //SB - Sets the Z Threshold to 2.016g
sbart 14:65d6d50062ed 48 //The threshold values range from 1 to 127 with steps of 0.063 g/LSB
sbart 15:fb9e64c59187 49 //0x20 = 00100000 = 32 : 32 * 0.063g = 2.016g
sbart 14:65d6d50062ed 50 #define SET_THZ 0x20
scohennm 12:10e6d0d12833 51
sbart 13:c7b3e97f9bc6 52 //SB - Sets the pulse time limit to 15 ms
sbart 14:65d6d50062ed 53 //At 800Hz, the Normal time step in ms is 0.625
sbart 15:fb9e64c59187 54 //0x18 = 00011000 = 24 : 24 * 0.625ms = 15ms
sbart 14:65d6d50062ed 55 #define SET_TMLT 0x18
sbart 13:c7b3e97f9bc6 56
sbart 14:65d6d50062ed 57 //SB - By default, the data rate is set to 800Hz - Register 0x2A CTRL_REG_1
sbart 14:65d6d50062ed 58 //SB - The g sensitivty is set to 4g later in the program (line 148)
scohennm 12:10e6d0d12833 59 /*********************************************************/
scohennm 12:10e6d0d12833 60
scohennm 12:10e6d0d12833 61 //#define PRINTDBUG
scohennm 12:10e6d0d12833 62 // Accelerometer I2C pins
scohennm 12:10e6d0d12833 63 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
scohennm 12:10e6d0d12833 64 PinName const SDA = PTE25;
scohennm 12:10e6d0d12833 65 PinName const SCL = PTE24;
scohennm 12:10e6d0d12833 66 #elif defined (TARGET_KL05Z)
scohennm 12:10e6d0d12833 67 PinName const SDA = PTB4;
scohennm 12:10e6d0d12833 68 PinName const SCL = PTB3;
scohennm 12:10e6d0d12833 69 #else
scohennm 12:10e6d0d12833 70 #error TARGET NOT DEFINED
scohennm 12:10e6d0d12833 71 #endif
scohennm 12:10e6d0d12833 72
scohennm 12:10e6d0d12833 73 #define MMA8451_I2C_ADDRESS (0x1d<<1)
scohennm 12:10e6d0d12833 74
scohennm 12:10e6d0d12833 75 Ticker ledBlink; // timinginterrupt for RED led
scohennm 12:10e6d0d12833 76 InterruptIn MMA8451QInt1(PTC5); //push botton with internal pullup
scohennm 12:10e6d0d12833 77 //InterruptIn MMA8451QInt1(PTD1);
scohennm 12:10e6d0d12833 78 DigitalOut myled(LED_RED); // red led
scohennm 12:10e6d0d12833 79 DigitalOut relay(LED_GREEN); // green led
scohennm 12:10e6d0d12833 80
scohennm 12:10e6d0d12833 81 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
scohennm 12:10e6d0d12833 82
scohennm 12:10e6d0d12833 83 float delay = WAITDELAY;
scohennm 12:10e6d0d12833 84 int relayState = RELAYOFF;
scohennm 12:10e6d0d12833 85 int outState = false;
scohennm 12:10e6d0d12833 86 SLCD slcd; //define LCD display
scohennm 12:10e6d0d12833 87 char LCDMessages[2][LCDLEN] = {"TRUE", "FALS"};
scohennm 12:10e6d0d12833 88
scohennm 12:10e6d0d12833 89
scohennm 12:10e6d0d12833 90 void LCDMess(char *lMess, float dWait){
scohennm 12:10e6d0d12833 91 slcd.Home();
scohennm 12:10e6d0d12833 92 slcd.clear();
scohennm 12:10e6d0d12833 93 slcd.printf(lMess);
scohennm 12:10e6d0d12833 94 wait(dWait);
scohennm 12:10e6d0d12833 95 }
scohennm 12:10e6d0d12833 96 void LCDMessNoDwell(char *lMess){
scohennm 12:10e6d0d12833 97 slcd.Home();
scohennm 12:10e6d0d12833 98 slcd.clear();
scohennm 12:10e6d0d12833 99 slcd.printf(lMess);
scohennm 12:10e6d0d12833 100 }
scohennm 12:10e6d0d12833 101
scohennm 12:10e6d0d12833 102 // Interrupt routines
scohennm 12:10e6d0d12833 103 void LEDBlinker(){ // RED LED interrupt
scohennm 12:10e6d0d12833 104 outState = !outState;
scohennm 12:10e6d0d12833 105 myled.write(outState);
scohennm 12:10e6d0d12833 106 }
scohennm 12:10e6d0d12833 107
scohennm 12:10e6d0d12833 108 void GreenLEDBlinker(){ // Green LED interrupt
scohennm 12:10e6d0d12833 109 //uint8_t i_regData;
scohennm 12:10e6d0d12833 110 relayState = !relayState;
scohennm 12:10e6d0d12833 111 relay.write(relayState);
scohennm 12:10e6d0d12833 112 //acc.readRegs(REG_PULSE_SRC, &i_regData, 1); // Clear the tap event
scohennm 12:10e6d0d12833 113 }
scohennm 12:10e6d0d12833 114
scohennm 12:10e6d0d12833 115 // end interrupt routines
scohennm 12:10e6d0d12833 116
scohennm 12:10e6d0d12833 117 int main()
scohennm 12:10e6d0d12833 118 {
scohennm 12:10e6d0d12833 119 uint8_t regData;
scohennm 12:10e6d0d12833 120
scohennm 12:10e6d0d12833 121
scohennm 12:10e6d0d12833 122 char lcdData[LCDLEN];
scohennm 12:10e6d0d12833 123
scohennm 12:10e6d0d12833 124 myled.write(outState);
scohennm 12:10e6d0d12833 125 relay.write(relayState);
scohennm 12:10e6d0d12833 126
scohennm 12:10e6d0d12833 127 // set up interrrupts to be used later for taps
scohennm 12:10e6d0d12833 128 MMA8451QInt1.rise(&GreenLEDBlinker);
scohennm 12:10e6d0d12833 129 MMA8451QInt1.mode(PullNone);
scohennm 12:10e6d0d12833 130
scohennm 12:10e6d0d12833 131 // set up interrrupts to be used later for taps
scohennm 12:10e6d0d12833 132 ledBlink.attach(&LEDBlinker, LEDDELAY);
scohennm 12:10e6d0d12833 133
scohennm 12:10e6d0d12833 134 // Read Pulse Source Data and check to see if things have been set
scohennm 12:10e6d0d12833 135 acc.readRegs(REG_PULSE_CFG, &regData, 1); // check it
scohennm 12:10e6d0d12833 136 sprintf (lcdData,"%x",regData);
scohennm 12:10e6d0d12833 137 LCDMess(lcdData,BLINKTIME);
scohennm 12:10e6d0d12833 138
scohennm 12:10e6d0d12833 139 // *********** Initialize for tap tecognition ***********
scohennm 12:10e6d0d12833 140 regData = LATCH_DATA | AXIS_DATA;
scohennm 12:10e6d0d12833 141 acc.setRegisterInStandby(REG_PULSE_CFG, regData); // write the data
scohennm 12:10e6d0d12833 142 acc.readRegs(REG_PULSE_CFG, &regData, 1); // check it
scohennm 12:10e6d0d12833 143 sprintf (lcdData,"%x",regData);
scohennm 12:10e6d0d12833 144 LCDMess(lcdData,BLINKTIME);
scohennm 12:10e6d0d12833 145
sbart 13:c7b3e97f9bc6 146 // Check to see if accelerometer is alive and well
sbart 13:c7b3e97f9bc6 147
sbart 13:c7b3e97f9bc6 148 acc.setGLimit(MAX_4G); //SB - sets the g sensitivity to 4g
sbart 13:c7b3e97f9bc6 149
scohennm 12:10e6d0d12833 150 acc.readRegs(XYZ_DATA_CFG, &regData, 1);
scohennm 12:10e6d0d12833 151 sprintf (lcdData,"%x",regData); // Note displaying in hexidecimal
scohennm 12:10e6d0d12833 152 LCDMess(lcdData,BLINKTIME);
scohennm 12:10e6d0d12833 153
scohennm 12:10e6d0d12833 154 // Setup single-tap pulse prarameters.
scohennm 12:10e6d0d12833 155 acc.setRegisterInStandby(REG_PULSE_THSZ, SET_THZ); // write the data
sbart 13:c7b3e97f9bc6 156 acc.setRegisterInStandby(REG_PULSE_TMLT, SET_TMLT); // write the data
scohennm 12:10e6d0d12833 157
scohennm 12:10e6d0d12833 158 // Set up (pulse) interrupt to INT1 pin
scohennm 12:10e6d0d12833 159 acc.setRegisterInStandby(REG_CTRL_4, SET_INTERRUPT); // write the data
scohennm 12:10e6d0d12833 160 acc.setRegisterInStandby(REG_CTRL_5, SET_INT_LINE); // write the data
sbart 13:c7b3e97f9bc6 161 // End of setup
scohennm 12:10e6d0d12833 162
scohennm 12:10e6d0d12833 163 acc.readRegs(REG_WHO_AM_I, &regData, 1);
scohennm 12:10e6d0d12833 164 sprintf (lcdData,"%x",regData);
scohennm 12:10e6d0d12833 165 LCDMess(lcdData,BLINKTIME);
scohennm 12:10e6d0d12833 166
scohennm 12:10e6d0d12833 167
scohennm 12:10e6d0d12833 168 while (true) {
scohennm 12:10e6d0d12833 169 acc.readRegs(REG_PULSE_SRC, &regData, 1);
scohennm 12:10e6d0d12833 170 sprintf (lcdData,"%x",regData);
scohennm 12:10e6d0d12833 171 LCDMess(lcdData,BLINKTIME);
scohennm 12:10e6d0d12833 172 LCDMessNoDwell(LCDMessages[relayState]);
scohennm 12:10e6d0d12833 173 wait(delay);
scohennm 12:10e6d0d12833 174 }
scohennm 12:10e6d0d12833 175 }