Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
main.cpp
- Committer:
- el15pjt
- Date:
- 2016-04-27
- Revision:
- 8:fe6ebe807b9d
- Parent:
- 7:14cfb0df30e6
- Child:
- 9:bc259fc22fa2
File content as of revision 8:fe6ebe807b9d:
/** @file main.cpp @brief Program implementation */ #include "main.h" #include "SDFileSystem.h" //Serial serial(USBTX, USBRX); // for PC debug int main() { int d = 0; int myarray[9]; setup(); lcd.init(); // Initiate LCD /* sprintf(buffer,"ELEC 2645"); sprintf(buffer1,"Project Ranger"); sprintf(buffer2,"Phil Thompson"); sprintf(buffer3,"SID 200971914 "); lcd.printString(buffer,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); lcd.printString(buffer3,0,3); wait (3); */ /* serial.baud(115200); // full-speed! serial.printf("#### SD Card Example #####\n"); FILE *fp; // this is our file pointer wait(1); { /////////////////////// Reading from file example //////////////////////// // now open file for reading...note the 'r' fp = fopen("/sd/settings.txt", "r"); if (fp == NULL) { // if it can't open the file then print error message serial.printf("Error! Unable to open file!\n"); } else { serial.printf("Reading file....\n"); int r1; int r2; int r3; int r4; int r5; int r6; int r7; int offset; float bright; float value; int i; // in this example, we keep reading (using fscanf) until we reach // the 'end of file'. Note we use the address operator & to write // to the variables. Also the format of the string must match what // is in the file while (fscanf(fp, "%d,%f", &i, &value) != EOF) { serial.printf("%d,%f\n",i,value); } serial.printf("Done.\n"); fclose(fp); // ensure you close the file after reading } } */ while(1) { if (g_sw1_flag) { /// Event triggered inturupt to call the menu and reset page numbers g_sw1_flag = 0; page = 0; subpage = 0; lcd.clear(); menu(); } if (g_timer_flag_srf02) { g_timer_flag_srf02 = 0; // if it has, clear the flag if (units == METRIC) { distance = srf02.getDistanceCm(); distance = distance-(offset*c); } else { distance = srf02.getDistannceInch(); distance = distance -(offset*c); } if (d == 10) { d = 0; } else { d++; } myarray[d] = distance; int totaldistance = 0; for (int i = 0; i < 9; i++) { int totaldistance = totaldistance+myarray[i]; } avgdistance = totaldistance/9; } setalert(); lcdoutput(); if (!alert == 0) { if (buzz_flag == 0) { setbuzzer(); } } setleds(); sleep(); } } void lcdoutput() { /** Function called to print to the LCD display @param i used to scale the max distaance to the width of the screen @param distance Distance read from sensor to be dispayed @param distbar used to adjust how far along the screen the bar is to go acorrding to distance */ // if alert == 0 no need to display range path is clear if (alert == 0) { if (g_timer_flag_standby) { g_timer_flag_standby = 0; T = tmp102.get_temperature(); standby++; if (standby >3) { standby = 3; } } switch (standby) { case 1: if (check_flag == 1) { sprintf(buffer4,"COLLISIONCHECK"); } lcd.clear(); sprintf(buffer,"**PATH CLEAR**"); lcd.printString(buffer,0,0); lcd.printString(buffer4,0,5); lcd.refresh(); break; case 2: if (check_flag == 1) { sprintf(buffer4,"COLLISIONCHECK"); } lcd.clear(); sprintf(buffer3,"TEMP = %.2f",T); sprintf(buffer2,"TEMPERATER"); lcd.printString(buffer3,4,2); lcd.printString(buffer2,12,1); lcd.printString(buffer4,0,5); break; case 3: if (check_flag == 1) { sprintf(buffer4,"COLLISIONCHECK"); } lcd.clear(); sprintf(buffer3,"TEMP = %.2f",T); sprintf(buffer2,"TEMPERATER"); lcd.refresh(); lcd.printString(buffer3,4,2); lcd.printString(buffer2,12,1); lcd.printString(buffer4,0,5); lcd.setBrightness(0); break; } } //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar else { lcd.setBrightness(bright); standby =0; lcd.clear(); if (units == METRIC) { sprintf(buffer,"%0.2f Cm",avgdistance); sprintf(buffer1,"****RANGE!****"); sprintf(buffer2,"DISTANCE"); sprintf(buffer4,"Menu"); } else { sprintf(buffer,"%0.2f Inches",avgdistance); sprintf(buffer1,"****RANGE!****"); sprintf(buffer2,"***DISTANCE***"); sprintf(buffer4,"Menu"); } lcd.printString(buffer,25,2); lcd.printString(buffer1,0,0); lcd.printString(buffer2,16,1); lcd.printString(buffer4,0,5); float h = (r7/84); float distbar = (avgdistance*h); //drawRect(int x0,int y0,int width,int height,int fill); lcd.drawRect(0,29,distbar,7,1); // lcd.refresh(); } } void setalert() { /** A fuction used to determin the alert level given a range with the use of IF statments @param distance The distance read from sensor @param alert The level that distance falls with in 0 -7 @returns alert */ if (avgdistance >= (r6*c) && avgdistance < (r7*c)) { // r6 150 and r7 200 alert = 1; /// alert 1 avgdistance between preset 150Cm to 200Cm } else if (avgdistance >= (r5*c) && avgdistance < (r6*c)) { alert = 2; /// alert 2 when between preset 90Cm to 150Cm } else if (avgdistance >= (r4*c) && avgdistance < (r5*c)) { alert = 3; /// alert 3 when avgdistance between 60Cm to 90Cm } else if (avgdistance >= (r3*c) && avgdistance < (r4*c)) { alert = 4; /// alert 4 when avgdistance between 40Cm and 60Cm } else if (avgdistance >= (r2*c) && avgdistance < (r3*c)) { alert = 5; ///alert 5 when avgdistance between 20Cm and 40m } else if (avgdistance >= (r1*c) && avgdistance <= (r2*c)) { //r1 3 and r2 20 alert = 6; ///alert 6 when avgdistance between 1 and 20 } else if (avgdistance <=(r1*c)) { alert = 7; ///alert 7 when avgdistance below 1Cm check_flag = 1; } else { alert = 0; /// alert 0 all else } } void setleds() { if (alert ==7) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag rr_led = !rr_led; gg_led = !gg_led; a_led = !a_led; } } else if(Alertlevel[alert].fa_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag a_led = !a_led; } } else if (Alertlevel[alert].frr_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag rr_led = !rr_led; } } else if(Alertlevel[alert].fgg_led == HIGH) { if (g_timer_flag_led) { g_timer_flag_led = 0; // if it has, clear the flag gg_led = !gg_led; } } else { rr_led = Alertlevel[alert].srr_led; a_led = Alertlevel[alert].sa_led; gg_led = Alertlevel[alert].sgg_led; } } void setbuzzer() { /** control the PWM to drive the buzzer @param buzzer.period frequncy 1KHz @param buzzer duty cycle equal on/off max volume @param Alertlevel[alert].toneon controls how long the tone will last depending on alert */ buzzer.period (1.0/1000.0); buzzer = 0.5; buzzoff.attach(&flip, Alertlevel[alert].toneon); } void flip() { buzz_flag = 1; buzzer = 0.0; buzzon.attach(&buzzflag,Alertlevel[alert].toneoff); } void buzzflag() { buzz_flag = 0; return; } void backlight () { if (bright == 1.0) { bright = 0; } else { bright += 0.2; } lcd.setBrightness(bright); } void sw2_isr() { g_sw2_flag = 1; /** set flag in ISR by button 2 @param g_sw2_flag 0 or 1*/ } void sw1_isr() { g_sw1_flag = 1; /** set flag in ISR by button 2 @param g_sw1_flag 0 or 1*/ } void timer_isr_led() { g_timer_flag_led = 1; /** set flag in ISR by timer_isr_led @param g_timer_flag_led 0 or 1 */ } void timer_isr_srf02() { g_timer_flag_srf02 = 1; /** set flag in ISR by ticker_srf02 @param g_timer_flag_srf02 0 or 1 */ } void timer_isr_tone() { g_timer_flag_tone = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */ } void timer_isr_standby() { g_timer_flag_standby = 1; /** set flag in ISR by ticker_tone @param g_timer_flag_tone 0 or 1 */ } void menu() { while(1) { if (g_sw1_flag) { g_sw1_flag = 0; page++; /// Moves page lcd.clear(); } switch (page) { case 0: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag backlight(); lcd.clear(); } else { int lightbar = bright*84; sprintf(buffer2,"*****MENU*****"); sprintf(buffer1,"BACKLIGHT"); sprintf(buffer3,"%.0f%%",bright*100); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,5); lcd.drawRect(0,26,lightbar,7,1); // move bar up!!!!!!!!!!!!!!!! lcd.refresh(); } break; case 1: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (offset == 20) { offset = 0; } else { offset += 1; } } else { length2 = sprintf(buffer2,"*****MENU*****"); length1 = sprintf(buffer1,"OFFSET"); length3 = sprintf(buffer3,"%i",offset); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,5); lcd.refresh(); } break; case 2: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (units == METRIC) { units = IMPERIAL; c= 0.3937; } else { units = METRIC; c = 1; } } if (units == METRIC) { sprintf(buffer3,"METRIC"); lcd.printString(buffer3,0,2); } else { sprintf(buffer3,"IMPERIAL"); lcd.printString(buffer3,0,2); } sprintf(buffer2,"*****MENU*****"); sprintf(buffer1,"UNITS"); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer4,0,5); lcd.refresh(); break; case 3: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag check_flag =0; } length2 = sprintf(buffer3,"*****MENU*****"); length3 = sprintf(buffer1,"CLEAR"); length3 = sprintf(buffer2,"COLLISION"); sprintf(buffer4,"NEXT YES"); lcd.printString(buffer3,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); lcd.printString(buffer4,0,5); break; case 4: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag submenu(); } length2 = sprintf(buffer3,"*****MENU*****"); length3 = sprintf(buffer1,"RANGE"); length3 = sprintf(buffer2,"PARAMETERS"); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer3,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); lcd.printString(buffer4,0,5); break; default: lcd.clear(); /* //save(); ///////////////////// Writing list to file example ////////////////////// // for this example, I'll create some numbers to write to file in a big list // a data logger for example will usually append to a file - at a reading // at the end rather than creating a new file fp = fopen("/sd/settinngs.txt", "a"); if (fp == NULL) { // if it can't open the file then print error message serial.printf("Error! Unable to open file!\n"); } else { // opened file so can write serial.printf("Writing to file...."); for(int i = 1; i <= 50; i++) { int r1; int r2; int r3; int r4; int r5; int r6; int r7; int offset; // create suitable variables to store the data in the file float bright; float dummy = 1000.0F/i; // dummy variable fprintf(fp, "%d,%f\n",i,dummy); // print formatted string to file (CSV) } serial.printf("Done.\n"); fclose(fp); // ensure you close the file after writing } // you can comment out the writing example to check that the writing has // worked - when you run it after commenting, it should still open the // file that exists on the SD card - assuming you didn't delete it! */ return; } } } void submenu() { while(1) { /// innterupt used to shift page if (g_sw1_flag) { g_sw1_flag = 0; subpage++; } switch (subpage) { ///interupt used to adjust range case 0: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r2 == r3) { r2 = 1; } else { r2 = r2+1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length4 = sprintf(buffer4,"1Cm to %iCm",r2); sprintf(buffer,"NEXT ADJ"); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; case 1: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r3 == r4) { r3 = r2; } else { r3 += 1; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); sprintf(buffer4,"%iCm to %iCm",r2,r3); sprintf(buffer,"NEXT ADJ"); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; case 2: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r4 == r5) { r4 = r3; } else { r4 += 1; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); sprintf(buffer4,"%iCm to %iCm",r3,r4); sprintf(buffer,"NEXT ADJ"); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; case 3: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r5 == r6) { r5 = r4; } else { r5 += 1; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); sprintf(buffer4,"%iCm to %iCm",r4,r5); sprintf(buffer,"NEXT ADJ"); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; case 4: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r6 == r7) { r6 = r5; } else { r6 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); length3 = sprintf(buffer4,"%iCm to %iCm",r5,r6); sprintf(buffer,"NEXT ADJ"); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; case 5: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (r7 == 300) { r7 = r6; } else { r7 += 1; } } length2 = sprintf(buffer1,"*****MENU*****"); length3 = sprintf(buffer2,"RANGE"); length3 = sprintf(buffer3,"PARAMETERS"); sprintf(buffer,"NEXT ADJ"); length3 = sprintf(buffer4,"%iCm to %iCm",r6,r7); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); lcd.printString(buffer,0,5); break; default: lcd.clear(); // save(); return; } } } void setup() { ticker.attach(&timer_isr_led,0.35); /// Attach the ticker for the flashig LEDs ticker_srf02.attach(&timer_isr_srf02,0.1); /// Attach the ticker for collecting a range reading // ticker_tone.attach(&timer_isr_tone,0.1); /// Attach the ticker which controls the off time of the buzzer 0.1 = 10 beats per second ticker_standby.attach(&timer_isr_standby,3.0); sw1.rise(&sw1_isr); /// sw1_isr called when button presed on the rising edge sw2.rise(&sw2_isr); /// sw2_isr called when button presed on the rising edge r_led = 1; b_led = 1; g_led = 1; rr_led = 0; a_led = 0; gg_led = 0; sw2.mode(PullDown); sw1.mode(PullDown); }