Accelerometer and angle meter

Dependencies:   Beep mbed

Files at this revision

API Documentation at this revision

Comitter:
shangtianting
Date:
Sun May 10 00:23:23 2015 +0000
Commit message:
Accelerometer and angle meter

Changed in this revision

Beep.lib Show annotated file Show diff for this revision Revisions of this file
MMA8452.h Show annotated file Show diff for this revision Revisions of this file
N5110.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a57e07e44ab0 Beep.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Beep.lib	Sun May 10 00:23:23 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/shimniok/code/Beep/#3eb39e374fc3
diff -r 000000000000 -r a57e07e44ab0 MMA8452.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8452.h	Sun May 10 00:23:23 2015 +0000
@@ -0,0 +1,110 @@
+/**
+@file MMA8452.h
+ 
+@brief Header file containing member functions and variables
+ 
+*/
+ 
+#ifndef MMA8452_H
+#define MMA8452_H
+ 
+// MMA8452 address is 0x1D by default (see EAGLE schematic of breakout - SA = 1)
+#define MMA8452_W_ADDRESS   0x3A
+#define MMA8452_R_ADDRESS   0x3B
+// Register Descriptions - p18 datasheet
+#define OUT_X_MSB           0x01
+#define WHO_AM_I            0x0D
+#define CTRL_REG1           0x2A
+#define XYZ_DATA_CFG        0x0E
+ 
+typedef struct Acceleration Acceleration;
+struct Acceleration {
+    float x;
+    float y;
+    float z;
+};
+ 
+#include "mbed.h"
+ 
+/**
+@brief Library for interfacing with MMA8452 I2C Accelerometer
+ 
+@see http://www.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf
+@see https://www.sparkfun.com/products/12756
+ 
+@brief Revision 1.0
+ 
+@author Craig A. Evans
+@date   March 2015
+ *
+ * Example:
+ * @code
+ 
+#include "mbed.h"
+#include "MMA8452.h"
+ 
+MMA8452 mma8452(p28,p27);  // SDA, SCL
+Serial serial(USBTX,USBRX);
+ 
+int main() {
+ 
+    mma8452.init();  // 100 Hz update rate, ±4g scale
+ 
+    Acceleration acceleration;  // Accleration structure declared in MMA8452 class
+ 
+    while(1) {
+ 
+        acceleration = mma8452.readValues();   // read current values and print over serial port
+        serial.printf("x = %.2f g y = %.2f g z = %.2f g\n",acceleration.x,acceleration.y,acceleration.z);
+        wait(0.1);   // short delay until next reading
+ 
+    }
+ 
+}
+ 
+ 
+ * @endcode
+ */
+class MMA8452
+{
+ 
+public:
+    /** Create a MMA8452 object connected to the specified pins
+    *
+    * @param sdaPin - mbed SDA pin
+    * @param sclPin - mbed SCL pin
+    *
+    */
+    MMA8452(PinName sdaPin, PinName sclPin);
+ 
+    /** Initialise accelerometer
+    *
+    *   Powers up the accelerometer, sets 100 Hz update rate and ±4g scale
+    */
+    void init();
+ 
+    /** Get values of acceleration
+    *
+    *   Reads the x,y,z values in g's
+    *   @returns an Acceleration structure with x,y,z members (float)
+    */
+    Acceleration readValues();
+ 
+ 
+private:
+    void sendByteToRegister(char byte,char reg);
+    char readByteFromRegister(char reg);
+    void readBytesFromRegister(char reg,int numberOfBytes,char bytes[]);
+    void error();
+ 
+public:
+ 
+private:  // private variables
+    I2C*    i2c;
+    BusOut*  leds;
+ 
+};
+ 
+ 
+ 
+#endif
\ No newline at end of file
diff -r 000000000000 -r a57e07e44ab0 N5110.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/N5110.h	Sun May 10 00:23:23 2015 +0000
@@ -0,0 +1,442 @@
+/**
+@file N5110.h
+ 
+@brief Header file containing member functions and variables
+ 
+*/
+ 
+#ifndef N5110_H
+#define N5110_H
+ 
+// Command Bytes - taken from Chris Yan's library
+// More information can be found in the display datasheet
+// H = 0 - Basic instructions
+#define CMD_DC_CLEAR_DISPLAY   0x08
+#define CMD_DC_NORMAL_MODE     0x0C
+#define CMD_DC_FILL_DISPLAY    0x09
+#define CMD_DC_INVERT_VIDEO    0x0D
+#define CMD_FS_HORIZONTAL_MODE 0x00
+#define CMD_FS_VERTICAL_MODE   0x02
+#define CMD_FS_BASIC_MODE      0x00
+#define CMD_FS_EXTENDED_MODE   0x01
+#define CMD_FS_ACTIVE_MODE     0x00
+#define CMD_FS_POWER_DOWN_MODE 0x04
+// H = 1 - Extended instructions
+#define CMD_TC_TEMP_0          0x04
+#define CMD_TC_TEMP_1          0x05
+#define CMD_TC_TEMP_2          0x06
+#define CMD_TC_TEMP_3          0x07
+#define CMD_BI_MUX_24          0x15
+#define CMD_BI_MUX_48          0x13
+#define CMD_BI_MUX_100         0x10
+#define CMD_VOP_6V06           0xB2
+#define CMD_VOP_7V38           0xC8
+ 
+// number of pixels on display
+#define WIDTH 84
+#define HEIGHT 48
+#define BANKS 6
+ 
+#include "mbed.h"
+ 
+/**
+@brief Library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed.
+@brief The display is powered from a GPIO pin meaning it can be controlled via software.  The LED backlight is also software-controllable (via PWM pin).
+@brief Can print characters and strings to the display using the included 5x7 font.
+@brief The library also implements a screen buffer so that individual pixels on the display (84 x 48) can be set, cleared and read.
+@brief The library can print primitive shapes (lines, circles, rectangles)
+@brief Acknowledgements to Chris Yan's Nokia_5110 Library.
+ 
+@brief Revision 1.2
+ 
+@author Craig A. Evans
+@date   17th March 2015
+ *
+ * Example:
+ * @code
+ 
+#include "mbed.h"
+#include "N5110.h"
+ 
+//    VCC,SCE,RST,D/C,MOSI,SCLK,LED
+N5110 lcd(p7,p8,p9,p10,p11,p13,p21);
+// Can also power (VCC) directly from VOUT (3.3 V) -
+// Can give better performance due to current limitation from GPIO pin
+ 
+int main()
+{
+    // first need to initialise display
+    lcd.init();
+ 
+    while(1) {
+ 
+        // these are default settings so not strictly needed
+        lcd.normalMode();      // normal colour mode
+        lcd.setBrightness(0.5); // put LED backlight on 50%
+ 
+        // can directly print strings at specified co-ordinates
+        lcd.printString("Hello, World!",0,0);
+ 
+        char buffer[14];  // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
+        // so can display a string of a maximum 14 characters in length
+        // or create formatted strings - ensure they aren't more than 14 characters long
+        int temperature = 27;
+        int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer
+        // it is important the format specifier ensures the length will fit in the buffer
+        if (length <= 14)  // if string will fit on display
+            lcd.printString(buffer,0,1);           // display on screen
+ 
+        float pressure = 1012.3;  // same idea with floats
+        length = sprintf(buffer,"P = %.2f mb",pressure);
+        if (length <= 14)
+            lcd.printString(buffer,0,2);
+ 
+        // can also print individual characters at specified place
+        lcd.printChar('X',5,3);
+ 
+        // draw a line across the display at y = 40 pixels (origin top-left)
+        for (int i = 0; i < WIDTH; i++) {
+            lcd.setPixel(i,40);
+        }
+        // need to refresh display after setting pixels
+        lcd.refresh();
+ 
+        // can also check status of pixels using getPixel(x,y)
+ 
+        wait(5.0);
+        lcd.clear();            // clear display
+        lcd.inverseMode();      // invert colours
+        lcd.setBrightness(1.0); // put LED backlight on full
+ 
+        float array[84];
+ 
+        for (int i = 0; i < 84; i++) {
+            array[i] = 0.5 + 0.5*sin(i*2*3.14/84);
+        }
+ 
+        // can also plot graphs - 84 elements only
+        // values must be in range 0.0 - 1.0
+        lcd.plotArray(array);
+        wait(5.0);
+        lcd.clear();
+        lcd.normalMode();      // normal colour mode back
+        lcd.setBrightness(0.5); // put LED backlight on 50%
+ 
+        // example of drawing lines
+        for (int x = 0; x < WIDTH ; x+=10) {
+            // x0,y0,x1,y1,type 0-white,1-black,2-dotted
+            lcd.drawLine(0,0,x,HEIGHT,2);
+        }
+        lcd.refresh();   // need to refresh screen after drawing lines
+ 
+        wait(5.0);
+        lcd.clear();
+ 
+        // example of how to draw circles
+        lcd.drawCircle(WIDTH/2,HEIGHT/2,20,1);  // x,y,radius,black fill
+        lcd.drawCircle(WIDTH/2,HEIGHT/2,10,2);  // x,y,radius,white fill
+        lcd.drawCircle(WIDTH/2,HEIGHT/2,30,0);  // x,y,radius,transparent with outline
+        lcd.refresh();   // need to refresh screen after drawing circles
+ 
+        wait(5.0);
+        lcd.clear();
+ 
+        // example of how to draw rectangles
+        //          origin x,y,width,height,type
+        lcd.drawRect(10,10,50,30,1);  // filled black rectangle
+        lcd.drawRect(15,15,20,10,2);  // filled white rectange (no outline)
+        lcd.drawRect(2,2,70,40,0);    // transparent, just outline
+        lcd.refresh();   // need to refresh screen after drawing rects
+ 
+ 
+        wait(5.0);
+        lcd.clear();
+ 
+    }
+}
+ 
+ 
+ * @endcode
+ */
+class N5110
+{
+ 
+public:
+    /** Create a N5110 object connected to the specified pins
+    *
+    * @param pwr Pin connected to Vcc on the LCD display (pin 1)
+    * @param sce Pin connected to chip enable (pin 3)
+    * @param rst Pin connected to reset (pin 4)
+    * @param dc  Pin connected to data/command select (pin 5)
+    * @param mosi Pin connected to data input (MOSI) (pin 6)
+    * @param sclk Pin connected to serial clock (SCLK) (pin 7)
+    * @param led Pin connected to LED backlight (must be PWM) (pin 8)
+    *
+    */
+    N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin);
+ 
+    /** Initialise display
+    *
+    *   Powers up the display and turns on backlight (50% brightness default).
+    *   Sets the display up in horizontal addressing mode and with normal video mode.
+    */
+    void init();
+ 
+    /** Turn off
+    *
+    *   Powers down the display and turns of the backlight.
+    *   Needs to be reinitialised before being re-used.
+    */
+    void turnOff();
+ 
+    /** Clears
+    *
+    *   Clears the screen.
+    */
+    void clear();
+ 
+    /** Turn on normal video mode (default)
+    *  Black on white
+    */
+    void normalMode();
+ 
+    /** Turn on inverse video mode (default)
+    *  White on black
+    */
+    void inverseMode();
+ 
+    /** Set Brightness
+    *
+    *   Sets brightness of LED backlight.
+    *   @param brightness - float in range 0.0 to 1.0
+    */
+    void setBrightness(float brightness);
+ 
+    /** Print String
+    *
+    *   Prints a string of characters to the display. String is cut-off after the 83rd pixel.
+    *   @param x - the column number (0 to 83)
+    *   @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
+    */
+    void printString(const char * str,int x,int y);
+ 
+    /** Print Character
+    *
+    *   Sends a character to the display.  Printed at the specified location. Character is cut-off after the 83rd pixel.
+    *   @param  c - the character to print. Can print ASCII as so printChar('C').
+    *   @param x - the column number (0 to 83)
+    *   @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
+    */
+    void printChar(char c,int x,int y);
+ 
+    /** Set a Pixel
+    *
+    *   This function sets a pixel in the display. A call to refresh() must be made
+    *   to update the display to reflect the change in pixels.
+    *   @param  x - the x co-ordinate of the pixel (0 to 83)
+    *   @param  y - the y co-ordinate of the pixel (0 to 47)
+    */
+    void setPixel(int x, int y);
+ 
+    /** Clear a Pixel
+    *
+    *   This function clears pixel in the display. A call to refresh() must be made
+    *   to update the display to reflect the change in pixels.
+    *   @param  x - the x co-ordinate of the pixel (0 to 83)
+    *   @param  y - the y co-ordinate of the pixel (0 to 47)
+    */
+    void clearPixel(int x, int y);
+ 
+    /** Get a Pixel
+    *
+    *   This function gets the status of a pixel in the display.
+    *   @param  x - the x co-ordinate of the pixel (0 to 83)
+    *   @param  y - the y co-ordinate of the pixel (0 to 47)
+    *   @returns
+    *       0           - pixel is clear
+    *       non-zero    - pixel is set
+    */
+    int getPixel(int x, int y);
+ 
+    /** Refresh display
+    *
+    *   This functions refreshes the display to reflect the current data in the buffer.
+    */
+    void refresh();
+ 
+    /** Randomise buffer
+    *
+    *   This function fills the buffer with random data.  Can be used to test the display.
+    *   A call to refresh() must be made to update the display to reflect the change in pixels.
+    *   The seed is not set and so the generated pattern will probably be the same each time.
+    *   TODO: Randomise the seed - maybe using the noise on the AnalogIn pins.
+    */
+    void randomiseBuffer();
+ 
+    /** Plot Array
+    *
+    *   This function plots a one-dimensional array on the display.
+    *   @param array[] - y values of the plot. Values should be normalised in the range 0.0 to 1.0. First 84 plotted.
+    */
+    void plotArray(float array[]);
+ 
+    /** Draw Circle
+    *
+    *   This function draws a circle at the specified origin with specified radius to the display.
+    *   Uses the midpoint circle algorithm.
+    *   @see http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
+    *   @param  x0 - x-coordinate of centre
+    *   @param  y0 - y-coordinate of centre
+    *   @param  radius - radius of circle in pixels
+    *   @param  fill - 0 transparent (w/outline), 1 filled black, 2 filled white (wo/outline)
+    */
+    void drawCircle(int x0,int y0,int radius,int fill);
+ 
+    /** Draw Line
+    *
+    *   This function draws a line between the specified points using linear interpolation.
+    *   @param  x0 - x-coordinate of first point
+    *   @param  y0 - y-coordinate of first point
+    *   @param  x1 - x-coordinate of last point
+    *   @param  y1 - y-coordinate of last point
+    *   @param  type - 0 white,1 black,2 dotted
+    */
+    void drawLine(int x0,int y0,int x1,int y1,int type);
+ 
+    /** Draw Rectangle
+    *
+    *   This function draws a rectangle.
+    *   @param  x0 - x-coordinate of origin (top-left)
+    *   @param  y0 - y-coordinate of origin (top-left)
+    *   @param  width - width of rectangle
+    *   @param  height - height of rectangle
+    *   @param  fill - 0 transparent (w/outline), 1 filled black, 2 filled white (wo/outline)
+    */
+    void drawRect(int x0,int y0,int width,int height,int fill);
+ 
+ 
+private:
+ 
+    void setXYAddress(int x, int y);
+    void initSPI();
+    void turnOn();
+    void reset();
+    void clearRAM();
+    void clearBuffer();
+    void sendCommand(unsigned char command);
+    void sendData(unsigned char data);
+ 
+public:
+    unsigned char buffer[84][6];  // screen buffer - the 6 is for the banks - each one is 8 bits;
+ 
+private:  // private variables
+    SPI*    spi;
+    PwmOut* led;
+    DigitalOut* pwr;
+    DigitalOut* sce;
+    DigitalOut* rst;
+    DigitalOut* dc;
+ 
+};
+ 
+const unsigned char font5x7[480] = {
+    0x00, 0x00, 0x00, 0x00, 0x00,// (space)
+    0x00, 0x00, 0x5F, 0x00, 0x00,// !
+    0x00, 0x07, 0x00, 0x07, 0x00,// "
+    0x14, 0x7F, 0x14, 0x7F, 0x14,// #
+    0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
+    0x23, 0x13, 0x08, 0x64, 0x62,// %
+    0x36, 0x49, 0x55, 0x22, 0x50,// &
+    0x00, 0x05, 0x03, 0x00, 0x00,// '
+    0x00, 0x1C, 0x22, 0x41, 0x00,// (
+    0x00, 0x41, 0x22, 0x1C, 0x00,// )
+    0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
+    0x08, 0x08, 0x3E, 0x08, 0x08,// +
+    0x00, 0x50, 0x30, 0x00, 0x00,// ,
+    0x08, 0x08, 0x08, 0x08, 0x08,// -
+    0x00, 0x60, 0x60, 0x00, 0x00,// .
+    0x20, 0x10, 0x08, 0x04, 0x02,// /
+    0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
+    0x00, 0x42, 0x7F, 0x40, 0x00,// 1
+    0x42, 0x61, 0x51, 0x49, 0x46,// 2
+    0x21, 0x41, 0x45, 0x4B, 0x31,// 3
+    0x18, 0x14, 0x12, 0x7F, 0x10,// 4
+    0x27, 0x45, 0x45, 0x45, 0x39,// 5
+    0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
+    0x01, 0x71, 0x09, 0x05, 0x03,// 7
+    0x36, 0x49, 0x49, 0x49, 0x36,// 8
+    0x06, 0x49, 0x49, 0x29, 0x1E,// 9
+    0x00, 0x36, 0x36, 0x00, 0x00,// :
+    0x00, 0x56, 0x36, 0x00, 0x00,// ;
+    0x00, 0x08, 0x14, 0x22, 0x41,// <
+    0x14, 0x14, 0x14, 0x14, 0x14,// =
+    0x41, 0x22, 0x14, 0x08, 0x00,// >
+    0x02, 0x01, 0x51, 0x09, 0x06,// ?
+    0x32, 0x49, 0x79, 0x41, 0x3E,// @
+    0x7E, 0x11, 0x11, 0x11, 0x7E,// A
+    0x7F, 0x49, 0x49, 0x49, 0x36,// B
+    0x3E, 0x41, 0x41, 0x41, 0x22,// C
+    0x7F, 0x41, 0x41, 0x22, 0x1C,// D
+    0x7F, 0x49, 0x49, 0x49, 0x41,// E
+    0x7F, 0x09, 0x09, 0x01, 0x01,// F
+    0x3E, 0x41, 0x41, 0x51, 0x32,// G
+    0x7F, 0x08, 0x08, 0x08, 0x7F,// H
+    0x00, 0x41, 0x7F, 0x41, 0x00,// I
+    0x20, 0x40, 0x41, 0x3F, 0x01,// J
+    0x7F, 0x08, 0x14, 0x22, 0x41,// K
+    0x7F, 0x40, 0x40, 0x40, 0x40,// L
+    0x7F, 0x02, 0x04, 0x02, 0x7F,// M
+    0x7F, 0x04, 0x08, 0x10, 0x7F,// N
+    0x3E, 0x41, 0x41, 0x41, 0x3E,// O
+    0x7F, 0x09, 0x09, 0x09, 0x06,// P
+    0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
+    0x7F, 0x09, 0x19, 0x29, 0x46,// R
+    0x46, 0x49, 0x49, 0x49, 0x31,// S
+    0x01, 0x01, 0x7F, 0x01, 0x01,// T
+    0x3F, 0x40, 0x40, 0x40, 0x3F,// U
+    0x1F, 0x20, 0x40, 0x20, 0x1F,// V
+    0x7F, 0x20, 0x18, 0x20, 0x7F,// W
+    0x63, 0x14, 0x08, 0x14, 0x63,// X
+    0x03, 0x04, 0x78, 0x04, 0x03,// Y
+    0x61, 0x51, 0x49, 0x45, 0x43,// Z
+    0x00, 0x00, 0x7F, 0x41, 0x41,// [
+    0x02, 0x04, 0x08, 0x10, 0x20,// "\"
+    0x41, 0x41, 0x7F, 0x00, 0x00,// ]
+    0x04, 0x02, 0x01, 0x02, 0x04,// ^
+    0x40, 0x40, 0x40, 0x40, 0x40,// _
+    0x00, 0x01, 0x02, 0x04, 0x00,// `
+    0x20, 0x54, 0x54, 0x54, 0x78,// a
+    0x7F, 0x48, 0x44, 0x44, 0x38,// b
+    0x38, 0x44, 0x44, 0x44, 0x20,// c
+    0x38, 0x44, 0x44, 0x48, 0x7F,// d
+    0x38, 0x54, 0x54, 0x54, 0x18,// e
+    0x08, 0x7E, 0x09, 0x01, 0x02,// f
+    0x08, 0x14, 0x54, 0x54, 0x3C,// g
+    0x7F, 0x08, 0x04, 0x04, 0x78,// h
+    0x00, 0x44, 0x7D, 0x40, 0x00,// i
+    0x20, 0x40, 0x44, 0x3D, 0x00,// j
+    0x00, 0x7F, 0x10, 0x28, 0x44,// k
+    0x00, 0x41, 0x7F, 0x40, 0x00,// l
+    0x7C, 0x04, 0x18, 0x04, 0x78,// m
+    0x7C, 0x08, 0x04, 0x04, 0x78,// n
+    0x38, 0x44, 0x44, 0x44, 0x38,// o
+    0x7C, 0x14, 0x14, 0x14, 0x08,// p
+    0x08, 0x14, 0x14, 0x18, 0x7C,// q
+    0x7C, 0x08, 0x04, 0x04, 0x08,// r
+    0x48, 0x54, 0x54, 0x54, 0x20,// s
+    0x04, 0x3F, 0x44, 0x40, 0x20,// t
+    0x3C, 0x40, 0x40, 0x20, 0x7C,// u
+    0x1C, 0x20, 0x40, 0x20, 0x1C,// v
+    0x3C, 0x40, 0x30, 0x40, 0x3C,// w
+    0x44, 0x28, 0x10, 0x28, 0x44,// x
+    0x0C, 0x50, 0x50, 0x50, 0x3C,// y
+    0x44, 0x64, 0x54, 0x4C, 0x44,// z
+    0x00, 0x08, 0x36, 0x41, 0x00,// {
+    0x00, 0x00, 0x7F, 0x00, 0x00,// |
+    0x00, 0x41, 0x36, 0x08, 0x00,// }
+    0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
+    0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
+};
+ 
+#endif
+ 
\ No newline at end of file
diff -r 000000000000 -r a57e07e44ab0 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun May 10 00:23:23 2015 +0000
@@ -0,0 +1,696 @@
+/**
+@file N5110.cpp
+ 
+@brief Member functions implementations
+ 
+*/
+#include "mbed.h"
+#include "N5110.h"
+#include "MMA8452.h"
+#include "Beep.h"
+ 
+ 
+N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
+{
+ 
+    spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
+    initSPI();
+ 
+    // set up pins as required
+    led = new PwmOut(ledPin);
+    pwr = new DigitalOut(pwrPin);
+    sce = new DigitalOut(scePin);
+    rst = new DigitalOut(rstPin);
+    dc = new DigitalOut(dcPin);
+ 
+}
+ 
+// initialise function - powers up and sends the initialisation commands
+void N5110::init()
+{
+    turnOn();     // power up
+    wait_ms(10);  // small delay seems to prevent spurious pixels during mbed reset
+    reset();      // reset LCD - must be done within 100 ms
+ 
+    // function set - extended
+    sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
+    // Don't completely understand these parameters - they seem to work as they are
+    // Consult the datasheet if you need to change them
+    sendCommand(CMD_VOP_7V38);    // operating voltage - these values are from Chris Yan's Library
+    sendCommand(CMD_TC_TEMP_2);   // temperature control
+    sendCommand(CMD_BI_MUX_48);   // bias
+ 
+    // function set - basic
+    sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
+    normalMode();  // normal video mode by default
+    sendCommand(CMD_DC_NORMAL_MODE);  // black on white
+ 
+    // RAM is undefined at power-up so clear
+    clearRAM();
+ 
+}
+ 
+// sets normal video mode (black on white)
+void N5110::normalMode()
+{
+    sendCommand(CMD_DC_NORMAL_MODE);
+ 
+}
+ 
+// sets normal video mode (white on black)
+void N5110::inverseMode()
+{
+    sendCommand(CMD_DC_INVERT_VIDEO);
+}
+ 
+// function to power up the LCD and backlight
+void N5110::turnOn()
+{
+    // set brightness of LED - 0.0 to 1.0 - default is 50%
+    setBrightness(0.5);
+    pwr->write(1);  // apply power
+}
+ 
+// function to power down LCD
+void N5110::turnOff()
+{
+    setBrightness(0.0);  // turn backlight off
+    clearRAM();   // clear RAM to ensure specified current consumption
+    // send command to ensure we are in basic mode
+    sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
+    // clear the display
+    sendCommand(CMD_DC_CLEAR_DISPLAY);
+    // enter the extended mode and power down
+    sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
+    // small delay and then turn off the power pin
+    wait_ms(10);
+    pwr->write(0);
+ 
+}
+ 
+// function to change LED backlight brightness
+void N5110::setBrightness(float brightness)
+{
+    // check whether brightness is within range
+    if (brightness < 0.0)
+        brightness = 0.0;
+    if (brightness > 1.0)
+        brightness = 1.0;
+    // set PWM duty cycle
+    led->write(brightness);
+}
+ 
+ 
+// pulse the active low reset line
+void N5110::reset()
+{
+    rst->write(0);  // reset the LCD
+    rst->write(1);
+}
+ 
+// function to initialise SPI peripheral
+void N5110::initSPI()
+{
+    spi->format(8,1);    // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
+    spi->frequency(4000000);  // maximum of screen is 4 MHz
+}
+ 
+// send a command to the display
+void N5110::sendCommand(unsigned char command)
+{
+    dc->write(0);  // set DC low for command
+    sce->write(0); // set CE low to begin frame
+    spi->write(command);  // send command
+    dc->write(1);  // turn back to data by default
+    sce->write(1); // set CE high to end frame (expected for transmission of single byte)
+ 
+}
+ 
+// send data to the display at the current XY address
+// dc is set to 1 (i.e. data) after sending a command and so should
+// be the default mode.
+void N5110::sendData(unsigned char data)
+{
+    sce->write(0);   // set CE low to begin frame
+    spi->write(data);
+    sce->write(1);  // set CE high to end frame (expected for transmission of single byte)
+}
+ 
+// this function writes 0 to the 504 bytes to clear the RAM
+void N5110::clearRAM()
+{
+    int i;
+    sce->write(0);  //set CE low to begin frame
+    for(i = 0; i < WIDTH * HEIGHT; i++) { // 48 x 84 bits = 504 bytes
+        spi->write(0x00);  // send 0's
+    }
+    sce->write(1); // set CE high to end frame
+ 
+}
+ 
+// function to set the XY address in RAM for subsequenct data write
+void N5110::setXYAddress(int x, int y)
+{
+    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+        sendCommand(0x80 | x);  // send addresses to display with relevant mask
+        sendCommand(0x40 | y);
+    }
+}
+ 
+// These functions are used to set, clear and get the value of pixels in the display
+// Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x).  The refresh()
+// function must be called after set and clear in order to update the display
+void N5110::setPixel(int x, int y)
+{
+    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+        // calculate bank and shift 1 to required position in the data byte
+        buffer[x][y/8] |= (1 << y%8);
+    }
+}
+ 
+void N5110::clearPixel(int x, int y)
+{
+    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+        // calculate bank and shift 1 to required position (using bit clear)
+        buffer[x][y/8] &= ~(1 << y%8);
+    }
+}
+ 
+int N5110::getPixel(int x, int y)
+{
+    if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) {  // check within range
+        // return relevant bank and mask required bit
+        return (int) buffer[x][y/8] & (1 << y%8);
+        // note this does not necessarily return 1 - a non-zero number represents a pixel
+    } else {
+        return 0;
+    }
+}
+ 
+// function to refresh the display
+void N5110::refresh()
+{
+    int i,j;
+ 
+    setXYAddress(0,0);  // important to set address back to 0,0 before refreshing display
+    // address auto increments after printing string, so buffer[0][0] will not coincide
+    // with top-left pixel after priting string
+ 
+    sce->write(0);  //set CE low to begin frame
+ 
+    for(j = 0; j < BANKS; j++) {  // be careful to use correct order (j,i) for horizontal addressing
+        for(i = 0; i < WIDTH; i++) {
+            spi->write(buffer[i][j]);  // send buffer
+        }
+    }
+    sce->write(1); // set CE high to end frame
+ 
+}
+ 
+// fills the buffer with random bytes.  Can be used to test the display.
+// The rand() function isn't seeded so it probably creates the same pattern everytime
+void N5110::randomiseBuffer()
+{
+    int i,j;
+    for(j = 0; j < BANKS; j++) {  // be careful to use correct order (j,i) for horizontal addressing
+        for(i = 0; i < WIDTH; i++) {
+            buffer[i][j] = rand()%256;  // generate random byte
+        }
+    }
+ 
+}
+ 
+// function to print 5x7 font
+void N5110::printChar(char c,int x,int y)
+{
+    if (y>=0 && y<BANKS) {  // check if printing in range of y banks
+ 
+        for (int i = 0; i < 5 ; i++ ) {
+            int pixel_x = x+i;
+            if (pixel_x > WIDTH-1)  // ensure pixel isn't outside the buffer size (0 - 83)
+                break;
+            buffer[pixel_x][y] = font5x7[(c - 32)*5 + i];
+            // array is offset by 32 relative to ASCII, each character is 5 pixels wide
+        }
+ 
+        refresh();  // this sends the buffer to the display and sets address (cursor) back to 0,0
+    }
+}
+ 
+// function to print string at specified position
+void N5110::printString(const char * str,int x,int y)
+{
+    if (y>=0 && y<BANKS) {  // check if printing in range of y banks
+ 
+        int n = 0 ; // counter for number of characters in string
+        // loop through string and print character
+        while(*str) {
+ 
+            // writes the character bitmap data to the buffer, so that
+            // text and pixels can be displayed at the same time
+            for (int i = 0; i < 5 ; i++ ) {
+                int pixel_x = x+i+n*6;
+                if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
+                    break;
+                buffer[pixel_x][y] = font5x7[(*str - 32)*5 + i];
+            }
+ 
+            str++;  // go to next character in string
+ 
+            n++;    // increment index
+ 
+        }
+ 
+        refresh();  // this sends the buffer to the display and sets address (cursor) back to 0,0
+    }
+}
+ 
+// function to clear the screen
+void N5110::clear()
+{
+    clearBuffer();  // clear the buffer then call the refresh function
+    refresh();
+}
+ 
+// function to clear the buffer
+void N5110::clearBuffer()
+{
+    int i,j;
+    for (i=0; i<WIDTH; i++) {  // loop through the banks and set the buffer to 0
+        for (j=0; j<BANKS; j++) {
+            buffer[i][j]=0;
+        }
+    }
+}
+ 
+// function to plot array on display
+void N5110::plotArray(float array[])
+{
+ 
+    int i;
+ 
+    for (i=0; i<WIDTH; i++) {  // loop through array
+        // elements are normalised from 0.0 to 1.0, so multiply
+        // by 47 to convert to pixel range, and subtract from 47
+        // since top-left is 0,0 in the display geometry
+        setPixel(i,47 - int(array[i]*47.0));
+    }
+ 
+    refresh();
+ 
+}
+ 
+// function to draw circle
+void N5110:: drawCircle(int x0,int y0,int radius,int fill)
+{
+    // from http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
+    int x = radius;
+    int y = 0;
+    int radiusError = 1-x;
+ 
+    while(x >= y) {
+ 
+        // if transparent, just draw outline
+        if (fill == 0) {
+            setPixel( x + x0,  y + y0);
+            setPixel(-x + x0,  y + y0);
+            setPixel( y + x0,  x + y0);
+            setPixel(-y + x0,  x + y0);
+            setPixel(-y + x0, -x + y0);
+            setPixel( y + x0, -x + y0);
+            setPixel( x + x0, -y + y0);
+            setPixel(-x + x0, -y + y0);
+        } else {  // drawing filled circle, so draw lines between points at same y value
+ 
+            int type = (fill==1) ? 1:0;  // black or white fill
+ 
+            drawLine(x+x0,y+y0,-x+x0,y+y0,type);
+            drawLine(y+x0,x+y0,-y+x0,x+y0,type);
+            drawLine(y+x0,-x+y0,-y+x0,-x+y0,type);
+            drawLine(x+x0,-y+y0,-x+x0,-y+y0,type);
+        }
+ 
+ 
+        y++;
+        if (radiusError<0) {
+            radiusError += 2 * y + 1;
+        } else {
+            x--;
+            radiusError += 2 * (y - x) + 1;
+        }
+    }
+ 
+}
+ 
+void N5110::drawLine(int x0,int y0,int x1,int y1,int type)
+{
+    int y_range = y1-y0;  // calc range of y and x
+    int x_range = x1-x0;
+    int start,stop,step;
+ 
+    // if dotted line, set step to 2, else step is 1
+    step = (type==2) ? 2:1;
+ 
+    // make sure we loop over the largest range to get the most pixels on the display
+    // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels
+    // or else we'll only end up with 1 pixel in the x column
+    if ( abs(x_range) > abs(y_range) ) {
+ 
+        // ensure we loop from smallest to largest or else for-loop won't run as expected
+        start = x1>x0 ? x0:x1;
+        stop =  x1>x0 ? x1:x0;
+ 
+        // loop between x pixels
+        for (int x = start; x<= stop ; x+=step) {
+            // do linear interpolation
+            int y = y0 + (y1-y0)*(x-x0)/(x1-x0);
+ 
+            if (type == 0)   // if 'white' line, turn off pixel
+                clearPixel(x,y);
+            else
+                setPixel(x,y);  // else if 'black' or 'dotted' turn on pixel
+        }
+    } else {
+ 
+        // ensure we loop from smallest to largest or else for-loop won't run as expected
+        start = y1>y0 ? y0:y1;
+        stop =  y1>y0 ? y1:y0;
+ 
+        for (int y = start; y<= stop ; y+=step) {
+            // do linear interpolation
+            int x = x0 + (x1-x0)*(y-y0)/(y1-y0);
+ 
+            if (type == 0)   // if 'white' line, turn off pixel
+                clearPixel(x,y);
+            else
+                setPixel(x,y);  // else if 'black' or 'dotted' turn on pixel
+ 
+        }
+    }
+ 
+}
+ 
+void N5110::drawRect(int x0,int y0,int width,int height,int fill)
+{
+ 
+    if (fill == 0) { // transparent, just outline
+        drawLine(x0,y0,x0+width,y0,1);  // top
+        drawLine(x0,y0+height,x0+width,y0+height,1);  // bottom
+        drawLine(x0,y0,x0,y0+height,1);  // left
+        drawLine(x0+width,y0,x0+width,y0+height,1);  // right
+    } else { // filled rectangle
+        int type = (fill==1) ? 1:0;  // black or white fill
+        for (int y = y0; y<= y0+height; y++) {  // loop through rows of rectangle
+            drawLine(x0,y,x0+width,y,type);  // draw line across screen
+        }
+    }
+ 
+}
+
+
+ 
+MMA8452:: MMA8452(PinName sdaPin, PinName sclPin)
+{
+    i2c = new I2C(sdaPin,sclPin); // create new I2C instance and initialise
+    i2c->frequency(400000);       // I2C Fast Mode - 400kHz
+    leds = new BusOut(LED4,LED3,LED2,LED1);  // for debug
+}
+ 
+void MMA8452::init()
+{
+ 
+    i2c->frequency(400000); // set Fast Mode I2C frequency (5.10 datasheet)
+ 
+    char data = readByteFromRegister(WHO_AM_I);  // p18 datasheet
+    if (data != 0x2A) { // if correct ID not found, hand and flash error message
+        error();
+    }
+ 
+    // put into STANDBY while configuring
+    data = readByteFromRegister(CTRL_REG1); // get current value of register
+    data &= ~(1<<0); // clear bit 0 (p37 datasheet)
+    sendByteToRegister(data,CTRL_REG1);
+ 
+    // Set output data rate, default is 800 Hz, will set to 100 Hz (clear b5, set b4/b3 - p37 datasheet)
+    data = readByteFromRegister(CTRL_REG1);
+    data &= ~(1<<5);
+    data |=  (1<<4);
+    data |=  (1<<3);
+    sendByteToRegister(data,CTRL_REG1);
+ 
+    //// Can also change default 2g range to 4g or 8g (p22 datasheet)
+    data = readByteFromRegister(XYZ_DATA_CFG);
+    data |=  (1<<0); // set bit 0 - 4g range
+    sendByteToRegister(data,XYZ_DATA_CFG);
+ 
+    // set ACTIVE
+    data = readByteFromRegister(CTRL_REG1);
+    data |= (1<<0);   // set bit 0 in CTRL_REG1
+    sendByteToRegister(data,CTRL_REG1);
+ 
+}
+ 
+// read acceleration data from device
+Acceleration MMA8452::readValues()
+{
+    // acceleration data stored in 6 registers (0x01 to 0x06)
+    // device automatically increments register, so can read 6 bytes starting from OUT_X_MSB
+    char data[6];
+    readBytesFromRegister(OUT_X_MSB,6,data);
+ 
+    char x_MSB = data[0];  // extract MSB and LSBs for x,y,z values
+    char x_LSB = data[1];
+    char y_MSB = data[2];
+    char y_LSB = data[3];
+    char z_MSB = data[4];
+    char z_LSB = data[5];
+ 
+    // [0:7] of MSB are 8 MSB of 12-bit value , [7:4] of LSB are 4 LSB's of 12-bit value
+    // need to type-cast as numbers are in signed (2's complement) form (p20 datasheet)
+    int x = (int16_t) (x_MSB << 8) | x_LSB;  // combine bytes
+    x >>= 4;  // are left-aligned, so shift 4 places right to right-align
+    int y = (int16_t) (y_MSB << 8) | y_LSB;
+    y >>= 4;
+    int z = (int16_t) (z_MSB << 8) | z_LSB;
+    z >>= 4;
+ 
+    // sensitivity is 1024 counts/g in 2g mode (pg 9 datasheet)
+    //  "   "          512      "      4g     "
+    //  "   "          256      "      8g     "
+    Acceleration acc;
+    
+    acc.x = x/512.0;
+    acc.y = y/512.0;
+    acc.z = z/512.0;
+    
+    return acc;
+}
+ 
+// reads a byte from a specific register
+char MMA8452::readByteFromRegister(char reg)
+{
+    int nack = i2c->write(MMA8452_W_ADDRESS,&reg,1,true);  // send the register address to the slave
+    // true as need to send repeated start condition (5.10.1 datasheet)
+    // http://www.i2c-bus.org/repeated-start-condition/
+    if (nack)
+        error();  // if we don't receive acknowledgement, flash error message
+ 
+    char rx;
+    nack = i2c->read(MMA8452_R_ADDRESS,&rx,1);  // read a byte from the register and store in buffer
+    if (nack)
+        error();  // if we don't receive acknowledgement, flash error message
+ 
+    return rx;
+}
+ 
+// reads a series of bytes, starting from a specific register
+void MMA8452::readBytesFromRegister(char reg,int numberOfBytes,char bytes[])
+{
+ 
+    int nack = i2c->write(MMA8452_W_ADDRESS,&reg,1,true);  // send the slave write address and the configuration register address
+    // true as need to send repeated start condition (5.10.1 datasheet)
+    // http://www.i2c-bus.org/repeated-start-condition/
+ 
+    if (nack)
+        error();  // if we don't receive acknowledgement, flash error message
+ 
+    nack = i2c->read(MMA8452_R_ADDRESS,bytes,numberOfBytes);  // read bytes
+    if (nack)
+        error();  // if we don't receive acknowledgement, flash error message
+ 
+}
+ 
+// sends a byte to a specific register
+void MMA8452::sendByteToRegister(char byte,char reg)
+{
+    char data[2];
+    data[0] = reg;
+    data[1] = byte;
+    // send the register address, followed by the data
+    int nack = i2c->write(MMA8452_W_ADDRESS,data,2);
+    if (nack)
+        error();  // if we don't receive acknowledgement, flash error message
+ 
+}
+ 
+void MMA8452::error()
+{
+    while(1) {
+        leds->write(15);
+        wait(0.1);
+        leds->write(0);
+        wait(0.1);
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
+MMA8452 mma8452(p28,p27); // SDA, SCL
+Serial serial(USBTX,USBRX);
+DigitalOut myLED1(p24);
+InterruptIn button(p29);
+Beep buzzer(p21);
+BusOut leds (LED4,LED3,LED2,LED1);
+
+int fsm[5]={1,3,8,12,0};//array for led in mbed
+int state=0;
+int buttonFlag=0;//button
+
+void buttonPressed(){
+    buttonFlag=1;
+    }
+
+
+int main()
+{
+    // first need to initialise display and MMA8452
+    
+    lcd.init();
+    mma8452.init();// 100 Hz update rate, ±4g scale
+    
+    
+    lcd.normalMode();     
+    
+    //rise up button
+    button.rise(&buttonPressed);
+    
+    //show initial interface
+    lcd.printString("Acceleration",4,1);
+    lcd.printString("And Angle",4,2);
+    lcd.printString("Measurer",4,3);
+    lcd.drawRect(2,2,78,43,0);    // transparent, just outline
+    lcd.refresh();   // need to refresh screen after drawing rects
+ 
+ 
+    wait(2.0);
+    lcd.clear();
+    
+    Acceleration acceleration; // Accleration structure declared in MMA8452 class
+    
+    
+    while(1) {
+        
+      
+         
+        lcd.printString("Acceleration:",0,0);
+        lcd.printString("Angle:",0,4);
+    
+        myLED1 = 0;
+   
+        acceleration = mma8452.readValues(); // read current values and print over serial port
+        
+        
+        
+        //show acceleration x,y,z
+        char x[14];
+        int length=sprintf(x,"x = %.2f g",acceleration.x);
+         if (length <= 14)
+        lcd.printString(x,0,1);  
+        
+        char y[14];
+        int length2=sprintf(y,"y = %.2f g",acceleration.y);
+         if (length2 <= 14)
+        lcd.printString(y,0,2); 
+        
+        char z[14];
+        int length3=sprintf(z,"z = %.2f g",acceleration.z);
+         if (length3 <= 14)
+        lcd.printString(z,0,3); 
+        
+       //convert acceration in z  to angle
+        char angleZ[14];
+        float anglez=90-(acceleration.z/1*90);
+      
+             
+             
+        // set button   
+        if (buttonFlag){
+        buttonFlag=0;
+        int angle3=sprintf(angleZ,"%.2f",anglez);
+        lcd.printString(angleZ,0,5); 
+        }
+      
+   
+        
+       if (anglez>=30){
+        
+           myLED1 = 1;
+            
+         }
+             
+             
+             
+      if(anglez>=30&&acceleration.x>0){
+          
+             leds=fsm[0];
+            
+            }
+            
+            
+      if(anglez>=60&&acceleration.x>0){
+            leds=fsm[1];
+           
+           }
+           
+       
+      if(anglez>=30&&acceleration.x<0){
+         
+            leds=fsm[2];
+           }
+           
+           
+      if(anglez>=60&&acceleration.x<0){
+            leds=fsm[3];
+           }
+           
+        
+      if(anglez<30){
+           leds=fsm[4];
+           }
+           
+           
+     if(anglez>=60){
+                
+                  buzzer.beep(2000,0.5);
+           }
+           
+         
+
+        wait(0.1);
+          lcd.refresh();
+    
+
+        
+    }
+
+ 
+           }
\ No newline at end of file
diff -r 000000000000 -r a57e07e44ab0 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun May 10 00:23:23 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/8ab26030e058
\ No newline at end of file