My ELEC2645 sensor project Bader Alathri 200826344

Dependencies:   FXOS8700Q N5110 SRF02 mbed

Committer:
fy13ba
Date:
Thu May 05 14:59:50 2016 +0000
Revision:
0:fedc789ee1f0
final version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fy13ba 0:fedc789ee1f0 1 /*
fy13ba 0:fedc789ee1f0 2
fy13ba 0:fedc789ee1f0 3 Bader Alathri
fy13ba 0:fedc789ee1f0 4 ELEC2645_project
fy13ba 0:fedc789ee1f0 5
fy13ba 0:fedc789ee1f0 6 */
fy13ba 0:fedc789ee1f0 7
fy13ba 0:fedc789ee1f0 8
fy13ba 0:fedc789ee1f0 9 #include "main.h"
fy13ba 0:fedc789ee1f0 10
fy13ba 0:fedc789ee1f0 11 BusIn input(PTC5,PTC7); /// external button inputs (toggle,select)
fy13ba 0:fedc789ee1f0 12
fy13ba 0:fedc789ee1f0 13
fy13ba 0:fedc789ee1f0 14 struct State { /// struct to group state information
fy13ba 0:fedc789ee1f0 15 int output; /// output value
fy13ba 0:fedc789ee1f0 16 float time; /// time in state
fy13ba 0:fedc789ee1f0 17 int nextState[4]; /// array of next states
fy13ba 0:fedc789ee1f0 18 };
fy13ba 0:fedc789ee1f0 19
fy13ba 0:fedc789ee1f0 20 typedef const struct State STyp;
fy13ba 0:fedc789ee1f0 21
fy13ba 0:fedc789ee1f0 22
fy13ba 0:fedc789ee1f0 23 STyp fsm[9] = { /// finite state machine (FSM) transition table
fy13ba 0:fedc789ee1f0 24 {0,0.15,{0,1,3,0}},
fy13ba 0:fedc789ee1f0 25 {1,0.15,{1,2,7,1}},
fy13ba 0:fedc789ee1f0 26 {2,0.15,{2,0,8,2}},
fy13ba 0:fedc789ee1f0 27 {3,0.15,{3,4,5,3}},
fy13ba 0:fedc789ee1f0 28 {4,0.15,{4,3,6,4}},
fy13ba 0:fedc789ee1f0 29 {5,0.15,{5,0,5,5}},
fy13ba 0:fedc789ee1f0 30 {6,0.15,{6,0,6,6}},
fy13ba 0:fedc789ee1f0 31 {7,0.15,{7,0,7,7}},
fy13ba 0:fedc789ee1f0 32 {8,0.15,{8,0,8,8}}
fy13ba 0:fedc789ee1f0 33
fy13ba 0:fedc789ee1f0 34 };
fy13ba 0:fedc789ee1f0 35
fy13ba 0:fedc789ee1f0 36
fy13ba 0:fedc789ee1f0 37 int main()
fy13ba 0:fedc789ee1f0 38 {
fy13ba 0:fedc789ee1f0 39
fy13ba 0:fedc789ee1f0 40 init_K64F(); /// initialise the board and serial port
fy13ba 0:fedc789ee1f0 41 init_serial(); /// initialise serial port
fy13ba 0:fedc789ee1f0 42 lcd.init(); /// initialise display
fy13ba 0:fedc789ee1f0 43 brightness = 0.4; /// setting initial brightness value to 0.4
fy13ba 0:fedc789ee1f0 44 lcd.setBrightness(brightness); /// sets lcd brightness to match 'brightness' variable
fy13ba 0:fedc789ee1f0 45 toggle.rise(&toggle_isr); /// rising edge for interrupt input set to trigger ISR (toggle button)
fy13ba 0:fedc789ee1f0 46 select.rise(&select_isr); /// rising edge for interrupt interrupt set to trigger ISR (select button)
fy13ba 0:fedc789ee1f0 47
fy13ba 0:fedc789ee1f0 48 toggle.mode(PullDown); /// interrupt input pin set to pulldown mode (toggle button)
fy13ba 0:fedc789ee1f0 49 select.mode(PullDown); /// interrupt input pin set to pulldown mode (select button)
fy13ba 0:fedc789ee1f0 50 /// as both buttons are connected to 3V3
fy13ba 0:fedc789ee1f0 51
fy13ba 0:fedc789ee1f0 52 int state = 0; /// intitial FSM state set to 0
fy13ba 0:fedc789ee1f0 53
fy13ba 0:fedc789ee1f0 54 while(1) {
fy13ba 0:fedc789ee1f0 55
fy13ba 0:fedc789ee1f0 56 int output; // /stores value of state output
fy13ba 0:fedc789ee1f0 57 output = fsm[state].output; /// set ouput depending on current state
fy13ba 0:fedc789ee1f0 58 wait(fsm[state].time); /// wait in that state for desired time
fy13ba 0:fedc789ee1f0 59 state = fsm[state].nextState[input]; /// read input (BusIn) and update curent state
fy13ba 0:fedc789ee1f0 60
fy13ba 0:fedc789ee1f0 61 if ( output == 0) { /// first state
fy13ba 0:fedc789ee1f0 62
fy13ba 0:fedc789ee1f0 63 acc.disable(); /// disable accelerometer, from FXOS8700Q library
fy13ba 0:fedc789ee1f0 64 ticker1.detach(); /// stops ticker from triggering timer1 ISR
fy13ba 0:fedc789ee1f0 65 g_toggle_flag = 0; /// resets toggle flag to 0
fy13ba 0:fedc789ee1f0 66 r_led = 0; /// turns off external red LED
fy13ba 0:fedc789ee1f0 67 g_led = 0; /// turns off external green LED
fy13ba 0:fedc789ee1f0 68
fy13ba 0:fedc789ee1f0 69 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 70 lcd.drawCircle(3,12,1,1); /// displays small circle next to selected option
fy13ba 0:fedc789ee1f0 71 /// display options on lcd
fy13ba 0:fedc789ee1f0 72 lcd.printString("get distance",7,1);
fy13ba 0:fedc789ee1f0 73 lcd.printString("spirit level",7,3);
fy13ba 0:fedc789ee1f0 74 lcd.printString("brightness",7,5);
fy13ba 0:fedc789ee1f0 75
fy13ba 0:fedc789ee1f0 76
fy13ba 0:fedc789ee1f0 77
fy13ba 0:fedc789ee1f0 78 } else if ( output == 1 ) { /// second state
fy13ba 0:fedc789ee1f0 79
fy13ba 0:fedc789ee1f0 80 g_toggle_flag = 0; /// resets toggle flag to 0
fy13ba 0:fedc789ee1f0 81 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 82 lcd.drawCircle(3,28,1,1); /// displays small circle next to selected option
fy13ba 0:fedc789ee1f0 83 /// display options on lcd
fy13ba 0:fedc789ee1f0 84 lcd.printString("get distance",7,1);
fy13ba 0:fedc789ee1f0 85 lcd.printString("spirit level",7,3);
fy13ba 0:fedc789ee1f0 86 lcd.printString("brightness",7,5);
fy13ba 0:fedc789ee1f0 87
fy13ba 0:fedc789ee1f0 88
fy13ba 0:fedc789ee1f0 89
fy13ba 0:fedc789ee1f0 90 } else if ( output == 2 ) { /// third state
fy13ba 0:fedc789ee1f0 91
fy13ba 0:fedc789ee1f0 92 g_toggle_flag = 0; /// resets toggle flag to 0
fy13ba 0:fedc789ee1f0 93 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 94 lcd.drawCircle(3,44,1,1); /// displays small circle next to selected option
fy13ba 0:fedc789ee1f0 95 /// display options on lcd
fy13ba 0:fedc789ee1f0 96 lcd.printString("get distance",7,1);
fy13ba 0:fedc789ee1f0 97 lcd.printString("spirit level",7,3);
fy13ba 0:fedc789ee1f0 98 lcd.printString("brightness",7,5);
fy13ba 0:fedc789ee1f0 99
fy13ba 0:fedc789ee1f0 100
fy13ba 0:fedc789ee1f0 101
fy13ba 0:fedc789ee1f0 102
fy13ba 0:fedc789ee1f0 103 } else if ( output == 3 ) { /// fourth state
fy13ba 0:fedc789ee1f0 104
fy13ba 0:fedc789ee1f0 105 g_select_flag = 0; /// resets select flag to 0
fy13ba 0:fedc789ee1f0 106 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 107 lcd.drawCircle(3,12,1,1); /// displays small circle next to selected option
fy13ba 0:fedc789ee1f0 108 /// display unit options on lcd
fy13ba 0:fedc789ee1f0 109 lcd.printString("centimetres",7,1);
fy13ba 0:fedc789ee1f0 110 lcd.printString("inches",7,3);
fy13ba 0:fedc789ee1f0 111
fy13ba 0:fedc789ee1f0 112 } else if ( output == 4 ) { /// fifth state
fy13ba 0:fedc789ee1f0 113
fy13ba 0:fedc789ee1f0 114 g_toggle_flag = 0; /// resets toggle flag to 0
fy13ba 0:fedc789ee1f0 115 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 116 lcd.drawCircle(3,28,1,1); /// displays small circle next to selected option
fy13ba 0:fedc789ee1f0 117 /// display unit options on lcd
fy13ba 0:fedc789ee1f0 118 lcd.printString("centimetres",7,1);
fy13ba 0:fedc789ee1f0 119 lcd.printString("inches",7,3);
fy13ba 0:fedc789ee1f0 120
fy13ba 0:fedc789ee1f0 121 } else if ( output == 5 && g_select_flag == 1 ) { /// sixth state, two conditions so that state triggers only once
fy13ba 0:fedc789ee1f0 122
fy13ba 0:fedc789ee1f0 123 g_select_flag = 0; /// resets select flag to 0
fy13ba 0:fedc789ee1f0 124 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 125 measuring_transition(); /// displays transition while measurement is taking place
fy13ba 0:fedc789ee1f0 126 get_average_distance_cm(); /// calculates average distance in cm from readings
fy13ba 0:fedc789ee1f0 127 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 128
fy13ba 0:fedc789ee1f0 129
fy13ba 0:fedc789ee1f0 130
fy13ba 0:fedc789ee1f0 131 if (g_error_flag) { /// checks if error flag is triggered
fy13ba 0:fedc789ee1f0 132 g_error_flag = 0; /// resets error flag to 0
fy13ba 0:fedc789ee1f0 133 measurement_error(); /// displays error message
fy13ba 0:fedc789ee1f0 134
fy13ba 0:fedc789ee1f0 135 }
fy13ba 0:fedc789ee1f0 136
fy13ba 0:fedc789ee1f0 137
fy13ba 0:fedc789ee1f0 138 else { /// if error flag was not triggered
fy13ba 0:fedc789ee1f0 139 display_distance_cm(); /// displays distance in cm
fy13ba 0:fedc789ee1f0 140 g_led = 1; /// turns on green external LED
fy13ba 0:fedc789ee1f0 141 }
fy13ba 0:fedc789ee1f0 142 lcd.refresh(); ///refreshes lcd
fy13ba 0:fedc789ee1f0 143 sleep(); /// puts K64F into sleep mode
fy13ba 0:fedc789ee1f0 144 }
fy13ba 0:fedc789ee1f0 145
fy13ba 0:fedc789ee1f0 146
fy13ba 0:fedc789ee1f0 147 else if ( output == 6 && g_select_flag == 1 ) { /// seventh state, two conditions so that state triggers only once
fy13ba 0:fedc789ee1f0 148
fy13ba 0:fedc789ee1f0 149 g_select_flag = 0; /// resets select flag to 0
fy13ba 0:fedc789ee1f0 150 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 151 measuring_transition(); /// displays transition while measurement is taking place
fy13ba 0:fedc789ee1f0 152 get_average_distance_in(); ///c alculates average distance in inches from readings
fy13ba 0:fedc789ee1f0 153 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 154
fy13ba 0:fedc789ee1f0 155
fy13ba 0:fedc789ee1f0 156 if (g_error_flag) { /// checks if error flag is triggered
fy13ba 0:fedc789ee1f0 157 g_error_flag = 0; /// resets error flag to 0
fy13ba 0:fedc789ee1f0 158 measurement_error(); /// displays error message
fy13ba 0:fedc789ee1f0 159 }
fy13ba 0:fedc789ee1f0 160
fy13ba 0:fedc789ee1f0 161
fy13ba 0:fedc789ee1f0 162 else { /// if error flag was not triggered
fy13ba 0:fedc789ee1f0 163 display_distance_in(); /// displays distance in inches
fy13ba 0:fedc789ee1f0 164 g_led = 1; /// turns on green external LED
fy13ba 0:fedc789ee1f0 165 }
fy13ba 0:fedc789ee1f0 166 lcd.refresh(); /// refreshes lcd
fy13ba 0:fedc789ee1f0 167 sleep(); /// puts K64F into sleep mode
fy13ba 0:fedc789ee1f0 168 }
fy13ba 0:fedc789ee1f0 169
fy13ba 0:fedc789ee1f0 170 else if ( output == 7 ) { /// eighth state
fy13ba 0:fedc789ee1f0 171
fy13ba 0:fedc789ee1f0 172 acc.enable(); /// enabling FXOS8700 accelerometer, credit: https://developer.mbed.org/teams/Freescale/code/Hello_FXOS8700Q/
fy13ba 0:fedc789ee1f0 173 ticker1.attach(&timer1_isr,0.125); /// attaching ticker1 to timer1 ISR
fy13ba 0:fedc789ee1f0 174 /// ISR triggered every 0.125 seconds
fy13ba 0:fedc789ee1f0 175
fy13ba 0:fedc789ee1f0 176 if (g_timer1_flag) { /// checks if ISR is triggered
fy13ba 0:fedc789ee1f0 177
fy13ba 0:fedc789ee1f0 178 g_timer1_flag = 0; /// resets timer flag to 0
fy13ba 0:fedc789ee1f0 179
fy13ba 0:fedc789ee1f0 180 get_z_axis_value(); ///calculates average z-axis reading
fy13ba 0:fedc789ee1f0 181 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 182 display_flatness(); /// displays whether surface is found to be flat
fy13ba 0:fedc789ee1f0 183 lcd.refresh(); /// refreshes lcd
fy13ba 0:fedc789ee1f0 184 sleep(); /// puts K64F into sleep mode
fy13ba 0:fedc789ee1f0 185 }
fy13ba 0:fedc789ee1f0 186
fy13ba 0:fedc789ee1f0 187
fy13ba 0:fedc789ee1f0 188 } else if ( output == 8 && g_select_flag == 1 ) { /// ninth state
fy13ba 0:fedc789ee1f0 189 g_select_flag = 0; /// resets select flag to 0
fy13ba 0:fedc789ee1f0 190 lcd.clear(); /// clears lcd
fy13ba 0:fedc789ee1f0 191 adjust_brightness(); /// adjusts brightness according to current value of 'brightness' variable
fy13ba 0:fedc789ee1f0 192 display_brightness(); /// displays brightness as a percentage on lcd
fy13ba 0:fedc789ee1f0 193 lcd.refresh(); /// refreshes lcd
fy13ba 0:fedc789ee1f0 194 sleep(); /// puts K64F into sleep mode
fy13ba 0:fedc789ee1f0 195
fy13ba 0:fedc789ee1f0 196 }
fy13ba 0:fedc789ee1f0 197
fy13ba 0:fedc789ee1f0 198 }
fy13ba 0:fedc789ee1f0 199 }
fy13ba 0:fedc789ee1f0 200
fy13ba 0:fedc789ee1f0 201
fy13ba 0:fedc789ee1f0 202 void init_serial()
fy13ba 0:fedc789ee1f0 203 {
fy13ba 0:fedc789ee1f0 204
fy13ba 0:fedc789ee1f0 205 pc.baud(115200); /// set to highest baud - ensure terminal software matches
fy13ba 0:fedc789ee1f0 206 }
fy13ba 0:fedc789ee1f0 207
fy13ba 0:fedc789ee1f0 208 void init_K64F()
fy13ba 0:fedc789ee1f0 209 {
fy13ba 0:fedc789ee1f0 210 /// on-board LEDs are active-low, so set pin high to turn them off.
fy13ba 0:fedc789ee1f0 211 red_led = 1;
fy13ba 0:fedc789ee1f0 212 green_led = 1;
fy13ba 0:fedc789ee1f0 213 blue_led = 1;
fy13ba 0:fedc789ee1f0 214
fy13ba 0:fedc789ee1f0 215 }
fy13ba 0:fedc789ee1f0 216
fy13ba 0:fedc789ee1f0 217 void timer1_isr()
fy13ba 0:fedc789ee1f0 218 {
fy13ba 0:fedc789ee1f0 219 g_timer1_flag = 1; /// set timer1 flag in ISR
fy13ba 0:fedc789ee1f0 220 }
fy13ba 0:fedc789ee1f0 221
fy13ba 0:fedc789ee1f0 222 void select_isr()
fy13ba 0:fedc789ee1f0 223 {
fy13ba 0:fedc789ee1f0 224 g_select_flag = 1; /// set select flag in ISR
fy13ba 0:fedc789ee1f0 225 }
fy13ba 0:fedc789ee1f0 226
fy13ba 0:fedc789ee1f0 227 void toggle_isr()
fy13ba 0:fedc789ee1f0 228 {
fy13ba 0:fedc789ee1f0 229 g_toggle_flag = 1; /// set toggle flag in ISR
fy13ba 0:fedc789ee1f0 230 }
fy13ba 0:fedc789ee1f0 231
fy13ba 0:fedc789ee1f0 232 void measurement_error()
fy13ba 0:fedc789ee1f0 233 {
fy13ba 0:fedc789ee1f0 234 lcd.printString("error",25,2); /// displays 'error' on lcd
fy13ba 0:fedc789ee1f0 235 r_led = 1; /// turns on external red LED
fy13ba 0:fedc789ee1f0 236
fy13ba 0:fedc789ee1f0 237 }
fy13ba 0:fedc789ee1f0 238
fy13ba 0:fedc789ee1f0 239 void measuring_transition()
fy13ba 0:fedc789ee1f0 240 {
fy13ba 0:fedc789ee1f0 241 /// turns off external LEDs
fy13ba 0:fedc789ee1f0 242 r_led = 0;
fy13ba 0:fedc789ee1f0 243 g_led = 0;
fy13ba 0:fedc789ee1f0 244 lcd.printString("measuring...",10,2); /// displays measuring message on lcd
fy13ba 0:fedc789ee1f0 245 }
fy13ba 0:fedc789ee1f0 246
fy13ba 0:fedc789ee1f0 247 void get_average_distance_cm()
fy13ba 0:fedc789ee1f0 248 {
fy13ba 0:fedc789ee1f0 249 total_distance = 0.0; /// resets value for total distance
fy13ba 0:fedc789ee1f0 250 average_distance_cm = 0.0; /// resets value for average distance (cm)
fy13ba 0:fedc789ee1f0 251 for ( int i=0; i<10; i++) { /// 10 iterations
fy13ba 0:fedc789ee1f0 252
fy13ba 0:fedc789ee1f0 253 float distance = sensor.getDistanceCm(); /// gets 1 distance reading from sensor in cm
fy13ba 0:fedc789ee1f0 254 total_distance = total_distance + distance; /// stores sum of readings
fy13ba 0:fedc789ee1f0 255
fy13ba 0:fedc789ee1f0 256 if ( distance >= 249 ) { /// if a single measurement is above the range of the sensor
fy13ba 0:fedc789ee1f0 257
fy13ba 0:fedc789ee1f0 258 g_error_flag = 1; /// trigger error flag
fy13ba 0:fedc789ee1f0 259
fy13ba 0:fedc789ee1f0 260
fy13ba 0:fedc789ee1f0 261 }
fy13ba 0:fedc789ee1f0 262
fy13ba 0:fedc789ee1f0 263 else if ( distance <= 15 ) { /// if a single measurement is below the range of the sensor
fy13ba 0:fedc789ee1f0 264
fy13ba 0:fedc789ee1f0 265 g_error_flag = 1; /// trigger error flag
fy13ba 0:fedc789ee1f0 266
fy13ba 0:fedc789ee1f0 267 }
fy13ba 0:fedc789ee1f0 268 pc.printf("Distance = %.2f cm\n",distance); /// prints distance measurements to pc in cm
fy13ba 0:fedc789ee1f0 269 }
fy13ba 0:fedc789ee1f0 270
fy13ba 0:fedc789ee1f0 271 average_distance_cm = total_distance/10; /// calculates average distance in cm
fy13ba 0:fedc789ee1f0 272 }
fy13ba 0:fedc789ee1f0 273
fy13ba 0:fedc789ee1f0 274 void get_average_distance_in()
fy13ba 0:fedc789ee1f0 275 {
fy13ba 0:fedc789ee1f0 276 total_distance = 0.0; /// resets value for total distance
fy13ba 0:fedc789ee1f0 277 average_distance_in = 0.0; /// resets value for average distance (inches)
fy13ba 0:fedc789ee1f0 278 for ( int i=0; i<10; i++) { /// 10 iterations
fy13ba 0:fedc789ee1f0 279
fy13ba 0:fedc789ee1f0 280 float distance = sensor.getDistanceCm(); /// gets 1 distance reading from sensor in cm
fy13ba 0:fedc789ee1f0 281 total_distance = total_distance + distance; /// stores sum of readings
fy13ba 0:fedc789ee1f0 282
fy13ba 0:fedc789ee1f0 283 if ( distance >= 249 ) { /// if a single measurement is above the range of the sensor
fy13ba 0:fedc789ee1f0 284
fy13ba 0:fedc789ee1f0 285 g_error_flag = 1; /// trigger error flag
fy13ba 0:fedc789ee1f0 286
fy13ba 0:fedc789ee1f0 287
fy13ba 0:fedc789ee1f0 288 }
fy13ba 0:fedc789ee1f0 289
fy13ba 0:fedc789ee1f0 290 else if ( distance <= 15 ) { /// if a single measurement is below the range of the sensor
fy13ba 0:fedc789ee1f0 291
fy13ba 0:fedc789ee1f0 292 g_error_flag = 1; /// trigger error flag
fy13ba 0:fedc789ee1f0 293
fy13ba 0:fedc789ee1f0 294 }
fy13ba 0:fedc789ee1f0 295 pc.printf("Distance = %.2f cm\n",distance); /// prints distance measurements to pc in cm
fy13ba 0:fedc789ee1f0 296 }
fy13ba 0:fedc789ee1f0 297
fy13ba 0:fedc789ee1f0 298 average_distance_in = (total_distance/10) * 0.394; /// calculates average distance in cm then converts it to inches
fy13ba 0:fedc789ee1f0 299 }
fy13ba 0:fedc789ee1f0 300
fy13ba 0:fedc789ee1f0 301 void display_distance_cm()
fy13ba 0:fedc789ee1f0 302 {
fy13ba 0:fedc789ee1f0 303 /// prints value of distance and units
fy13ba 0:fedc789ee1f0 304 lcd.printString("Distance:",15,1);
fy13ba 0:fedc789ee1f0 305 char buffer[14];
fy13ba 0:fedc789ee1f0 306 float length = sprintf(buffer,"%.2f cm",average_distance_cm); /// print formatted data to buffer
fy13ba 0:fedc789ee1f0 307 lcd.printString(buffer,17,3); /// display on lcd
fy13ba 0:fedc789ee1f0 308
fy13ba 0:fedc789ee1f0 309 }
fy13ba 0:fedc789ee1f0 310
fy13ba 0:fedc789ee1f0 311 void display_distance_in()
fy13ba 0:fedc789ee1f0 312 {
fy13ba 0:fedc789ee1f0 313 lcd.printString("Distance:",15,1);
fy13ba 0:fedc789ee1f0 314 char buffer[14];
fy13ba 0:fedc789ee1f0 315 float length = sprintf(buffer,"%.2f inches",average_distance_in); /// print formatted data to buffer
fy13ba 0:fedc789ee1f0 316 lcd.printString(buffer,9,3); /// display on lcd
fy13ba 0:fedc789ee1f0 317
fy13ba 0:fedc789ee1f0 318 }
fy13ba 0:fedc789ee1f0 319
fy13ba 0:fedc789ee1f0 320
fy13ba 0:fedc789ee1f0 321 void get_z_axis_value()
fy13ba 0:fedc789ee1f0 322 {
fy13ba 0:fedc789ee1f0 323
fy13ba 0:fedc789ee1f0 324 int16_t raZ; /// variable for storing z-axis reading taken from FXOS8700Q library
fy13ba 0:fedc789ee1f0 325 /// from FXOS8700Q library
fy13ba 0:fedc789ee1f0 326
fy13ba 0:fedc789ee1f0 327 acc.getAxis(acc_data); /// gets data from accelerometer, from FXOS8700Q library
fy13ba 0:fedc789ee1f0 328
fy13ba 0:fedc789ee1f0 329
fy13ba 0:fedc789ee1f0 330
fy13ba 0:fedc789ee1f0 331 acc.getZ(&raZ); /// get z-axis reading, from FXOS8700Q library
fy13ba 0:fedc789ee1f0 332
fy13ba 0:fedc789ee1f0 333
fy13ba 0:fedc789ee1f0 334
fy13ba 0:fedc789ee1f0 335 int total_z = 0; /// variable to store sum of z-axis values
fy13ba 0:fedc789ee1f0 336
fy13ba 0:fedc789ee1f0 337 for ( int i=0; i<10; i++) { /// 10 iterations
fy13ba 0:fedc789ee1f0 338
fy13ba 0:fedc789ee1f0 339 int z = raZ; /// variable to store single z-axis reading, from FXOS8700Q library
fy13ba 0:fedc789ee1f0 340 total_z = total_z + z; /// summing z-axis readings
fy13ba 0:fedc789ee1f0 341
fy13ba 0:fedc789ee1f0 342 wait (0.01); /// delay of 0.01 seconds between loop iterations
fy13ba 0:fedc789ee1f0 343 }
fy13ba 0:fedc789ee1f0 344
fy13ba 0:fedc789ee1f0 345 average_z = total_z / 10 ; /// calculates average z-axis value
fy13ba 0:fedc789ee1f0 346
fy13ba 0:fedc789ee1f0 347 pc.printf("Z=%.2f\n ", average_z); /// prints average z-axis value to pc
fy13ba 0:fedc789ee1f0 348 }
fy13ba 0:fedc789ee1f0 349
fy13ba 0:fedc789ee1f0 350 void display_flatness()
fy13ba 0:fedc789ee1f0 351 {
fy13ba 0:fedc789ee1f0 352 if ((average_z <= 280) && (average_z >= 80)) { ///if average z-axis value within specified range (vertically flat)
fy13ba 0:fedc789ee1f0 353 r_led = 0; /// turns off external red LED
fy13ba 0:fedc789ee1f0 354 g_led = 1; /// turns on external green LED
fy13ba 0:fedc789ee1f0 355 lcd.printString("vertically",7,1); /// displays 'vertically flat' message on lcd
fy13ba 0:fedc789ee1f0 356 lcd.printString("flat",30,3);
fy13ba 0:fedc789ee1f0 357 }
fy13ba 0:fedc789ee1f0 358
fy13ba 0:fedc789ee1f0 359 else if ((average_z <= 4160) && (average_z >= 4147)) { ///if average z-axis value within specified range (horizontaly flat)
fy13ba 0:fedc789ee1f0 360 r_led = 0; /// turns off external red LED
fy13ba 0:fedc789ee1f0 361 g_led = 1; /// turns on external green LED
fy13ba 0:fedc789ee1f0 362 lcd.printString("horizontally",7,1); /// displays 'horizontaly flat' message on lcd
fy13ba 0:fedc789ee1f0 363 lcd.printString("flat",30,3);
fy13ba 0:fedc789ee1f0 364 }
fy13ba 0:fedc789ee1f0 365
fy13ba 0:fedc789ee1f0 366 else if ((average_z <= -3860) && (average_z >= -3880)) { ///if average z-axis value within specified range (horizontaly flat)
fy13ba 0:fedc789ee1f0 367 r_led = 0; /// turns off external red LED
fy13ba 0:fedc789ee1f0 368 g_led = 1; /// turns on external green LED
fy13ba 0:fedc789ee1f0 369 lcd.printString("horizontally",7,1); /// displays 'horizontaly flat' message on lcd
fy13ba 0:fedc789ee1f0 370 lcd.printString("flat",30,3);
fy13ba 0:fedc789ee1f0 371 }
fy13ba 0:fedc789ee1f0 372
fy13ba 0:fedc789ee1f0 373 else { /// otherwise if average z-axis value within specified ranges (not flat)
fy13ba 0:fedc789ee1f0 374 r_led = 1; /// turns on external red LED
fy13ba 0:fedc789ee1f0 375 g_led = 0; /// turns off external green LED
fy13ba 0:fedc789ee1f0 376 lcd.printString("not flat",18,2); /// displays 'not flat' message on lcd
fy13ba 0:fedc789ee1f0 377
fy13ba 0:fedc789ee1f0 378 }
fy13ba 0:fedc789ee1f0 379
fy13ba 0:fedc789ee1f0 380 }
fy13ba 0:fedc789ee1f0 381
fy13ba 0:fedc789ee1f0 382 void adjust_brightness()
fy13ba 0:fedc789ee1f0 383 {
fy13ba 0:fedc789ee1f0 384 if ( brightness == 1.0 ) { /// if the brightness value is at 1.0
fy13ba 0:fedc789ee1f0 385 brightness = 0.0; /// set brightness back to 0
fy13ba 0:fedc789ee1f0 386 } else { /// if the brightness value is not 1.0
fy13ba 0:fedc789ee1f0 387 brightness = brightness + 0.2; /// increase its value by 0.2
fy13ba 0:fedc789ee1f0 388 }
fy13ba 0:fedc789ee1f0 389
fy13ba 0:fedc789ee1f0 390 lcd.setBrightness(brightness); /// sets lcd brightness to valeu of 'brightness' variable
fy13ba 0:fedc789ee1f0 391 }
fy13ba 0:fedc789ee1f0 392
fy13ba 0:fedc789ee1f0 393 void display_brightness()
fy13ba 0:fedc789ee1f0 394 {
fy13ba 0:fedc789ee1f0 395 lcd.printString("brightness:",7,1);
fy13ba 0:fedc789ee1f0 396 int brightness_percentage = brightness * 100; /// calculates brightness percentage
fy13ba 0:fedc789ee1f0 397 char buffer[14];
fy13ba 0:fedc789ee1f0 398 float length = sprintf(buffer,"%d%%",brightness_percentage); /// print formatted data to buffer
fy13ba 0:fedc789ee1f0 399 lcd.printString(buffer,31,3); /// display on lcd
fy13ba 0:fedc789ee1f0 400 }