MMA8452 3 axis accelerometer.
Dependencies: MMA8452 N5110 mbed
main.cpp
- Committer:
- a1163480319
- Date:
- 2015-05-10
- Revision:
- 2:a659621a83b0
- Parent:
- 0:bfe6cbe4dd56
File content as of revision 2:a659621a83b0:
#include "mbed.h" #include "N5110.h" #include "MMA8452.h" N5110 lcd(p7,p8,p9,p10,p11,p13,p26); MMA8452 mma8452(p28,p27); // SDA, SCL Serial serial(USBTX,USBRX);//serial port InterruptIn button(p17);//button BusOut leds(p24);//led Ticker buzzer_timer;//buzzer timer PwmOut buzzer(p21);//buzzer AnalogIn pot(p20); /* Potentiometer middle pin connected to P0_11, other two ends connected to GND and 3.3V */ int fsm[4] = {1,2,4,8}; // simple FSM counter has 4 states int state = 0; // initial state 0 // defines for direction #define UP 0 #define DOWN 1 #define MID 2 int direction = UP; // initially count up float frequency=659; int k=0; void buttonPressed() // toggle direction in ISR { k++; direction=k%3; } int main() { lcd.init(); mma8452.init(); // 100 Hz update rate, ±4g scale float ain; Acceleration acceleration; // Accleration structure declared in MMA8452 class button.rise(&buttonPressed); // Use internal pullup for pushbutton wait(.001);// Delay for initial pullup to take effect while(1) { acceleration = mma8452.readValues();// read current values and print over serial port //calculate the angle float angleX = atan(acceleration.x/sqrt(pow(acceleration.y,2)+pow(acceleration.z,2)))*64; float angleY = atan(acceleration.y/sqrt(pow(acceleration.x,2)+pow(acceleration.z,2)))*64; float angleZ = atan(acceleration.z/sqrt(pow(acceleration.y,2)+pow(acceleration.x,2)))*64; //store the acceleration data char buffer1[14]; int length = sprintf(buffer1,"x = %.2f g",acceleration.x); char buffer2[14]; length = sprintf(buffer2,"y = %.2f g",acceleration.y); char buffer3[14]; length = sprintf(buffer3,"z = %.2f g",acceleration.z); //store angle data char buffer4[14]; length = sprintf(buffer4,"X=%.3gDegree",angleX); char buffer5[14]; length = sprintf(buffer5,"Y=%.3gDegree",angleY); char buffer6[14]; length = sprintf(buffer6,"Z=%.3gDegree",angleZ); char buffer7[14]; length = sprintf(buffer7,"ACCELEROMETER"); char buffer8[14]; length = sprintf(buffer8,"PROTRACTOR"); char buffer9[14]; length = sprintf(buffer9,"Y"); char buffer10[14]; length = sprintf(buffer10,"X"); wait(0.1); lcd.clear(); if (angleY>=90||angleY<=-90||angleX>=90||angleX<=-90){ buzzer.period(1/frequency); // set PWM period buzzer=0.5; // set duty cycle } else { buzzer.period(1/frequency); // set PWM period buzzer=0; // set duty cycle } switch(direction)//button case when pressed { case UP://first pressed direction = 0; lcd.printString(buffer7,4,0); lcd.printString(buffer1,3,2); lcd.printString(buffer2,3,3); lcd.printString(buffer3,3,4); break; case DOWN://second pressed direction = 1; lcd.printString(buffer8,13,0); lcd.printString(buffer4,3,2); lcd.printString(buffer5,3,3); lcd.printString(buffer6,3,4); break; case MID://third presssed direction = 2; // x0,y0,x1,y1,type 0-white,1-black,2-dotted lcd.drawLine(0,23,83,23,1); lcd.drawLine(41,0,41,48,1); lcd.drawLine(64,0,17,47,1); lcd.drawLine(18,0,65,47,1); lcd.drawCircle(41,23,13,0); // x,y,radius,black fill lcd.drawCircle(41,23,25,0); if (angleX<0||angleY>0){ //move right and forward lcd.setPixel(41-angleX/3.6,23+angleY/3.6); lcd.setPixel(41-angleX/3.6,22+angleY/3.6); lcd.setPixel(41-angleX/3.6,24+angleY/3.6); lcd.setPixel(42-angleX/3.6,23+angleY/3.6); lcd.setPixel(40-angleX/3.6,23+angleY/3.6); } lcd.refresh(); if (angleX>0||angleY>0) //move left and backward { lcd.setPixel(41-angleX/3.6,23+angleY/3.6); lcd.setPixel(41-angleX/3.6,22+angleY/3.6); lcd.setPixel(41-angleX/3.6,24+angleY/3.6); lcd.setPixel(40-angleX/3.6,23+angleY/3.6); lcd.setPixel(42-angleX/3.6,23+angleY/3.6); lcd.refresh(); } lcd.printString(buffer9,35,0); lcd.printString(buffer10,75,2); break; default: break; } leds=1; ain = pot.read(); /* Read analog value (output will be any value between 0 and 1 */ lcd.setBrightness(ain); //tune the screen brightness lcd.refresh(); } }