Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MMA8451Q SLCD_degrees mbed
Fork of ACC_LCD_341_trig by
acc_angles.cpp
- Committer:
- scohennm
- Date:
- 2017-02-15
- Revision:
- 6:238277171159
- Parent:
- 5:75c5e67ef9f1
File content as of revision 6:238277171159:
#include "mbed.h"
#include <math.h>
#include "MMA8451Q.h"
#include "SLCD.h"
#define NUMAXES 3
#define XAXIS 0
#define YAXIS 1
#define ZAXIS 2
#define NUMBUTS 2
#define LBUT PTC12 // port addresses for buttons
#define RBUT PTC3
#define BUTTONTIME 0.200
#define DATAINTERVAL 0.200
#define LCDWAIT 1.5
#define LCDDATALEN 10
#define PI 3.14159265
#define PITODEG 180.0
#define PROGNAME "ACC_LCD_all_axes_v1\r\n"
#define PRINTDBUG
//
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
PinName const SDA = PTE25; // Data pins for the accelerometer/magnetometer.
PinName const SCL = PTE24; // DO NOT CHANGE
#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
char lcdData[LCDDATALEN]; //buffer needs places dor decimal pt and colon
int currentAxis = XAXIS; // xaxis
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
Serial pc(USBTX, USBRX);
Timer dataTimer;
Timer ButtonTimer; // for reading button states
DigitalIn buttons[NUMBUTS] = {RBUT, LBUT}; // set up buttons
char axisName[NUMAXES][LCDDATALEN] = {"<X<","<Y<", "<Z<"};
void LCDMess(char *lMess){
slcd.Home();
slcd.clear();
slcd.printf(lMess);
}
void LCDsignedFloat(float theNumber){
sprintf (lcdData," %3.2f",theNumber);
// changed SLCD.cpp to interpret < as -
if (theNumber < 0.0) sprintf (lcdData,"<%3.2f",fabs(theNumber));
LCDMess(lcdData);
}
void LCDsignedAngle(float theAngle){
sprintf (lcdData," %2.0f@",theAngle);
// changed SLCD.cpp to interpret < as -
if (theAngle < 0.0) sprintf (lcdData,"<%2.0f@",fabs(theAngle));
LCDMess(lcdData);
}
void initialize_global_vars(){
pc.printf(PROGNAME);
// set up DAQ timers
ButtonTimer.start();
ButtonTimer.reset();
dataTimer.start();
dataTimer.reset();
LCDMess(axisName[currentAxis]);
wait(LCDWAIT);
}
int main() {
int i; // loop index
float axisValue[NUMAXES];
float angleValue[NUMAXES];
int buttonSum = 0;
initialize_global_vars();
// main loop forever
while(true) {
while (ButtonTimer > BUTTONTIME){
buttonSum = 0;
buttonSum = !buttons[0] + !buttons[1];
if (buttonSum != 0) {
currentAxis = (currentAxis + 1 ) % NUMAXES;
LCDMess(axisName[currentAxis]);
wait(LCDWAIT);
}// for loop to look at buttons
ButtonTimer.reset();
}
while (dataTimer.read() > DATAINTERVAL){
dataTimer.reset();
axisValue[XAXIS]= acc.getAccX();
axisValue[YAXIS] = acc.getAccY();
axisValue[ZAXIS] = acc.getAccZ();
#ifdef PRINTDBUG
for (i=0; i< NUMAXES;i++){
pc.printf("Acc %d = %f\r\n",i, axisValue[i]);
}
#endif
if(fabs(axisValue[currentAxis]) > 1.0) axisValue[currentAxis] = 1.0;
angleValue[currentAxis] = acos(axisValue[currentAxis]) * PITODEG / PI;
LCDsignedAngle(angleValue[currentAxis]);
//LCDsignedFloat(axisValue[currentAxis]);
}
}
}
