![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Fork of Ranger by
main.cpp
- Committer:
- el15pjt
- Date:
- 2016-05-04
- Revision:
- 9:bc259fc22fa2
- Parent:
- 8:fe6ebe807b9d
- Child:
- 10:c9f3c22368f1
File content as of revision 9:bc259fc22fa2:
/** @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[5] {9,9,9,9,9}; /// initilised to any possitive integer to prevent random values at start up triggering an alert 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 TESTING #####\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"); 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) { 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); } serial.printf("Done.\n"); fclose(fp); // ensure you close the file after reading } lcd.setBrightness(bright); wait (3); 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 == 1) { distance = srf02.getDistanceCm(); distance = distance-(offset*c); } else { distance = srf02.getDistannceInch(); distance = distance -(offset*c); //MAYBE MOVE C TO OFSET SETTING }// close else breaket } // close if inteurrupt bracket if (d == 4) { d = 0; } else { d++; } myarray[d] = distance; // serial.printf("ARRAY ELEMENT = %i", d); // serial.printf("myarray %i", myarray[d]); totaldistance =0; for (int i = 0; i < 6; i++) { totaldistance = totaldistance + myarray[i]; } avgdistance = (totaldistance/5); // serial.printf("TOATAL DISTANCE %i\n", totaldistance); // serial.printf("DISTANCE %i\n", distance); // serial.printf("AVERAGE DISTANCE %f\n", avgdistance); setalert(); // serial.printf("ALERT LEVEL %i\n", alert); 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) { lcd.clear(); if (g_timer_flag_standby) { g_timer_flag_standby = 0; Traw = tmp102.get_temperature(); standby++; if (standby >2) { standby = 2; } } switch (standby) { case 0: if (check_flag == 1) { sprintf(buffer5,"COLLISIONCHECK"); } sprintf(buffer,"**PATH CLEAR**"); lcd.printString(buffer,0,5); lcd.printString(buffer,0,0); lcd.refresh(); break; case 1: if (check_flag == 1) { sprintf(buffer5,"COLLISIONCHECK"); lcd.printString(buffer5,0,5); } if (units == 0) { T = (Traw*1.8000)+32.00; sprintf(buffer3,"TEMP = %.2fF",T); sprintf(buffer2,"TEMPERATER"); } else { T=Traw; sprintf(buffer3,"TEMP = %.2fC",T); sprintf(buffer2,"TEMPERATER"); } lcd.printString(buffer3,4,3); lcd.printString(buffer2,12,2); lcd.refresh(); break; case 2: if (check_flag == 1) { sprintf(buffer5,"COLLISIONCHECK"); lcd.printString(buffer5,0,5); } if (units == 0) { T = (Traw*1.8000)+32.00; sprintf(buffer3,"TEMP = %.2fF",T); sprintf(buffer2,"TEMPERATER"); } else { T=Traw; sprintf(buffer3,"TEMP = %.2fC",T); sprintf(buffer2,"TEMPERATER"); } lcd.printString(buffer3,4,3); lcd.printString(buffer2,12,2); lcd.refresh(); lcd.setBrightness(0); break; } //close switch } else { //If alert isn't 0 then the distance is to be dispayed alonng with the the distance bar lcd.setBrightness(bright); standby = 0; lcd.clear(); if (units == 1) { sprintf(buffer2,"%0.2f Cm",avgdistance); } else { sprintf(buffer2,"%0.2f In",avgdistance); } sprintf(buffer,"****RANGE!****"); sprintf(buffer1,"DISTANCE"); sprintf(buffer4,"Menu"); lcd.printString(buffer2,25,2); lcd.printString(buffer,0,0); lcd.printString(buffer1,16,1); lcd.printString(buffer4,0,5); int h; h = (84/r7*c); ///Maps length of bar to largest set range r7 distbar = (avgdistance*h)-2; //drawRect(int x0,int y0,int width,int height,int fill); lcd.drawRect(0,29,distbar,7,1); // serial.printf("H = %i, r7 = %i",h,r7); serial.printf("distbar %f",distbar); lcd.refresh(); } } void setalert() { 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 if (check_flag ==0) { save(); } 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.2; 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_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(); } int lightbar = bright*84; sprintf(buffer1,"BACKLIGHT"); sprintf(buffer2,"%.0f%%",bright*100); lcd.drawRect(0,26,lightbar,7,1); // move bar up!!!!!!!!!!!!!!!! lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer4,0,5); lcd.refresh(); break; case 1: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (offset == 20) { offset = 0; lcd.clear(); } else { offset += 1; } } sprintf(buffer1,"OFFSET"); sprintf(buffer2,"%i",offset); lcd.printString(buffer1,0,1); sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer4,0,5); break; case 2: sprintf(buffer1,"UNITS"); lcd.printString(buffer1,0,1); if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (units == 1) { units = 0; c = 0.3937; sprintf(buffer2,"IMPERIAL"); lcd.clear(); } else { units = 1; sprintf(buffer2,"METRIC"); c = 1; lcd.clear(); } } sprintf(buffer4,"NEXT ADJ"); lcd.printString(buffer4,0,5); break; case 3: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag check_flag =0; lcd.clear(); } if (check_flag == 0) { sprintf(buffer1,"NO"); sprintf(buffer2,"COLLISION"); lcd.printString(buffer1,0,1); sprintf(buffer4,"NEXT "); } else { sprintf(buffer1,"CLEAR"); sprintf(buffer2,"COLLISION"); lcd.printString(buffer1,0,1); sprintf(buffer4,"NEXT CLEAR"); } lcd.printString(buffer4,0,5); break; case 4: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag bright = 1.0; offset = 0; units = 1; r1 = 03;/// Upper limit of alert 1 r2 = 10;/// Upper limit of alert 2 r3 = 20;/// Upper limit of alert 3 r4 = 35;/// Upper limit of alert 4 r5 = 50;/// Upper limit of alert 5 r6 = 65;/// Upper limit of alert 6 r7 = 80;/// Upper limit of alert 7 lcd.clear(); sprintf(buffer1,"SETTINGS"); sprintf(buffer2,"RESET"); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); wait(1); return; } lcd.clear(); sprintf(buffer1,"RESET"); sprintf(buffer2,"SETTINGS"); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); sprintf(buffer4,"NEXT RESET"); lcd.printString(buffer4,0,5); lcd.refresh(); break; case 5: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag submenu(); } sprintf(buffer1,"RANGE"); sprintf(buffer2,"PARAMETERS"); lcd.printString(buffer1,0,1); sprintf(buffer4,"EXIT ADJ"); lcd.printString(buffer4,0,5); break; default: lcd.clear(); save (); sprintf(buffer3," SAVING "); lcd.printString(buffer3,0,2); sprintf(buffer4," SETTINGS "); lcd.printString(buffer4,0,3); wait (1); return; }// switch bracket sprintf(buffer,"*****MENU*****"); lcd.printString(buffer2,0,2); lcd.printString(buffer,0,0); lcd.refresh(); }//while braket }//functon bracket void save() { fp = fopen("/sd/settings.txt", "w"); 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...."); 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 serial.printf("Done.\n"); fclose(fp); // ensure you close the file after writing } } void submenu() { while(1) { /// interupt 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; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); 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; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); 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; } } sprintf(buffer1,"*****MENU*****"); sprintf(buffer2,"RANGE"); sprintf(buffer3,"PARAMETERS"); sprintf(buffer,"EXIT ADJ"); 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(); return; }//switch breaket }//while bracket }//function bracket 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_standby.attach(&timer_isr_standby,5.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; //Onboard leds b_led = 1; //Onboard leds g_led = 1; //Onboard leds rr_led = 0; //PCB LEDS a_led = 0; //PCB LEDS gg_led = 0; //PCB LEDS sw2.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons sw1.mode(PullDown); //Turns on use of the pulldown resistors for use with the PCB buttons }