Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Fork of Ranger by
main.h
- Committer:
- el15pjt
- Date:
- 2016-05-04
- Revision:
- 10:c9f3c22368f1
- Parent:
- 9:bc259fc22fa2
- Child:
- 11:b64d123b9f4f
File content as of revision 10:c9f3c22368f1:
/** @file main.h @brief Header file containing functions prototypes, defines and global variables. @brief Ranger Project @brief Revision 1.0. @author Philip Thompson @date March 2016 @brief The following code has been writen for the University of Leeds ELEC264501 embedded system project and is intended to create a programe that can read a distance from an SRF02 sensor and then based aponn the reading disply the distance on the screen and increment the LEDs and buzzer according the provision of a temperature sensor is also provied as a secondary function when no object is detected with in range. */ #ifndef MAIN_H #define MAIN_H #include "mbed.h" #include "mbed.h" #include "SRF02.h" #include "N5110.h" #include "TMP102.h" #include "SDFileSystem.h" #define LOW 0 /// No output #define HIGH 1 /// High output /** @namespace LEDs @brief Output for Alert LEDs */ DigitalOut rr_led (PTA1); DigitalOut a_led (PTC2); DigitalOut gg_led(PTB23); /** @namespace BOARDLEDs @brief On board LEDs */ DigitalOut r_led(LED_RED); DigitalOut g_led(LED_GREEN); DigitalOut b_led(LED_BLUE); /** @namespace Buzzer @brief PWM output for Buzzer */ PwmOut buzzer(PTA2); /** @namespace Buttons @brief Button triggered Interrupts */ InterruptIn sw1(PTB19); InterruptIn sw2(PTB18); /** @namespace Timers @brief Tickers and Timeouts */ Ticker ticker; Ticker ticker_srf02; Ticker ticker_standby; Timeout buzzoff; Timeout buzzon; // Create TMP102 object TMP102 tmp102(I2C_SDA,I2C_SCL); /** @namespace Ranger @brief Creat the Ranger object */ SRF02 srf02(I2C_SDA,I2C_SCL); /** @namespace LCD @brief Creats the LCD object */ N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3); /// Connections to SD card holder on K64F (SPI interface) SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS FILE *fp; /** @namespace TimerFlags @brief Flags for use with timed interupts */ volatile int g_timer_flag_led = 0, g_timer_flag_srf02 = 0; /** Flag rised by interupts*/ volatile int g_timer_flag_standby = 0; volatile int buzz_flag = 0; /** @namespace ButtonFlages @brief Flags for use with button interupts */ volatile int g_sw1_flag = 0, g_sw2_flag = 0; /** @namespace RangePresets @brief Preset range of the differant alert levels */ float Traw; int totaldistance; int r1 = 03;/// Upper limit of alert 1 int r2 = 10;/// Upper limit of alert 2 int r3 = 20;/// Upper limit of alert 3 int r4 = 35;/// Upper limit of alert 4 int r5 = 50;/// Upper limit of alert 5 int r6 = 65;/// Upper limit of alert 6 int r7 = 80;/// Upper limit of alert 7 float avgdistance =0; // Averaged Distance vale from ten previous readings int subpage; ///< veriable to hold the page being viewed with in the submenu int page;/// veriable to hold the page being viewed with in the menu int offset = 0;/// veriable to hold the offset and adjust the 0 Range point int alert;/// veriable to hold the current alert level int distance;/// veriable to hold the distance read from the srf02 sensor float bright = 1.0;/// veriable to hold the current LED backlight of the 5110 LCD int units = 1;/// veriable to hold the current unit type set to METRIC as default //int length, length1, length2, length3, length4; // char buffer[14], buffer1[14], buffer2[14], buffer3[14], buffer4[14],buffer5[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) not ended globale but reused frquently throuh out float T; /// Temperature value retured from TMP102 sensor int standby = 0; ///????????????????????? float c =1; /// convertion factor from Cm to inch 1 = metric no convertion int check_flag = 0; ///??????????? float distbar; int flash = 0; struct Alertlevel { char srr_led; /// stead RED LED state char sa_led; /// stead AMBER LED state char sgg_led; /// stead GREEN LED state char frr_led;///FLASHING RED LED state char fa_led; ///FLASHING AMBER LED state char fgg_led; ///FLASHING GREEN LED state float toneon; float toneoff; }; /*!< Stucture to hold all outputs. Steady LEDs, Flashing LEDs, Tone on, Tonne off*/ typedef const struct Alertlevel STyp; STyp Alertlevel[8] = { {LOW,LOW,LOW,LOW,LOW,LOW,0,1}, // no output {LOW,LOW,LOW,LOW,LOW,HIGH,0.1,1.0}, //flash green {LOW,LOW,HIGH,LOW,LOW,LOW,0.1,0.5}, //steady green {LOW,LOW,HIGH,LOW,HIGH,LOW,0.1,0.25}, //flash amber {LOW,HIGH,HIGH,LOW,LOW,LOW,0.1,0.1}, //steady amber {LOW,HIGH,HIGH,HIGH,LOW,LOW,0.2,0.1}, //flash red {HIGH,HIGH,HIGH,LOW,LOW,LOW,0.1,0.05},// steady red {LOW,LOW,LOW,HIGH,HIGH,HIGH,1,0} // all flash };/*!< Array contaning structures for diffent outputs */ void flip(); void buzzflag(); /** Controls the LCD while not in a Menu 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 @code 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 == 1) { 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(); @endcode */ void lcdoutput(); void save(); void timer_isr_led(); void timer_isr_srf02(); void timer_isr_standby(); /** Called to increment to brightness by 0.2 each time when at 1 resets back to 0.0 @param bright 0.0-1 @returns lcd.setbrightness @code if (bright == 1.0) { bright = 0; } else { bright += 0.2; } lcd.setBrightness(bright); @endcode */ void backlight(); void sw2_isr(); void sw1_isr(); void setup(); /** 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 @code if (distance >= r6 && distance < r7) { // r6 150 and r7 200 alert = 1; /// alert 1 distance between preset 150Cm to 200Cm } else if (distance >= r5 && distance < r6) { alert = 2; /// alert 2 when between preset 90Cm to 150Cm } else if (distance >= r4 && distance < r5) { alert = 3; /// alert 3 when distance between 60Cm to 90Cm } else if (distance >= r3 && distance < r4) { alert = 4; /// alert 4 when distance between 40Cm and 60Cm } else if ( distance > r2 && distance < r3) { alert = 5; ///alert 5 when distance between 20Cm and 40m } else if (distance > r1 && distance <= r2) { //r1 3 and r2 20 alert = 6; ///alert 6 when distance between 1 and 20 } else if (distance <=r1) { alert = 7; ///alert 7 when distance below 1Cm } else { alert = 0; /// alert 0 all else } } @endcode */ void setalert(); /** If statments to determine the output of each LED by inspecting the struct in the relevent element of the alertlevel array @code 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; } } @endcode*/ void setleds(); void setbuzzer(); void menu(); /** { Function called to invoke a menu within a while loop with button interupts used to move pages and adjust within a switch statment @param g_sw1_flag 0 or 1 used to advance page @param g_sw2_flag 0 or 1 used to adjust current item @code 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); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.drawRect(0,38,lightbar,7,1); 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); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer3,0,2); lcd.refresh(); } break; case 2: if (g_sw2_flag) { g_sw2_flag = 0; // if it has, clear the flag if (units == 1) { units = 0; } else { units = 1; } } if (units == 1) { sprintf(buffer3,"METRIC"); lcd.printString(buffer3,0,2); } else { sprintf(buffer3,"IMPERIAL"); lcd.printString(buffer3,0,2); } sprintf(buffer2,"*****MENU*****"); sprintf(buffer1,"UNITS"); lcd.printString(buffer2,0,0); lcd.printString(buffer1,0,1); lcd.refresh(); break; case 3: 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"); lcd.printString(buffer3,0,0); lcd.printString(buffer1,0,1); lcd.printString(buffer2,0,2); break; default: lcd.clear(); return; } } @endcode */ void menu(); /** @code 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); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); 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); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); 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); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); 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); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); 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); lcd.printString(buffer1,0,0); lcd.printString(buffer2,0,1); lcd.printString(buffer3,0,2); lcd.printString(buffer4,0,3); 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"); 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); break; default: lcd.clear(); // save(); return; } } } @endcode */ void submenu(); void save(); void load(); #endif