Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Fork of Ranger by
main.cpp
00001 00002 /** 00003 @file main.cpp 00004 @brief Program implementation 00005 */ 00006 00007 #include "main.h" 00008 00009 int main () 00010 { 00011 setup(); 00012 lcd.init(); // Initiate LCD 00013 int d = 0; 00014 int myarray[5] {999,999,999,999,999}; /// initilised to any possitive integer to prevent random values at start up triggering an alert 00015 00016 // Load settings from SD Card\\\\\\\\\\ 00017 FILE *fp; // file pointer 00018 fp = fopen("/sd/settings.txt", "r"); 00019 if (fp == NULL) { // if it can't open the file then print error message 00020 serial.printf("Error! Unable to open file!\n"); 00021 } else { 00022 serial.printf("Reading file....\n"); 00023 00024 while (fscanf(fp, "%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,",&bright,&units,&offset,&check_flag,&r1,&r2,&r3,&r4,&r5,&r6,&r7) != EOF) { 00025 serial.printf("%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i, \n",bright,units,offset,check_flag,r1,r2,r3,r4,r5,r6,r7); 00026 } 00027 serial.printf("Done.\n"); 00028 fclose(fp); // ensure you close the file after reading 00029 } 00030 00031 //Startup Screen 00032 00033 lcd.printString("ELEC 2645",0,0); 00034 lcd.printString("Project Ranger",0,1); 00035 lcd.printString("Phil Thompson",0,2); 00036 lcd.printString("SID 200971914 ",0,3); 00037 wait (3); 00038 00039 00040 lcd.setBrightness(bright); //Set brightness of screen on startup from loaded value from SD Card 00041 00042 // Main while loop of the Ranger 00043 while(1) { 00044 if (g_sw1_flag) { /// Event triggered inturupt to call the menu and reset page numbers 00045 g_sw1_flag = 0; 00046 page = 0; 00047 subpage = 0; 00048 lcd.clear(); 00049 menu(); 00050 } 00051 if (g_timer_flag_srf02) { 00052 g_timer_flag_srf02 = 0; // if it has, clear the flag 00053 if (units == 1) { // if units = 1 metric measurment are retrived from SFR02 00054 distance = srf02.getDistanceCm(); 00055 distance = distance-(offset*c); 00056 } else { //If units = 0 imperial measurments retrived from SFR02 00057 distance = srf02.getDistannceInch(); 00058 distance = distance -(offset*c); 00059 } // close else breaket 00060 } // close if inteurrupt bracket 00061 00062 00063 //Function to average last 5 readings 00064 if (d == 4) { 00065 d = 0; 00066 } else { 00067 d++; 00068 } 00069 myarray[d] = distance; 00070 totaldistance =0; 00071 for (int i = 0; i < 5; i++) { 00072 totaldistance = totaldistance + myarray[i]; 00073 } 00074 avgdistance = (totaldistance/5); 00075 00076 00077 /*Debugging\\ 00078 Uncomment to use button 2 to toggle thru alert levels for debugging and comment out setalert(); 00079 serial.printf("TOATAL DISTANCE %i\n", totaldistance); 00080 serial.printf("DISTANCE %i\n", distance); 00081 serial.printf("AVERAGE DISTANCE %f\n", avgdistance); 00082 serial.printf("ARRAY ELEMENT = %i\n", d); 00083 serial.printf("myarray %i\n", myarray[d]); 00084 if (g_sw2_flag) { /// Event triggered inturupt to call the menu and reset page numbers 00085 g_sw2_flag = 0; 00086 if (alert ==8) { 00087 alert =0; 00088 } else { 00089 alert++; 00090 } 00091 serial.printf("ALERT LEVEL %i\n", alert); 00092 }*/ 00093 00094 00095 00096 setalert(); 00097 //serial.printf("ALERT LEVEL %i\n", alert); 00098 lcdoutput(); 00099 00100 if (alert !=0) { // no buzzer needed at alert == 0 path clear 00101 if (buzz_flag == 0) {// flag keeps buzz from being called durig it's off period 00102 setbuzzer (); 00103 } 00104 } 00105 setleds(); // Function called to set LED outputs 00106 sleep(); // Sleep till nest interupt 00107 } 00108 } 00109 00110 void setalert() 00111 { 00112 if (avgdistance >= (r6*c) && avgdistance < (r7*c)) { // r6 150 and r7 200 00113 alert = 1; /// alert 1 avgdistance between preset 150Cm to 200Cm 00114 } else if (avgdistance >= (r5*c) && avgdistance < (r6*c)) { 00115 alert = 2; /// alert 2 when between preset 90Cm to 150Cm 00116 } else if (avgdistance >= (r4*c) && avgdistance < (r5*c)) { 00117 alert = 3; /// alert 3 when avgdistance between 60Cm to 90Cm 00118 } else if (avgdistance >= (r3*c) && avgdistance < (r4*c)) { 00119 alert = 4; /// alert 4 when avgdistance between 40Cm and 60Cm 00120 } else if (avgdistance >= (r2*c) && avgdistance < (r3*c)) { 00121 alert = 5; ///alert 5 when avgdistance between 20Cm and 40m 00122 } else if (avgdistance >= (r1*c) && avgdistance <= (r2*c)) { //r1 3 and r2 20 00123 alert = 6; ///alert 6 when avgdistance between 1 and 20 00124 } else if (avgdistance <=(r1*c)) { 00125 alert = 7; ///alert 7 when avgdistance below 1Cm 00126 if (check_flag ==0) { 00127 save(); 00128 } 00129 check_flag = 1; 00130 } else { 00131 alert = 0; /// alert 0 all else 00132 } 00133 } 00134 void lcdoutput() 00135 { 00136 // if alert == 0 no need to display range path is clear 00137 if (alert == 0) { 00138 lcd.clear(); 00139 if (g_timer_flag_standby) { 00140 g_timer_flag_standby = 0; 00141 Traw = tmp102.get_temperature(); 00142 standby++; 00143 if (standby >2) { 00144 standby = 2; 00145 } 00146 } 00147 switch (standby) { 00148 case 0: 00149 if (check_flag == 1) { 00150 lcd.printString("COLLISIONCHECK",0,5); 00151 } 00152 lcd.printString("**PATH CLEAR**",0,0); 00153 lcd.refresh(); 00154 break; 00155 case 1: 00156 if (check_flag == 1) { 00157 lcd.printString("COLLISIONCHECK",0,5); 00158 } 00159 if (units == 0) { 00160 T = (Traw*1.8000)+32.00; 00161 sprintf(buffer3,"TEMP = %.2fF",T); 00162 sprintf(buffer2,"TEMPERATER"); 00163 } else { 00164 T=Traw; 00165 sprintf(buffer3,"TEMP = %.2fC",T); 00166 sprintf(buffer2,"TEMPERATER"); 00167 } 00168 lcd.printString(buffer3,4,3); 00169 lcd.printString(buffer2,12,2); 00170 lcd.refresh(); 00171 break; 00172 case 2: 00173 if (check_flag == 1) { 00174 lcd.printString("COLLISIONCHECK",0,5); 00175 } 00176 if (units == 0) { 00177 T = (Traw*1.8000)+32.00; 00178 sprintf(buffer3,"TEMP = %.2fF",T); 00179 sprintf(buffer2,"TEMPERATER"); 00180 } else { 00181 T=Traw; 00182 sprintf(buffer3,"TEMP = %.2fC",T); 00183 sprintf(buffer2,"TEMPERATER"); 00184 } 00185 lcd.printString(buffer3,4,3); 00186 lcd.printString(buffer2,12,2); 00187 lcd.refresh(); 00188 lcd.setBrightness(0); 00189 break; 00190 } //close switch 00191 } else { 00192 //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar 00193 lcd.setBrightness(bright); 00194 standby = 0; 00195 lcd.clear(); 00196 if (units == 1) { 00197 sprintf(buffer2,"%0.2f Cm",avgdistance); 00198 } else { 00199 sprintf(buffer2,"%0.2f In",avgdistance); 00200 } 00201 lcd.printString(buffer2,22,2); 00202 lcd.printString("****RANGE!****",0,0); 00203 lcd.printString("DISTANCE",18,1); 00204 lcd.printString("Menu",0,5); 00205 float h; 00206 h = (r7*c)/84; ///Maps length of bar to largest set range r7 00207 distbar = (avgdistance*h)-2; 00208 //drawRect(int x0,int y0,int width,int height,int fill); 00209 lcd.drawRect(0,29,distbar,7,1); // 00210 // serial.printf("H = %f, r7 = %i",h,r7); 00211 // serial.printf("distbar %f",distbar); 00212 lcd.refresh(); 00213 } 00214 }//close function 00215 00216 00217 void setleds() 00218 { 00219 int flash = 0; ///Variable to toggle LEDs high low 00220 if (g_timer_flag_led) { 00221 g_timer_flag_led = 0; 00222 flash = !flash; // if it has, clear the flag 00223 } 00224 if(Alertlevel [alert].fa_led == HIGH) { 00225 a_led = flash; 00226 } else { 00227 a_led = Alertlevel [alert].sa_led; 00228 } 00229 if (Alertlevel [alert].frr_led == HIGH) { 00230 rr_led = flash; 00231 } else { 00232 rr_led = Alertlevel [alert].srr_led; 00233 } 00234 if(Alertlevel [alert].fgg_led == HIGH) { 00235 gg_led = flash; 00236 } else { 00237 gg_led = Alertlevel [alert].sgg_led; 00238 } 00239 } 00240 00241 void setbuzzer () 00242 { 00243 /** 00244 control the PWM to drive the buzzer 00245 @param buzzer.period frequncy 1KHz 00246 @param buzzer duty cycle equal on/off max volume 00247 @param Alertlevel[alert].toneon controls how long the tone will last depending on alert 00248 */ 00249 buzzer.period (1.0/1000.0); 00250 buzzer = 0.5; 00251 buzzoff.attach(&flip, Alertlevel [alert].toneon); 00252 } 00253 00254 void flip() 00255 { 00256 buzz_flag = 1; 00257 buzzer = 0.0; 00258 buzzon.attach(&buzzflag, Alertlevel [alert].toneoff); 00259 } 00260 00261 void buzzflag() 00262 { 00263 buzz_flag = 0; 00264 return; 00265 } 00266 00267 void backlight () 00268 { 00269 if (bright == 1.0) { 00270 bright = 0; 00271 } else { 00272 bright += 0.2; 00273 } 00274 lcd.setBrightness(bright); 00275 } 00276 00277 void menu() 00278 { 00279 while(1) { 00280 if (g_sw1_flag) { 00281 g_sw1_flag = 0; 00282 page++; // Moves page 00283 lcd.clear(); 00284 } 00285 switch (page) { 00286 case 0: 00287 if (g_sw2_flag) { 00288 g_sw2_flag = 0; // if it has, clear the flag 00289 backlight(); 00290 lcd.clear(); 00291 } 00292 int lightbar = bright*84; 00293 sprintf(buffer2,"%.0f%%",bright*100); 00294 lcd.drawRect(0,26,lightbar,7,1); // move bar up!!!!!!!!!!!!!!!! 00295 lcd.printString("BACKLIGHT",0,1); 00296 lcd.printString(buffer2,0,2); 00297 lcd.printString("NEXT ADJ",0,5); 00298 lcd.refresh(); 00299 break; 00300 case 1: 00301 if (g_sw2_flag) { 00302 g_sw2_flag = 0; // if it has, clear the flag 00303 if (offset == 20) { 00304 offset = 0; 00305 lcd.clear(); 00306 } else { 00307 offset += 1; 00308 } 00309 } 00310 sprintf(buffer2,"%i",offset); 00311 lcd.printString("OFFSET",0,1); 00312 sprintf(buffer4,"NEXT ADJ"); 00313 lcd.printString(buffer4,0,5); 00314 break; 00315 case 2: 00316 if (g_sw2_flag) { 00317 g_sw2_flag = 0; // if it has, clear the flag 00318 if (units == 1) { 00319 units = 0; 00320 c = 0.3937; 00321 } else { 00322 units = 1; 00323 c = 1; 00324 lcd.clear(); 00325 } 00326 } 00327 if (units == 0) { 00328 sprintf(buffer2,"IMPERIAL"); 00329 } else { 00330 sprintf(buffer2,"METRIC"); 00331 } 00332 lcd.printString("NEXT ADJ",0,5); 00333 lcd.printString("UNITS",0,1); 00334 break; 00335 case 3: 00336 if (g_sw2_flag) { 00337 g_sw2_flag = 0; // if it has, clear the flag 00338 check_flag =0; 00339 lcd.clear(); 00340 } 00341 if (check_flag == 0) { 00342 sprintf(buffer2,"COLLISION"); 00343 lcd.printString("NO",0,1); 00344 sprintf(buffer4,"NEXT "); 00345 } else { 00346 sprintf(buffer2,"COLLISION"); 00347 lcd.printString("CLEAR",0,1); 00348 sprintf(buffer4,"NEXT CLEAR"); 00349 } 00350 00351 lcd.printString(buffer4,0,5); 00352 break; 00353 case 4: 00354 if (g_sw2_flag) { 00355 g_sw2_flag = 0; // if it has, clear the flag 00356 bright = 1.0; 00357 offset = 0; 00358 units = 1; 00359 r1 = 03;// Upper limit of alert 1 00360 r2 = 10;// Upper limit of alert 2 00361 r3 = 20;// Upper limit of alert 3 00362 r4 = 30;// Upper limit of alert 4 00363 r5 = 50;// Upper limit of alert 5 00364 r6 = 60;// Upper limit of alert 6 00365 r7 = 80;// Upper limit of alert 7 00366 lcd.clear(); 00367 lcd.printString("SETTINGS",0,1); 00368 lcd.printString("RESET",0,2); 00369 wait(1); 00370 return; 00371 } 00372 sprintf(buffer2,"SETTINGS"); 00373 lcd.printString("RESET",0,1); 00374 lcd.printString("NEXT RESET",0,5); 00375 break; 00376 case 5: 00377 if (g_sw2_flag) { 00378 g_sw2_flag = 0; // if it has, clear the flag 00379 submenu(); 00380 } 00381 sprintf(buffer2,"PARAMETERS"); 00382 lcd.printString("RANGE",0,1); 00383 lcd.printString("EXIT ADJ",0,5); 00384 break; 00385 default: 00386 lcd.clear(); 00387 save (); 00388 lcd.printString(" SAVING ",0,2); 00389 lcd.printString(" SETTINGS ",0,3); 00390 wait (1); 00391 return; 00392 }// switch bracket 00393 lcd.printString(buffer2,0,2); 00394 lcd.printString("*****MENU*****",0,0); 00395 lcd.refresh(); 00396 }//while braket 00397 }//functon bracket 00398 00399 void submenu() 00400 { 00401 while(1) { 00402 /// interupt used to shift page 00403 if (g_sw1_flag) { 00404 g_sw1_flag = 0; 00405 subpage++; 00406 } 00407 switch (subpage) { ///interupt used to adjust range 00408 case 0: 00409 if (g_sw2_flag) { 00410 g_sw2_flag = 0; // if it has, clear the flag 00411 if (r2 == r3) { 00412 r2 = 3; 00413 } else { 00414 r2 = r2+1; 00415 } 00416 } 00417 sprintf(buffer4,"1Cm to %iCm",r2); 00418 lcd.printString("*****MENU*****",0,0); 00419 lcd.printString("RANGE",0,1); 00420 lcd.printString("PARAMETERS",0,2); 00421 lcd.printString(buffer4,0,3); 00422 lcd.printString("NEXT ADJ",0,5); 00423 break; 00424 case 1: 00425 if (g_sw2_flag) { 00426 g_sw2_flag = 0; // if it has, clear the flag 00427 if (r3 == r4) { 00428 r3 = r2; 00429 } else { 00430 r3 += 1; 00431 } 00432 } 00433 sprintf(buffer4,"%iCm to %iCm",r2,r3); 00434 lcd.printString("*****MENU*****",0,0); 00435 lcd.printString("RANGE",0,1); 00436 lcd.printString("PARAMETERS",0,2); 00437 lcd.printString(buffer4,0,3); 00438 lcd.printString("NEXT ADJ",0,5); 00439 break; 00440 case 2: 00441 if (g_sw2_flag) { 00442 g_sw2_flag = 0; // if it has, clear the flag 00443 if (r4 == r5) { 00444 r4 = r3; 00445 } else { 00446 r4 += 1; 00447 } 00448 } 00449 sprintf(buffer4,"%iCm to %iCm",r3,r4); 00450 lcd.printString("*****MENU*****",0,0); 00451 lcd.printString("RANGE",0,1); 00452 lcd.printString("PARAMETERS",0,2); 00453 lcd.printString(buffer4,0,3); 00454 lcd.printString("NEXT ADJ",0,5); 00455 break; 00456 case 3: 00457 if (g_sw2_flag) { 00458 g_sw2_flag = 0; // if it has, clear the flag 00459 if (r5 == r6) { 00460 r5 = r4; 00461 } else { 00462 r5 += 1; 00463 } 00464 } 00465 sprintf(buffer4,"%iCm to %iCm",r4,r5); 00466 lcd.printString("*****MENU*****",0,0); 00467 lcd.printString("RANGE",0,1); 00468 lcd.printString("PARAMETERS",0,2); 00469 lcd.printString(buffer4,0,3); 00470 lcd.printString("NEXT ADJ",0,5); 00471 break; 00472 case 4: 00473 if (g_sw2_flag) { 00474 g_sw2_flag = 0; // if it has, clear the flag 00475 if (r6 == r7) { 00476 r6 = r5; 00477 } else { 00478 r6 += 1; 00479 } 00480 } 00481 sprintf(buffer4,"%iCm to %iCm",r5,r6); 00482 lcd.printString("*****MENU*****",0,0); 00483 lcd.printString("RANGE",0,1); 00484 lcd.printString("PARAMETERS",0,2); 00485 lcd.printString(buffer4,0,3); 00486 lcd.printString("NEXT ADJ",0,5); 00487 break; 00488 case 5: 00489 if (g_sw2_flag) { 00490 g_sw2_flag = 0; // if it has, clear the flag 00491 if (r7 == 300) { 00492 r7 = r6; 00493 } else { 00494 r7 += 1; 00495 } 00496 } 00497 sprintf(buffer4,"%iCm to %iCm",r6,r7); 00498 lcd.printString("*****MENU*****",0,0); 00499 lcd.printString("RANGE",0,1); 00500 lcd.printString("PARAMETERS",0,2); 00501 lcd.printString(buffer4,0,3); 00502 lcd.printString("EXIT ADJ",0,5); 00503 break; 00504 default: 00505 lcd.clear(); 00506 return; 00507 }//switch breaket 00508 }//while bracket 00509 }//function bracket 00510 00511 void save() 00512 { 00513 fp = fopen("/sd/settings.txt", "w"); 00514 if (fp == NULL) { // if it can't open the file then print error message 00515 serial.printf("Error! Unable to open file!\n"); 00516 } else { // opened file so can write 00517 serial.printf("Writing to file...."); 00518 fprintf(fp, "%f,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i",bright,units,offset,check_flag,r1,r2,r3,r4,r5,r6,r7); // ensure data type matches 00519 serial.printf("Done.\n"); 00520 fclose(fp); // ensure you close the file after writing 00521 } 00522 } 00523 00524 void setup() 00525 { 00526 serial.baud(115200); // full-speed! 00527 ticker.attach(&timer_isr_led,0.35); /// Attach the ticker for the flashig LEDs 00528 ticker_srf02.attach(&timer_isr_srf02,0.2);/// Attach the ticker for collecting a range reading 00529 ticker_standby.attach(&timer_isr_standby,5.0); 00530 sw1.rise(&sw1_isr); /// sw1_isr called when button presed on the rising edge 00531 sw2.rise(&sw2_isr); /// sw2_isr called when button presed on the rising edge 00532 r_led = 1; //Onboard leds 00533 b_led = 1; //Onboard leds 00534 g_led = 1; //Onboard leds 00535 rr_led = 0; //PCB LEDS 00536 a_led = 0; //PCB LEDS 00537 gg_led = 0; //PCB LEDS 00538 sw2.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons 00539 sw1.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons 00540 } 00541 00542 void sw2_isr() 00543 { 00544 g_sw2_flag = 1; /** set flag in ISR by button 2 @param g_sw2_flag 0 or 1*/ 00545 } 00546 00547 void sw1_isr() 00548 { 00549 g_sw1_flag = 1; /** set flag in ISR by button 2 @param g_sw1_flag 0 or 1*/ 00550 } 00551 00552 void timer_isr_led() 00553 { 00554 g_timer_flag_led = 1; /** set flag in ISR by timer_isr_led @param g_timer_flag_led 0 or 1 */ 00555 } 00556 00557 void timer_isr_srf02() 00558 { 00559 g_timer_flag_srf02 = 1; /** set flag in ISR by ticker_srf02 @param g_timer_flag_srf02 0 or 1 */ 00560 } 00561 00562 void timer_isr_standby() 00563 { 00564 g_timer_flag_standby = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */ 00565 }
Generated on Thu Jul 14 2022 23:13:41 by 1.7.2