This is the final project involving a parking distance guider and radar distance sensor, with an additional setting option involved. It was made by Nestor Isaac Garcia Rueda (SID: 200798965) and e-mail address: nestorgarciarueda@hotmail.com
Dependencies: N5110 PowerControl SRF02 beep mbed
Revision 0:356be0c38cf1, committed 2015-05-11
- Comitter:
- NestorLDS
- Date:
- Mon May 11 21:57:55 2015 +0000
- Commit message:
- When Finished
Changed in this revision
diff -r 000000000000 -r 356be0c38cf1 Button.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.cpp Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,447 @@ +/** +@file Button.cpp +@brief main file for the Ultrasound Distance Sensor Project. +@brief Has three main functions; parking distance guide, ultrasound radar and settings. +@brief Revision 3.6. +@author Nestor Isaac Garcia Rueda (200798965) +@date 02/May/2015 +*/ + +/*Here, we are including the following libraries and its respectively codes*/ +#include "mbed.h" /*Importing the mbed.h library header file of the mbed NXP LPC 1768 Microcontroller*/ +#include "N5110.h" /*Importing the N5110.h library header file of the Nokia 5110 LCD screen*/ +#include "SRF02.h" /*Importing the SRF02.h library header file of the SRF02 ultrasound device*/ +#include "beep.h" /*Importing beep.h library header file of the beep library*/ +#include "PowerControl/PowerControl.h" /*Importing the PowerControl/PowerControl.h library header file of the PowerControl library*/ +#include "PowerControl/EthernetPowerControl.h" /*Importing the PowerControl/EthernetPowerControl.h library header file of the PowerControl library*/ + +AnalogIn pot(p20); /*Declaring name space (pot) and pin number (p20) of the potentiometer*/ +Beep buzzer(p21); /*Declaring name space (buzzer) and pin number (p21) of the buzzer speaker*/ +InterruptIn button(p18); /*Declaring name space (button) and pin number (p18) of the interrupt button*/ +BusOut inLeds(LED3,LED4); /*Declaring name space (inLeds) and inner embedded LEDs of mbed NXP LPC 1768 Microcontroller*/ + +//Serial serial(USBTX,USBRX); /*Declaration of serial interface for CoolTerm debugging with usb transmitter and receiver defintitions*/ + +BusOut pcbLEDS (p25,p24,p23,p22); /*Declaring name space (pcbLEDS) and its corresponding pin numbers (p25,p24,p23,p22) of the LEDs of the PCB*/ +N5110 lcd(p7,p8,p9,p10,p11,p13,p26); /*Declaring name space (lcd) and corresponding pin numbers (p7,p8,p9,p10,p11,p13,p26) of the Nokia 5110 LCD screen*/ +SRF02 srf02(p28,p27); /*Declaring SDA and SCL pins (p28,p27)*/ + +Ticker onBoardLedTimer; /*Ticker object for blinking on board LED*/ +Ticker refLed; /*Ticker object to eliminate the need for wait() function for the on-PCB status LED's*/ +Ticker clearTimer; + +int c = 1; /*Float is 0.something and 'int' represents whole numbers, where we are declaring 'c' to be a whole number and to have a value of 1*/ +void ledFlow() /*Void function for executing the brightness backlight pre-intro presentation*/ +{ + pcbLEDS = 8; /*The named space previously defined, lights on, in this case 2^3= 8 in binary, therefore it only will the fourth led*/ + wait_ms(200); /*Waiting time delay of 0.2 seconds*/ + pcbLEDS = 12; /*Lights on, in this case 2^3+2^2= 12 in binary, therefore it will only the third and fourth led*/ + wait_ms(200); /*Delay of 0.2 seconds*/ + pcbLEDS = 14; /*Lights on, in this case 2^3+2^2+2^1= 14 in binary, therefore it will only the second, third and fourth led*/ + wait_ms(200); /*Delay of 0.2 seconds*/ + pcbLEDS = 15; /*Lights on, in this case 2^3+2^2+2^1+2^0= 15 in binary, therefore it will all the four leds*/ + wait_ms(200); /*Delay of 0.2 seconds*/ + pcbLEDS = 0; /*Lights off all leds*/ + +} + +float d = 1; /* Float is 0.smth and int whole*/ +void ledLaserA() /* Void function named ledLaserA for executing the code below to be able to be called and run, executing the different led states*/ +{ + pcbLEDS = 1; /*The named space previously defined, lights on, in this case 2^0= 1 in binary, therefore it only will the first led*/ + wait_ms(110); /*Delay of 0.11 seconds*/ + pcbLEDS = 3;; /*Lights on, in this case 2^1+2^0= 3 in binary, therefore it only will the first and second leds*/ + wait_ms(90); /*Delay of 0.09 seconds*/ + pcbLEDS = 7;; /*Lights on, in this case 2^2+2^1+2^0= 7 in binary, therefore it only will the first, second and third leds*/ + wait_ms(90); /*Delay of 0.09 seconds*/ + pcbLEDS = 15; /*Lights on, in this case 2^3+2^2+2^1+2^0= 15 in binary, therefore it will then the first, second, third and fourth leds*/ + wait_ms(90); /*Delay of 0.09 seconds*/ +} +void ledLaserB() /*void function for ledLaserB led flashing states*/ +{ + pcbLEDS = 8; /*The named space previously defined, lights on, in this case 2^3= 8 in binary, therefore it only will the fourth led*/ + wait_ms(110); /*Delay of 0.11 seconds*/ + pcbLEDS = 12; /*Lights on, in this case 2^3+2^2= 12 in binary, therefore it will only the third and fourth led*/ + wait_ms(90); /*Delay of 0.09 seconds*/ + pcbLEDS = 14; /*Lights on, in this case 2^3+2^2+2^1= 14 in binary, therefore it will only the second, third and fourth led*/ + wait_ms(90); /*Delay of 0.09 seconds*/ + pcbLEDS = 15; /*Lights on, in this case 2^3+2^2+2^1+2^0= 15 in binary, therefore it will all the four leds*/ + wait_ms(90); /*Delay of 0.09 seconds*/ + pcbLEDS = 0; /*Lights off all leds*/ +} + +int buttonFlag = 0; /*between variable = 0 and variableReading = 0.3*/ +int buttonAltFlag = 0; /*Alternate flag between variable = 0.3 and variableReading = 0.6*/ +int buttonSecondAltFlag = 0; /*Second Alternate flag beyond variable = 0*/ + +float variableReading = pot.read(); /*fetches potentiometer reading between 0 and 1 and stores it in a variable, potReading*/ + +void action() //Interrupt Service Routine for Button +{ + if(variableReading <= 0.3) { //less than this pot ratio + buttonFlag = !buttonFlag; //if flag = 0 set it to 1; otherwise reset it to 0. + } + + else if(variableReading > 0.3 & variableReading < 0.6) { //if otherwise pot reading between this pot ratio range - radar + buttonAltFlag = !buttonAltFlag; //if flag = 0 set it to 1; otherwise reset it to 0. + } + + else if(variableReading >= 0.6) { //or else this pot ratio is exceeded + //lcd.setBrightness(pot.read()); + buttonSecondAltFlag = !buttonSecondAltFlag; + // lcd.setBrightness(pot.read()); + + } + + if ( variableReading < 0.6 && buttonSecondAltFlag == 1) { + buttonSecondAltFlag = !buttonSecondAltFlag; + // lcd.setBrightness(pot.read()); + } + +} + +int LedFlag = 0; //flag set to change on-board LED state + +void LedTimerSet() //Interrupt Service Routine for LedTimer +{ + LedFlag = 1; //set flag when timer expires. +} + +int refLedFlag = 0; + +void refLedFlipped() +{ + refLedFlag = 1; +} + +int clearFlag = 0; + +void clearTimeout() +{ + clearFlag = 1; +} + +bool state; + +float a= 0.0; /*Floating data integer type constant defined as "a" and given the value of 0.0*/ +int counter = 0; /*Integer r set as an integer of 0*/ +void increaseBrightness() /*void function for executing the brightness backlight pre-intro presentation*/ +{ + a+=0.2; /*increases by 0.2 the 'a' constant*/ + lcd.setBrightness(a); /*the lcd brightness is been set, with the pre-set and defined constant ''a'', as the initial value state*/ + wait_ms(150); /*Delay of 0.15 seconds*/ +} + +void preIntro () /*void function for preIntro that performs the counting, increment and reset of the constant "a" state depending on its floating value, taking into account the task of counting floating numbers*/ +{ + + while(counter < 2) { /*A while loop that when the counter reaches 2, stops executing*/ + + + increaseBrightness(); /*calls the function*/ + if (a>0.4 && a<0.7) { + lcd.inverseMode(); /*White and black pixels get inversed*/ + } + + else if (a>=1) { /*so i} the constant 'a' gets higher or equal to 1, after increasing by 0.2 every time, will execute the code line below*/ + a = 0; + counter++; /*sets the constant 'a' value to 0 and adds 1 to the counter when the if statement is met*/ + + } else { /*Else statement*/ + lcd.normalMode(); /*Calls the member function normal mode running the code*/ + } + } +} + +void superIntro() +{ + +//LCD DISPLAY + + ledFlow(); /*calls the ledFlow function been declared above*/ + lcd.clear(); /*Clears screen by running the member function clear of the class lcd*/ + lcd.refresh(); /*Refreshes screen by runnig member function*/ + pcbLEDS = 0; /*Lights off all leds*/ + lcd.printString("Electronic",15,0); /*Calls the member function printString running the code and allowing us to print what's between quotation marks and the coordinates Y,X axis of 15 and 0*/ + lcd.printString("&",40,1); /*Prints on the lcd screen only the symbol "&" between quotation marks on the 40,1 Y,X axis coordinates*/ + lcd.printString("Electrical",6,2); /*Prints "Electrical" on the 6,2 X,Y axis coordinates of the LCD*/ + lcd.printString("Engineer",37,3); /*Prints "Engineer" on the 37,3 X,Y axis coordinates of the LCD*/ + lcd.printString("PRESENTS",5,4); /*Prints "PRESENTS" on the 5,4 X,Y axis coordinates of the LCD*/ + lcd.printString("///*///*///*//",0,5); /*Prints "///*///*///*//" on the 0,5 X,Y axis coordinates of the LCD*/ + wait(2); /*Delay of 2 secs*/ + + + ledFlow(); /*calls the ledFlow function been declared above*/ + lcd.clear(); /*Clears screen by running the member function clear of the class lcd*/ + lcd.printString("///*///*///*//",0,0); /*Prints "///*///*///*//" on the 0,0 X,Y axis coordinates of the LCD*/ + lcd.printString("The",34,1); /*Prints "The" on the 34,1 X,Y axis coordinates of the LCD*/ + lcd.printString("SRF",34,2); /*Prints "SRF" on the 34,2 X,Y axis coordinates of the LCD*/ + lcd.printString("Ultrasound",13,3); /*Prints "Ultrasound" on the 13,3 X,Y axis coordinates of the LCD*/ + lcd.printString("Project",21,4); /*Prints "Project" on the 21,4 X,Y axis coordinates of the LCD*/ + lcd.printString("///*///*///*//",0,5); /*Prints "///*///*///*//" on the 0,5 X,Y axis coordinates of the LCD*/ + lcd.inverseMode(); /*calls the function from the N5110.h library and runs the function inverseMode to inverse the B&W pixel states*/ + wait(2); /*waiting time of 2secs*/ + + ledFlow(); /*calls the ledFlow function been declared above*/ + lcd.clear(); /*clears screen*/ + lcd.printString("///*///*///*//",0,0); /*Prints "///*///*///*//" on the 0,0 X,Y axis coordinates of the LCD*/ + lcd.printString("Designed",15,1); /*Prints "Designed" on the 15,1 X,Y axis coordinates of the LCD*/ + lcd.printString("By",34,2); /*Prints "By" on the 34,2 X,Y axis coordinates of the LCD*/ + lcd.printString("Nestor Isaac",7,3); /*Prints "Nestor Isaac" on the 7,3 X,Y axis coordinates of the LCD*/ + lcd.printString("Garcia Rueda",7,4); /*Prints "Garcia Rueda" on the 7,4 X,Y axis coordinates of the LCD*/ + lcd.printString("///*///*///*//",0,5); /*Prints "///*///*///*//" on the 0,5 X,Y axis coordinates of the LCD*/ + lcd.normalMode(); /*calls the function from the N5110.h library and runs the function normalMode to normal the B&W pixel states*/ + wait(3); /*waiting time of 3secs*/ + pcbLEDS=15; /*Lights on, in this case 2^3+2^2+2^1+2^0= 15 in binary, therefore it will all the four leds*/ + lcd.refresh(); /*refreshes screen by running the corresponding member function*/ + lcd.clear(); /*clears screen by running the corresponding member function inside the lcd class*/ +} + +int main () /*Starts the main function where "int" represents the data type of the return value from the pgoramme where if returned a 0, means that its worked ok and if returned 1, would mean that something went wrong*/ +{ /*Curly bracket that reresets the openning/begining of the main function*/ + PHY_PowerDown(); /*Ethernet Power-Down, saves up around 175mW*/ + lcd.init(); /*Initialises screen by running the member function init of the class lcd*/ + preIntro(); /*Calls the defined void function "preIntro" declared above*/ + superIntro(); /*Calls the defined void function "preIntro" declared above*/ + button.rise(&action); + + onBoardLedTimer.attach(&LedTimerSet,1.0); /*call ISR every second second*/ + + refLed.attach(&refLedFlipped,0.3); /*call ISR once after 0.3 seconds elapse*/ + + clearTimer.attach(&clearTimeout,0.25); /* calls ISR every quarter of a second*/ + + while(1) { /*Initialises a while loop that loops reading code forever*/ + + if(clearFlag) { /*If statement that only executing if the clearFlag statement is met and runs the inner statement of "if"*/ + + lcd.clear(); /*clears screen by running the corresponding member function inside the lcd class*/ + clearFlag = 0; /*Makes the clearFlag value to be set initially as 0*/ + variableReading = pot.read(); /*Here, we are just saying that the declared floating declaration variableReading is equals to pot.read(), which reads the potentiometer resistance*/ + /*serial.printf("variable reading is %d\n",state);*/ /*This code was additionally used as for debugging purposes using CoolTerm so we could print ht ereadings when connecting our mbed platform to the programme*/ + lcd.drawRect(15,5,60,10,0); /* filled black rectangle Y,X,length, width,1=FILLIN/0=NON-FILLING*/ + lcd.drawRect(15,20,60,10,0); /* filled black rectangle Y,X,length, width,1=FILLIN/0=NON-FILLING*/ + lcd.drawRect(15,35,60,10,0); /* filled black rectangle Y,X,length, width,1=FILLIN/0=NON-FILLING*/ + + lcd.drawCircle(WIDTH/11,HEIGHT/5.2,5,0); /*Here, it takes the declared WIDTH on the lcd library of 84 pixels(in this case divided by 11) on the x axis and HEIGHT of 48 pixels in the y axis (in this case divided by 5.2),with a radius of 5cm,and 0 fo an white empty circle and 1 for a black filled circle that prints on the lcd screen*/ + lcd.drawCircle(WIDTH/11,HEIGHT/1.97,5,0); /*It calls the member function "drawCircle" inside the lcd class, with a WIDTH of 84/11, a HEIGHT of 48/1.97, a radius of 5, and a empty filled circle (0)*/ + lcd.drawCircle(WIDTH/11,HEIGHT/1.2,5,0); /*It calls the member function "drawCircle" inside the lcd class, with a WIDTH of 84/11, a HEIGHT of 48/1.2, a radius of 5, and a empty filled circle (0)*/ + + lcd.printString("PARKING",23,1); /*Prints "Electrical" on the 6,2 X,Y axis coordinates of the LCD*/ + lcd.printString("RADAR",29,3); /*Prints "Electrical" on the 6,2 X,Y axis coordinates of the LCD*/ + lcd.printString("SETTINGS",20,5); /*Prints "Electrical" on the 6,2 X,Y axis coordinates of the LCD*/ + + + + if (variableReading <= 0.3) { /*This is for the PARKING option*/ + lcd.drawCircle(WIDTH/11,HEIGHT/5.2,5,1); // x,y,radius,black fill + ledLaserA(); + lcd.refresh(); + ledLaserB(); + lcd.drawCircle(WIDTH/11,HEIGHT/5.2,5,1); // x,y,radius,black fill + lcd.refresh(); + + while(buttonFlag == 1) { + lcd.clear(); + //buzzer.beep(200,1.5); + inLeds = 1; + if(LedFlag) { //if flag has been set + inLeds = inLeds + 1; + if(inLeds < 3) { + inLeds = 0; + } + LedFlag = 0; //reset flag + } + int distReading = srf02.getDistanceCm(); + + lcd.clear(); + + char stringBuffer[14]; + + lcd.printString("Measured range",0,2); + + sprintf(stringBuffer,":%dcm",distReading); + + lcd.printString(stringBuffer,43,3); + lcd.refresh(); + + if (distReading >=12 && distReading <=15 ) { + pcbLEDS = 8; + lcd.printString("///*///*///*//",0,0); //Y,X axis + lcd.printString("WELL DONE!",0,1); + lcd.printString("car parked at ",0,2); + lcd.printString("///*///*///*//",0,4); //Y,X axis + lcd.printString("///*///*///*//",0,5); //Y,X axis + buzzer.beep(200,1.5); + wait(4); + } + if (distReading > 15 && distReading <= 30) { + pcbLEDS = 12; + lcd.printString("//////////////",0,0); //Y,X axis + lcd.printString("wall at",0,3); + lcd.printString("Slow approach,",0,2); + // lcd.printString("recommended",0,4); + + wait_ms(300); + } + if (distReading > 30 && distReading <= 50) { + pcbLEDS = 14; + wait_ms(300); + } + if (distReading > 50 && distReading <= 50) { + pcbLEDS = 15; + wait_ms(300); + } else { + //pcbLEDS = 15; +// wait_ms(300); +// pcbLEDS = 0; + ledFlow(); + lcd.refresh(); + } + lcd.refresh(); + + // if (distReading < 35) { + // buzzer.beep(500,1.0); +// pcbLEDS = 14; +// wait_ms(300); +// +// if (distReading < 25) { +// buzzer.beep(1000,1.0); +// pcbLEDS = 12; +// wait_ms(300); +// +// if (distReading < 15) { +// buzzer.beep(9000,1.0); +// pcbLEDS = 8; +// wait_ms(300); +// } //close dist reading 15 +// lcd.refresh(); +// } //close dist reading 35 +// } //close button flag 1 +// } //close variable reading 0.3 to 0.6 + lcd.refresh(); + } + lcd.clear(); + + lcd.refresh(); + } + + if (variableReading >0.3 && variableReading <0.6) { + //This is the RADAR option + lcd.drawCircle(WIDTH/11,HEIGHT/1.97,5,1); // x,y,radius,black fill + ledLaserA(); + lcd.refresh(); + ledLaserB(); + lcd.drawCircle(WIDTH/11,HEIGHT/1.97,5,1); // x,y,radius,black fill + lcd.refresh(); + + while(buttonAltFlag == 1) { + lcd.clear(); + //buzzer.beep(200,1.5); + inLeds = 1; + if(LedFlag) { //if flag has been set + inLeds = inLeds + 1; + if(inLeds < 3) { + inLeds = 0; + } + LedFlag = 0; //reset flag + } + int distReading = srf02.getDistanceCm(); + + lcd.clear(); + + char stringBuffer[14]; + + lcd.printString("Measured range",0,2); + + sprintf(stringBuffer,": %d cm",distReading); + + lcd.printString(stringBuffer,0,3); + lcd.refresh(); + + if (distReading <=15) { + pcbLEDS = 8; + wait_ms(300); + } + if (distReading > 15 && distReading <= 30) { + pcbLEDS = 12; + wait_ms(300); + } + if (distReading > 30 && distReading <= 50) { + pcbLEDS = 14; + wait_ms(300); + } + if (distReading > 50 && distReading <= 50) { + pcbLEDS = 15; + wait_ms(300); + } else { + //pcbLEDS = 15; +// wait_ms(300); +// pcbLEDS = 0; + ledFlow(); + } + lcd.refresh(); + + // if (distReading < 35) { + // buzzer.beep(500,1.0); +// pcbLEDS = 14; +// wait_ms(300); +// +// if (distReading < 25) { +// buzzer.beep(1000,1.0); +// pcbLEDS = 12; +// wait_ms(300); +// +// if (distReading < 15) { +// buzzer.beep(9000,1.0); +// pcbLEDS = 8; +// wait_ms(300); +// } //close dist reading 15 +// lcd.refresh(); +// } //close dist reading 35 +// } //close button flag 1 +// } //close variable reading 0.3 to 0.6 + lcd.refresh(); + } + } + + if (variableReading >= 0.6) { + //This is the the SETTINGS option + lcd.drawCircle(WIDTH/11,HEIGHT/1.2,5,1); // x,y,radius,black fill + if(refLedFlag == 1) { + ledLaserA(); + lcd.refresh(); + ledLaserB(); + refLedFlag = 0; + } + lcd.refresh(); + lcd.drawCircle(WIDTH/11,HEIGHT/1.2,5,1); // x,y,radius,black fill + //lcd.printString("SETTINGS",20,5); //X,Y axis + // buzzer.beep(12000,1.0); + while(buttonSecondAltFlag == 1) { + lcd.clear(); + variableReading = pot.read(); // This, has to beinside the while loop as otherwise it would not bear it in mind when coding + lcd.setBrightness(variableReading); + char stringBuffer[14]; + lcd.drawRect(15,6.5,60,10,0); // filled empty rectangle Y,X,length, width,1=FILLIN/0=NON-FILLING + lcd.drawCircle(WIDTH/11,HEIGHT/4.7,5,1); // x,y,radius,transparent with outline + lcd.printString("LCD lumen",19,1); + // buzzer.beep(200,1.5); + //lcd.printString("Measured range",0,3); + float tempVarReading = variableReading * 100; + sprintf(stringBuffer,": %.1f%%",tempVarReading); + lcd.printString(stringBuffer,0,4); + lcd.refresh(); + //buzzer.beep(200,1.5); + //lcd.refresh(); + wait(0.4); + + // // wait(0.5); + } //close while buttonSecondAltFlag + } //close if var reading greater than 0.6 + } //close while(1) + }//close main + + //} +} + \ No newline at end of file
diff -r 000000000000 -r 356be0c38cf1 N5110.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N5110.lib Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/eencae/code/N5110/#ba8addc061ea
diff -r 000000000000 -r 356be0c38cf1 PowerControl.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PowerControl.lib Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/JST2011/code/PowerControl/#d0fa2aeb02a4
diff -r 000000000000 -r 356be0c38cf1 SRF02.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SRF02.lib Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/eencae/code/SRF02/#8e6587d88773
diff -r 000000000000 -r 356be0c38cf1 beep.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/beep.lib Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/pprasad7/code/beep/#080ef5594cce
diff -r 000000000000 -r 356be0c38cf1 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon May 11 21:57:55 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/8ab26030e058 \ No newline at end of file