Embedded Systems Project Mateusz Loboda 200843098
Dependencies: N5110 SRF02-Mateusz mbed
Revision 3:ee005c9f0348, committed 2016-05-05
- Comitter:
- el14ml
- Date:
- Thu May 05 09:54:30 2016 +0000
- Parent:
- 2:0dfa60f22f07
- Commit message:
- final version
Changed in this revision
--- a/SRF02.lib Wed May 04 22:45:02 2016 +0000 +++ b/SRF02.lib Thu May 05 09:54:30 2016 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/users/eencae/code/SRF02/#1e51f3230f2f +https://developer.mbed.org/users/el14ml/code/SRF02-Mateusz/#1e51f3230f2f
--- a/main.cpp Wed May 04 22:45:02 2016 +0000 +++ b/main.cpp Thu May 05 09:54:30 2016 +0000 @@ -6,14 +6,6 @@ * @date April 2016 */ - -//sd card -//mbed leds come on sometimes; -//make 4k mid freq -//fix buzzer beeping - - -#include "mbed.h" #include "main.h" @@ -21,80 +13,79 @@ { init_K64F(); - lcd.init(); + lcd.init(); ///initialize display - initialScreen(); - out.attach(timeout_isr,4); + initialScreen(); ///function for start up screen + out.attach(timeout_isr,4); ///intial screen displayed for 4 seconds lcd.refresh(); sleep(); lcd.clear(); lcd.refresh(); initialArray(); - ticker.attach(&ticker_isr,0.1); + ticker.attach(&ticker_isr,0.1); /// interrupt, time triggered event while(1) { - delay = rate; + delay = rate; ///value obtained from potentiometer to control the volume of buzzer - buzzerPeriod = 1/((4000-(2*averageDistance))+200); // BUZZER, 200+200 = 400 = maximum range so freq proportional to distance, org 1/(200-avg)+200 + buzzerPeriod = 1/((4200-(2*averageDistance))+200); ///frequency proportional to average distance, when distance = 200cm, frequency = 4kHz ie centre frequency if (g_ticker_flag) { - g_ticker_flag = 0; + g_ticker_flag = 0; /// reset flag if ( g_button2_flag == 0) { - buzzer = delay; // duty cycle + buzzer = delay; /// duty cycle buzzer.period(buzzerPeriod); //set pwm to my freq - // average distance calculated get_averageDistance(); redLedIndicator(); drawDistanceBars(); - + + + } else if (g_button2_flag == 1) { ///button pressed, set flag - } else if (g_button2_flag == 1) { - // lcd.clear(); - moveArrayElements(); - get_averageDistance(); - adjacentArrayElements(); - plotAxes(); - plotDistancePoint(); - // modeTwo(); + moveArrayElements(); + get_averageDistance(); + adjacentArrayElements(); + plotAxes(); + plotDistancePoint(); lcd.refresh(); } lcd.refresh(); - sleep(); + sleep(); /// reducing power consumption } } } void init_K64F() { - r_led = 1;// on-board LEDs are active-low, so set pin high to turn them off. + /// on-board LEDs are active-low, so set pin high to turn them off. + r_led = 1; g_led = 1; b_led = 1; - button2.fall(&mode); //under this condition call function where mode is a function that sets flag - button2.mode(PullUp); //enable internal pull up resistor - button1.fall(&units); //under this condition call function where mode is a function that sets flag - button1.mode(PullUp); //enable internal pull up resistor + button2.fall(&mode); ///under this condition call function where mode is a function that sets flag + button2.mode(PullUp); ///enable internal pull up resistor + button1.fall(&units); ///under this condition call function where mode is a function that sets flag + button1.mode(PullUp); ///enable internal pull up resistor } void units() { - g_button1_flag =!g_button1_flag ; // set button 1 flag in ISR + g_button1_flag =!g_button1_flag ; /// set button 1 flag in ISR } void mode() { - g_button2_flag =!g_button2_flag ; //set button 2 flag in ISR + g_button2_flag =!g_button2_flag ; ///set button 2 flag in ISR } void timeout_isr() { } void ticker_isr() { - g_ticker_flag = 1; // set ticker flag in ISR + g_ticker_flag = 1; /// set ticker flag in ISR } -void initialScreen() // initial screen printed +void initialScreen() /// initial screen printed { lcd.printString("DISTANCE",18,0); lcd.printString("SENSOR",22,1); @@ -104,53 +95,49 @@ } void initialArray() { - //graphArray[82]; //initialize graph array, 2 pixels used for y axis so not 84 - for (int i=0; i<83; i++) { // before entering the grpah mode with the button, it is alreadt plotting points but they cannot be seen as they are above max range of 200 - graphArray[i] = 201; // has to be more thn 200 so points are only plotted from the point when user presses button + for (int i=0; i<83; i++) { /// ensures that points are not being plotted before the button is pressed + graphArray[i] = 201; /// has to be more than 200 so points are only plotted from the point when user presses button } lcd.clear(); } -void get_averageDistance() // to minimize error, 5 readings are taken at regular intervals and averaged out +void get_averageDistance() /// to minimize error, 5 readings are taken at regular intervals and averaged out { for ( int i=0 ; i<5; i++) { - int distance = sensor.getDistanceCm(); // obtaining sensor distance reading - if (distance < 400) { //better averages random annomous values not even considered - averageDistance += distance; //assignment by sum + int distance = sensor.getDistanceCm(); /// obtaining sensor distance reading + if (distance < 400) { /// better averages random anonymous values not even considered + averageDistance += distance; /// assignment by sum } else { - i--; //if distance > 400 do not take that reading into account go again + i--; ///if distance > 400 do not take that reading into account go again so range of sensor is 30-400cm } } averageDistance = averageDistance/5; //sum of 5 readings divided by 5 to get average - lcd.clear(); + lcd.clear(); } -void redLedIndicator() // this function evaluates the average distance reading, displays it and controls the auditory + visual alerts +void redLedIndicator() /// this function evaluates the average distance reading, displays it and controls the auditory + visual alerts { if (averageDistance<=30) { - myled = 1; // warning led comes on - lcd.clear(); // clear previous distance values displayed + myled = 1; /// warning led comes on + lcd.clear(); /// clear previous distance values displayed lcd.printString(" ***COLLISION ",2,1); //warning text lcd.printString(" WARNING*** ",8,3); lcd.refresh(); - buzzer = delay; // duty cycle, volume of buzzer controlled with pot - buzzer.period(0.001); //highest frequency pitch when warning message comes on + buzzer = delay; /// duty cycle, volume of buzzer controlled with pot + buzzer.period(0.001); ///highest frequency pitch when warning message comes on } else { - // r_led = 1; - // g_led = 1; - // b_led = 1; myled = 0; } - if (averageDistance >30) { // above critical distance + if (averageDistance >30) { /// above critical distance lcd.clear(); - char str[10]; //keep the string as character array in local stack so can be manipulated - if (g_button1_flag == 0) { //button 1 flag is set 0 by default so distance displayed in units of cm + char str[10]; ///keep the string as character array in local stack so can be manipulated + if (g_button1_flag == 0) { ///button 1 flag is set 0 by default so distance displayed in units of cm - sprintf(str,"%.2f",averageDistance); // printing first 2 digits of average distance as float - lcd.printString("cm",62,4); // printing units + sprintf(str,"%.2f",averageDistance); /// printing first 2 digits of average distance as float + lcd.printString("cm",62,4); // printing units - } else if (g_button1_flag == 1) { //button 1 pressed, flag set 1 + } else if (g_button1_flag == 1) { ///button 1 pressed, flag set 1 sprintf(str,"%.2f",averageDistance*0.393701); //converting from cm to inches - lcd.printString("in",60,4); // printing the units + lcd.printString("in",60,4); /// printing the units } lcd.printString(" ",0,3); @@ -158,26 +145,26 @@ lcd.refresh(); } } -void drawDistanceBars() // function draws bars so as to indicate the approximate distance to nearest target object +void drawDistanceBars() /// function draws bars so as to indicate the approximate distance to nearest target object { if(averageDistance>380) { - lcd.drawRect(67,2,5,16,1); //Draw 8 bars + lcd.drawRect(67,2,5,16,1); ///Draw 8 bars } if(averageDistance>330) { - lcd.drawRect(59,2,5,16,1); //Draw 7 bars + lcd.drawRect(59,2,5,16,1); ///Draw 7 bars } if(averageDistance>280) { - lcd.drawRect(51,2,5,16,1); //Draw 6 bars + lcd.drawRect(51,2,5,16,1); ///Draw 6 bars } if(averageDistance>230) { - lcd.drawRect(43,2,5,16,1); //Draw 5 bars + lcd.drawRect(43,2,5,16,1); ///Draw 5 bars } if(averageDistance>180) { - lcd.drawRect(35,2,5,16,1); //Draw 4 bars + lcd.drawRect(35,2,5,16,1); ///Draw 4 bars } if(averageDistance>130) { @@ -185,11 +172,11 @@ } if(averageDistance>80) { - lcd.drawRect(19,2,5,16,1); //Draw 2 Bars + lcd.drawRect(19,2,5,16,1); ///Draw 2 Bars } if(averageDistance>30) { - lcd.drawRect(12,2,5,16,1); //Draw one rectangle + lcd.drawRect(12,2,5,16,1); ///Draw one rectangle } lcd.refresh(); } @@ -197,46 +184,44 @@ { for (int i=81 ; i>0; i--) { - graphArray[i] = graphArray[i-1]; //moving each element of array to right - } + graphArray[i] = graphArray[i-1]; ///moving each element of array to right + } } -void adjacentArrayElements() // assigning float distance to first element of graph matrix +void adjacentArrayElements() /// assigning float distance to first element of graph matrix { - graphArray[0]= averageDistance; //array element is average distance float - if ((int)graphArray[0] != (int)graphArray[1]) { //if value of current array element is different to previous one, red led and buzzer comes on ie visual and auditory alerts - myled=1; //red led comes on - buzzer = delay; // duty cycle - buzzer.period(buzzerPeriod); //set period of buzzer to my function + graphArray[0]= averageDistance; ///array element is average distance float + if ((int)graphArray[0] != (int)graphArray[1]) { ///if value of current array element is different to previous one, red led and buzzer comes on ie visual and auditory alerts + myled=1; ///red led comes on + buzzer = delay; /// duty cycle + buzzer.period(buzzerPeriod); ///set period of buzzer to my function - } else { // if no movement alerts are off + } else { /// if no movement alerts are off myled=0; buzzer=0; } } - -void plotAxes() //plotting both the x and y axis which are 2 pixels thick, i represents the pixels +void plotAxes() ///plotting both the x and y axis which are 2 pixels thick, i represents the pixels { - //i is pixel, plotting x axis - for ( int i=0; i<84; i++) { // plotting x axis + ///i is pixel + for ( int i=0; i<84; i++) { /// plotting x axis lcd.setPixel(i,46); lcd.setPixel(i,47); } - //plotting y axis - for ( int i=0; i<48; i++) { // plotting y axis + ///plotting y axis + for ( int i=0; i<48; i++) { /// plotting y axis lcd.setPixel(0,i); lcd.setPixel(1,i); } } -void plotDistancePoint() //function converts float distance to integer pixel +void plotDistancePoint() ///function converts float distance to integer pixel { - // i in this loop is element of the array NOT pixel - for (int i=0; i<82; i++) { // array is 82 elements long as 2 pixels are used for axes - //x position + y position) - int p = (int)(45-(graphArray[i]/(200/46))); //convert array element float distance to integer pixel - //convert from float distance to integer pixel - lcd.setPixel(83-i,p); // plot in pixel 84 at the right height , this pixel is then moved to right and new pixel is plotted + /// i in this loop is element of the array NOT pixel + for (int i=0; i<82; i++) { /// array is 82 elements long as 2 pixels are used for axes + ///x position + y position + int p = (int)(45-(graphArray[i]/(200/46))); ///convert array element float distance to integer pixel + lcd.setPixel(83-i,p); /// plot in pixel 84 at the right height , this pixel is then moved to right and new pixel is plotted } lcd.refresh(); }
--- a/main.h Wed May 04 22:45:02 2016 +0000 +++ b/main.h Thu May 05 09:54:30 2016 +0000 @@ -7,35 +7,40 @@ @Date 02/05/16 */ + #ifndef MAIN_H #define MAIN_H +#include "mbed.h" #include "N5110.h" #include "SRF02.h" /** @namespace lcd -@brief object of the N5110 class +@brief Object of the N5110 class */ N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); -////////////////// +/** +@namespace sensor +@brief Object of the SRF02 class +*/ SRF02 sensor(I2C_SDA,I2C_SCL); /** @namespace r_led -@brief output for status of red LED +@brief Output for status of red LED */ DigitalOut r_led(LED_RED); /** @namespace g_led -@brief output for status of green LED +@brief Output for status of green LED */ DigitalOut g_led(LED_GREEN); /** @namespace b_led -@brief output for status of blue LED +@brief Output for status of blue LED */ DigitalOut b_led(LED_BLUE); @@ -53,13 +58,13 @@ /** @namespace buzzer -@brief use PWM pin to control the volume of the buzzer, duty cycle and period +@brief Use PWM pin to control the volume of the buzzer, duty cycle and period */ PwmOut buzzer(PTA2); /** @namespace pot -@brief read value of the potentiometer from the potentiometer position +@brief Read value of the potentiometer from the potentiometer position */ AnalogIn rate(PTB10); @@ -90,40 +95,40 @@ /** The main function where the code is executed */ -//int main(); +int main(); /** -setting up flag to 1 +setting flag to 1 */ void units(); /** -setting up flag to 1 +setting flag to 1 */ void mode(); /** -setting up flag to 1 +setting flag to 1 */ void timeout_isr(); /** -setting up flag to 1 +setting flag to 1 */ void ticker_isr(); /** -setting up the buttons and on board LEDs +Setting up the buttons and on board LEDs */ void init_K64F(); /** -inital screen printed +Inital screen printed */ void initialScreen(); /** -initialize graph array for distance points +Initialize graph array for distance points */ void initialArray(); @@ -164,9 +169,16 @@ //void modeTwo(); +/// equation which relates the average distance to the frequency of the buzzer float buzzerPeriod; + +/// output value of the potentiometer used to control buzzer volume float delay; + +/// average of multiple consecutive distance readings float averageDistance; + +/// initialize graph array, 2 pixels used for a and y axis hence array not 84 float graphArray[82]; #endif \ No newline at end of file