Level 2 Project Range Device
Dependencies: N5110 SDFileSystem SRF02 TMP102 mbed
Diff: main.h
- Revision:
- 7:14cfb0df30e6
- Child:
- 8:fe6ebe807b9d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Mon Apr 25 10:08:05 2016 +0000 @@ -0,0 +1,489 @@ +/** +@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 +#define METRIC 1 +#define IMPERIAL 0 + + +/** +@namespace LEDs +@brief Output for Alert LEDs +*/ +/** Red LED connect to pin PTA1*/ +DigitalOut rr_led (PTA1); +/** amber LED connect to pin PTC2*/ +DigitalOut a_led (PTC2); +/** Green LED connect to pin PTB23*/ +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 time outs +*/ +Ticker ticker; +Ticker ticker_srf02; +Ticker ticker_tone; +Ticker ticker_standby; +Timeout buzzoff; + +// 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 + +/** +@namespace TimerFlags +@brief Flags for use with timed interupts +*/ +volatile int g_timer_flag_led = 0, g_timer_flag_srf02 = 0, g_timer_flag_tone = 0; /** Flag rised by interupts*/ +volatile int g_timer_flag_standby = 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 +*/ +int r1 = 3,/*!< Upper limit of alert 1 */r2 = 20,/*!< Upper limit of alert 2 */r3 = 40,/*!< Upper limit of alert 3 */r4 = 60,/*!< Upper limit of alert 4 */r5 = 80,/*!< Upper limit of alert 5 */r6 = 100,/*!< Upper limit of alert 6 */r7 = 120; /*!< Upper limit of alert 7 */ + +FILE *fp; + +int myarray[9];/*!< array to hold last ten range readings */ +int d =0; +int t; +int i; +float avgdistance; +int totaldistance; +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;/*!< veriable to hold the current LED backlight of the 5110 LCD */ +char units = METRIC;/*!< 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]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) +float T; +int standby =1; +float c =1; /// convertion factor from Cm to inch + + +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 + int toneon; + int 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,1,8}, //flash green + {LOW,LOW,HIGH,LOW,LOW,LOW,2,7}, //steady green + {LOW,LOW,HIGH,LOW,HIGH,LOW,4,5}, //flash amber + {LOW,HIGH,HIGH,LOW,LOW,LOW,6,3}, //steady amber + {LOW,HIGH,HIGH,HIGH,LOW,LOW,8,1}, //flash red + {HIGH,HIGH,HIGH,LOW,LOW,LOW,9,0},// steady red + {LOW,LOW,LOW,HIGH,HIGH,HIGH,9,0} // all flash +};/*!< Array contaning structures for diffent outputs */ + + +void lcdoutput(); +void timer_isr_led(); +void timer_isr_srf02(); +void timer_isr_tone(); +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 init_K64F(); +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 == METRIC) { + units = IMPERIAL; + } else { + units = METRIC; + } + } + 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"); + 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(); + void standby1(); + +#endif \ No newline at end of file