Ultrasonic sensor project. Displays readings on LCD. Reverse parking sensor.
Dependencies: N5110 SRF02 beep mbed
main.cpp@2:f48fe83aecca, 2015-05-07 (annotated)
- Committer:
- ZHAOYIHUI
- Date:
- Thu May 07 15:40:58 2015 +0000
- Revision:
- 2:f48fe83aecca
- Parent:
- 0:a4f69f448e86
- Child:
- 3:3dc3d2da405a
The second documentation of my project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ZHAOYIHUI | 0:a4f69f448e86 | 1 | /** |
ZHAOYIHUI | 0:a4f69f448e86 | 2 | Project A--Ultrasonic range Finder |
ZHAOYIHUI | 0:a4f69f448e86 | 3 | Reverse parking meter |
ZHAOYIHUI | 0:a4f69f448e86 | 4 | @file main.cpp |
ZHAOYIHUI | 0:a4f69f448e86 | 5 | @brief headfile contain the functions prototypys,defines and global variable |
ZHAOYIHUI | 0:a4f69f448e86 | 6 | @author ZHAO YI HUI |
ZHAOYIHUI | 0:a4f69f448e86 | 7 | @date April 2015 |
ZHAOYIHUI | 0:a4f69f448e86 | 8 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 9 | |
ZHAOYIHUI | 0:a4f69f448e86 | 10 | #include "mbed.h" |
ZHAOYIHUI | 0:a4f69f448e86 | 11 | #include "N5110.h" |
ZHAOYIHUI | 0:a4f69f448e86 | 12 | #include "SRF02.h" |
ZHAOYIHUI | 0:a4f69f448e86 | 13 | #include "beep.h" |
ZHAOYIHUI | 0:a4f69f448e86 | 14 | /** |
ZHAOYIHUI | 0:a4f69f448e86 | 15 | @namespace leds |
ZHAOYIHUI | 0:a4f69f448e86 | 16 | @brief GPIO led for the red led |
ZHAOYIHUI | 0:a4f69f448e86 | 17 | @namespace lcd |
ZHAOYIHUI | 0:a4f69f448e86 | 18 | @brief initilize the lcd display |
ZHAOYIHUI | 2:f48fe83aecca | 19 | @namespace button |
ZHAOYIHUI | 2:f48fe83aecca | 20 | @brief use the ISR for the button |
ZHAOYIHUI | 2:f48fe83aecca | 21 | @namespace serial |
ZHAOYIHUI | 0:a4f69f448e86 | 22 | @brief serial connect to the computer to set RTC |
ZHAOYIHUI | 0:a4f69f448e86 | 23 | @namespace buzzer |
ZHAOYIHUI | 0:a4f69f448e86 | 24 | @breif set the buzzer |
ZHAOYIHUI | 0:a4f69f448e86 | 25 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 26 | |
ZHAOYIHUI | 0:a4f69f448e86 | 27 | BusOut leds(LED4,LED3,LED2,LED1);//initalize the leds on mbed |
ZHAOYIHUI | 0:a4f69f448e86 | 28 | N5110 lcd(p7,p8,p9,p10,p11,p13,p26);//initalize the Nokia N5110 lcd |
ZHAOYIHUI | 0:a4f69f448e86 | 29 | SRF02 srf02(p28,p27);// initalize the sensor |
ZHAOYIHUI | 0:a4f69f448e86 | 30 | Serial serial(USBTX,USBRX);// use the use connection to computer |
ZHAOYIHUI | 0:a4f69f448e86 | 31 | InterruptIn button(p15); |
ZHAOYIHUI | 0:a4f69f448e86 | 32 | InterruptIn button2(p17); |
ZHAOYIHUI | 0:a4f69f448e86 | 33 | Beep buzzer(p21); |
ZHAOYIHUI | 0:a4f69f448e86 | 34 | DigitalOut led(p24); |
ZHAOYIHUI | 0:a4f69f448e86 | 35 | |
ZHAOYIHUI | 0:a4f69f448e86 | 36 | |
ZHAOYIHUI | 0:a4f69f448e86 | 37 | void serialISR();//ISR that is called when serial data is received |
ZHAOYIHUI | 0:a4f69f448e86 | 38 | void setTime();// fucnction to set the UNIX time |
ZHAOYIHUI | 0:a4f69f448e86 | 39 | int setTimerFlag = 0;// flag for ISR |
ZHAOYIHUI | 0:a4f69f448e86 | 40 | char rxString[16];//buffer to store received string |
ZHAOYIHUI | 0:a4f69f448e86 | 41 | // set a flag for the first buttion S2 |
ZHAOYIHUI | 0:a4f69f448e86 | 42 | int buttonFlag = 0;/*print buttonFlag in ISR*/ |
ZHAOYIHUI | 0:a4f69f448e86 | 43 | |
ZHAOYIHUI | 0:a4f69f448e86 | 44 | |
ZHAOYIHUI | 0:a4f69f448e86 | 45 | #define light 1 // define light is 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 46 | #define dark 0 //define dark is 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 47 | |
ZHAOYIHUI | 0:a4f69f448e86 | 48 | #define centimeter 1//define the cm is 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 49 | #define inches 0// define inch is 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 50 | |
ZHAOYIHUI | 0:a4f69f448e86 | 51 | int brightness = light; // init the brightness to 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 52 | int state = centimeter; // inie the state to 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 53 | |
ZHAOYIHUI | 0:a4f69f448e86 | 54 | // Interrupt Service Routine |
ZHAOYIHUI | 0:a4f69f448e86 | 55 | void buttonPressed() |
ZHAOYIHUI | 0:a4f69f448e86 | 56 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 57 | buttonFlag = 1; // set S3 flag |
ZHAOYIHUI | 0:a4f69f448e86 | 58 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 59 | |
ZHAOYIHUI | 0:a4f69f448e86 | 60 | void buttonPressed2() |
ZHAOYIHUI | 0:a4f69f448e86 | 61 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 62 | state = !state; // change the state when press the button |
ZHAOYIHUI | 0:a4f69f448e86 | 63 | |
ZHAOYIHUI | 0:a4f69f448e86 | 64 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 65 | |
ZHAOYIHUI | 0:a4f69f448e86 | 66 | float getAverage()// calculate the average distance |
ZHAOYIHUI | 0:a4f69f448e86 | 67 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 68 | int sum = 0; // sum = 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 69 | |
ZHAOYIHUI | 0:a4f69f448e86 | 70 | float average; // the type of average is float |
ZHAOYIHUI | 0:a4f69f448e86 | 71 | |
ZHAOYIHUI | 0:a4f69f448e86 | 72 | for(int i=0; i<10; i++) {// loop for get 10 distances in 1 sec |
ZHAOYIHUI | 0:a4f69f448e86 | 73 | sum += srf02.getDistanceCm();// read the value from the sensor and sum up |
ZHAOYIHUI | 0:a4f69f448e86 | 74 | |
ZHAOYIHUI | 0:a4f69f448e86 | 75 | wait_ms(100);// wait 100ms |
ZHAOYIHUI | 0:a4f69f448e86 | 76 | |
ZHAOYIHUI | 0:a4f69f448e86 | 77 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 78 | |
ZHAOYIHUI | 0:a4f69f448e86 | 79 | // serial - print sum |
ZHAOYIHUI | 0:a4f69f448e86 | 80 | |
ZHAOYIHUI | 0:a4f69f448e86 | 81 | average = sum/10.0;// the average is the sum divided by 10 |
ZHAOYIHUI | 0:a4f69f448e86 | 82 | // serial - print average |
ZHAOYIHUI | 0:a4f69f448e86 | 83 | return average; |
ZHAOYIHUI | 0:a4f69f448e86 | 84 | |
ZHAOYIHUI | 0:a4f69f448e86 | 85 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 86 | /** |
ZHAOYIHUI | 0:a4f69f448e86 | 87 | Add up two variable |
ZHAOYIHUI | 0:a4f69f448e86 | 88 | @param a - integer to add |
ZHAOYIHUI | 0:a4f69f448e86 | 89 | @param b - integer to add |
ZHAOYIHUI | 0:a4f69f448e86 | 90 | @use the a & b to dispaly the distance in inches and centimeter |
ZHAOYIHUI | 0:a4f69f448e86 | 91 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 92 | int main() |
ZHAOYIHUI | 0:a4f69f448e86 | 93 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 94 | buzzer.beep(1000,1.0);// a sound for start |
ZHAOYIHUI | 0:a4f69f448e86 | 95 | lcd.init();//first need to initialise display |
ZHAOYIHUI | 0:a4f69f448e86 | 96 | lcd.printString("Ultrasonic",1,1); |
ZHAOYIHUI | 0:a4f69f448e86 | 97 | lcd.printString("Ranger",5,3); |
ZHAOYIHUI | 0:a4f69f448e86 | 98 | lcd.printString("Finder",7,5); |
ZHAOYIHUI | 0:a4f69f448e86 | 99 | wait(1.5);//wait 1.5 to start to detect the distance |
ZHAOYIHUI | 0:a4f69f448e86 | 100 | lcd.clear();// clear the screen and buffer |
ZHAOYIHUI | 0:a4f69f448e86 | 101 | |
ZHAOYIHUI | 0:a4f69f448e86 | 102 | //RTC |
ZHAOYIHUI | 0:a4f69f448e86 | 103 | serial.attach(&serialISR);// attach serial string |
ZHAOYIHUI | 0:a4f69f448e86 | 104 | char t[30];// buffer used to store time string |
ZHAOYIHUI | 0:a4f69f448e86 | 105 | button.rise(&buttonPressed);//event generated on rising edge |
ZHAOYIHUI | 0:a4f69f448e86 | 106 | button2.rise(&buttonPressed2);// event generated on rising edge |
ZHAOYIHUI | 0:a4f69f448e86 | 107 | // set the buzzer make noise at 1000HZ in 1 seconds when turn on the device |
ZHAOYIHUI | 0:a4f69f448e86 | 108 | led = 0; //set the red led is off when turn on the deivce |
ZHAOYIHUI | 0:a4f69f448e86 | 109 | |
ZHAOYIHUI | 0:a4f69f448e86 | 110 | |
ZHAOYIHUI | 0:a4f69f448e86 | 111 | while(1) |
ZHAOYIHUI | 0:a4f69f448e86 | 112 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 113 | lcd.printString("Distance is :",0,0);// display the sentence on the first line |
ZHAOYIHUI | 0:a4f69f448e86 | 114 | // RTC |
ZHAOYIHUI | 0:a4f69f448e86 | 115 | time_t seconds = time(NULL);//get current time |
ZHAOYIHUI | 0:a4f69f448e86 | 116 | |
ZHAOYIHUI | 0:a4f69f448e86 | 117 | strftime(t, 30 , "%X %D",localtime(&seconds));//format time into a string(time and data) |
ZHAOYIHUI | 0:a4f69f448e86 | 118 | |
ZHAOYIHUI | 0:a4f69f448e86 | 119 | serial.printf("Time = %s\n" ,t);//print over serial for texting |
ZHAOYIHUI | 0:a4f69f448e86 | 120 | lcd.printString(t,0,4);// dispaly the data on the screen |
ZHAOYIHUI | 0:a4f69f448e86 | 121 | /* |
ZHAOYIHUI | 0:a4f69f448e86 | 122 | float average =getAverage();// get the data from the getAverage function |
ZHAOYIHUI | 0:a4f69f448e86 | 123 | char A[14];// buffer of the average |
ZHAOYIHUI | 0:a4f69f448e86 | 124 | length = sprintf(A,"D = %.2f cm",average); |
ZHAOYIHUI | 0:a4f69f448e86 | 125 | lcd.printString(A,0,2);// display the date on the screen |
ZHAOYIHUI | 0:a4f69f448e86 | 126 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 127 | |
ZHAOYIHUI | 0:a4f69f448e86 | 128 | if(setTimerFlag)// if updated time has been sent |
ZHAOYIHUI | 0:a4f69f448e86 | 129 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 130 | setTimerFlag = 0; // clear flag |
ZHAOYIHUI | 0:a4f69f448e86 | 131 | setTime();//update |
ZHAOYIHUI | 0:a4f69f448e86 | 132 | |
ZHAOYIHUI | 0:a4f69f448e86 | 133 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 134 | |
ZHAOYIHUI | 0:a4f69f448e86 | 135 | |
ZHAOYIHUI | 0:a4f69f448e86 | 136 | // display the distance on the screen |
ZHAOYIHUI | 0:a4f69f448e86 | 137 | |
ZHAOYIHUI | 0:a4f69f448e86 | 138 | int distance = srf02.getDistanceCm();// the distance is a integer and get the data from the getDistanceCm function |
ZHAOYIHUI | 0:a4f69f448e86 | 139 | char buffer[14];//create a buffer to store 14 characters |
ZHAOYIHUI | 0:a4f69f448e86 | 140 | int length = sprintf(buffer,"D = %d cm",distance); // scan this buffer and D = %d cm and calculate the length |
ZHAOYIHUI | 0:a4f69f448e86 | 141 | /* |
ZHAOYIHUI | 0:a4f69f448e86 | 142 | if(length <= 14)// if statement set the lenght should less than 14 |
ZHAOYIHUI | 0:a4f69f448e86 | 143 | lcd.printString(buffer,0,1); // display the answer on the LCD screen |
ZHAOYIHUI | 0:a4f69f448e86 | 144 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 145 | char buffer2[14]; |
ZHAOYIHUI | 0:a4f69f448e86 | 146 | float inch = distance/30.48 ; // change the distance from to inches |
ZHAOYIHUI | 0:a4f69f448e86 | 147 | length = sprintf(buffer2,"D = %.2f ft",inch); // scan the length again |
ZHAOYIHUI | 0:a4f69f448e86 | 148 | /* |
ZHAOYIHUI | 0:a4f69f448e86 | 149 | if(length <= 14)//if statement set the lenght should less than 14 |
ZHAOYIHUI | 0:a4f69f448e86 | 150 | lcd.printString(buffer,0,3);// display the answer on the LCD screen |
ZHAOYIHUI | 0:a4f69f448e86 | 151 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 152 | |
ZHAOYIHUI | 0:a4f69f448e86 | 153 | wait(1.0);// wait 1 second to do next measurement |
ZHAOYIHUI | 0:a4f69f448e86 | 154 | lcd.clear(); // clear the buffer and refesh the lcd to avoide repeat pixel |
ZHAOYIHUI | 0:a4f69f448e86 | 155 | if(distance<15)// the srf02 can not measure the distance low than 15 |
ZHAOYIHUI | 0:a4f69f448e86 | 156 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 157 | lcd.printString("ERROR!!!",0,1);// print ERROR on the screen |
ZHAOYIHUI | 0:a4f69f448e86 | 158 | lcd.printString("MINUMUM",0,3);// show the MINUMUN |
ZHAOYIHUI | 0:a4f69f448e86 | 159 | //as well |
ZHAOYIHUI | 0:a4f69f448e86 | 160 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 161 | if(distance<30 && distance >15) |
ZHAOYIHUI | 0:a4f69f448e86 | 162 | { // if the distance less than the 30, the buzzer and red led on work |
ZHAOYIHUI | 0:a4f69f448e86 | 163 | //buzzer |
ZHAOYIHUI | 0:a4f69f448e86 | 164 | buzzer.beep(4000,0.7);// buzzer make noise at 3000hz in 0.5second |
ZHAOYIHUI | 0:a4f69f448e86 | 165 | led = 1;//red led on |
ZHAOYIHUI | 0:a4f69f448e86 | 166 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 167 | else if |
ZHAOYIHUI | 0:a4f69f448e86 | 168 | (distance > 30 && distance <60) |
ZHAOYIHUI | 0:a4f69f448e86 | 169 | { //if the distance between the 30 and 60 cm. |
ZHAOYIHUI | 0:a4f69f448e86 | 170 | |
ZHAOYIHUI | 0:a4f69f448e86 | 171 | buzzer.beep(1000,0.5);// the buzzer make noise at 1000hz in 0.2 second |
ZHAOYIHUI | 0:a4f69f448e86 | 172 | led = 0; |
ZHAOYIHUI | 0:a4f69f448e86 | 173 | |
ZHAOYIHUI | 0:a4f69f448e86 | 174 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 175 | else if(distance > 60 && distance< 100) |
ZHAOYIHUI | 0:a4f69f448e86 | 176 | { // if the distance between 60 and 100 cm |
ZHAOYIHUI | 0:a4f69f448e86 | 177 | buzzer.beep(400,0.2);// the buzzer make noise at 500 hz in 0.1 second |
ZHAOYIHUI | 0:a4f69f448e86 | 178 | led = 0 ; |
ZHAOYIHUI | 0:a4f69f448e86 | 179 | |
ZHAOYIHUI | 0:a4f69f448e86 | 180 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 181 | |
ZHAOYIHUI | 0:a4f69f448e86 | 182 | // set the buttons |
ZHAOYIHUI | 0:a4f69f448e86 | 183 | |
ZHAOYIHUI | 0:a4f69f448e86 | 184 | switch(state) |
ZHAOYIHUI | 0:a4f69f448e86 | 185 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 186 | case centimeter: // in centimeter cas |
ZHAOYIHUI | 0:a4f69f448e86 | 187 | state = 1;// let the state to 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 188 | if(length <= 14)// if statement set the lenght should less than 14 |
ZHAOYIHUI | 0:a4f69f448e86 | 189 | lcd.printString(buffer,0,2); // display the answer on the LCD screen |
ZHAOYIHUI | 0:a4f69f448e86 | 190 | break;//out of the funcion |
ZHAOYIHUI | 0:a4f69f448e86 | 191 | case inches:// in inches case |
ZHAOYIHUI | 0:a4f69f448e86 | 192 | state = 0;// set the state = 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 193 | if(length <= 14)//if statement set the lenght should less than 14 |
ZHAOYIHUI | 0:a4f69f448e86 | 194 | lcd.printString(buffer2,0,2);// display the answer on the LCD screen |
ZHAOYIHUI | 0:a4f69f448e86 | 195 | break;//out the funcion |
ZHAOYIHUI | 0:a4f69f448e86 | 196 | default: |
ZHAOYIHUI | 0:a4f69f448e86 | 197 | break; |
ZHAOYIHUI | 0:a4f69f448e86 | 198 | |
ZHAOYIHUI | 0:a4f69f448e86 | 199 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 200 | if(buttonFlag) |
ZHAOYIHUI | 0:a4f69f448e86 | 201 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 202 | buttonFlag =0;// set buttonFlag = 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 203 | lcd.setBrightness(brightness);//set the brightness |
ZHAOYIHUI | 0:a4f69f448e86 | 204 | switch(brightness)// check the state what the brightness |
ZHAOYIHUI | 0:a4f69f448e86 | 205 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 206 | case light:// if the brightness is 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 207 | brightness = 0;// set brightness to 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 208 | break;// go out of the loop |
ZHAOYIHUI | 0:a4f69f448e86 | 209 | case dark:// if the brightness is 0 |
ZHAOYIHUI | 0:a4f69f448e86 | 210 | brightness = 1;// set to brightness to 1 |
ZHAOYIHUI | 0:a4f69f448e86 | 211 | break; |
ZHAOYIHUI | 0:a4f69f448e86 | 212 | default: |
ZHAOYIHUI | 0:a4f69f448e86 | 213 | break; |
ZHAOYIHUI | 0:a4f69f448e86 | 214 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 215 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 216 | |
ZHAOYIHUI | 0:a4f69f448e86 | 217 | } |
ZHAOYIHUI | 0:a4f69f448e86 | 218 | |
ZHAOYIHUI | 0:a4f69f448e86 | 219 | |
ZHAOYIHUI | 0:a4f69f448e86 | 220 | |
ZHAOYIHUI | 0:a4f69f448e86 | 221 | } |
ZHAOYIHUI | 2:f48fe83aecca | 222 | /** |
ZHAOYIHUI | 2:f48fe83aecca | 223 | add a variable |
ZHAOYIHUI | 2:f48fe83aecca | 224 | @param a - integer to add |
ZHAOYIHUI | 2:f48fe83aecca | 225 | @converts a string to an integer into a |
ZHAOYIHUI | 2:f48fe83aecca | 226 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 227 | void setTime() |
ZHAOYIHUI | 0:a4f69f448e86 | 228 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 229 | // pring something for debugging |
ZHAOYIHUI | 0:a4f69f448e86 | 230 | serial.printf("set_time - %s",rxString); |
ZHAOYIHUI | 0:a4f69f448e86 | 231 | //atoi()converts a string to an integer |
ZHAOYIHUI | 0:a4f69f448e86 | 232 | int time = atoi(rxString); |
ZHAOYIHUI | 0:a4f69f448e86 | 233 | //update the time |
ZHAOYIHUI | 0:a4f69f448e86 | 234 | set_time(time); |
ZHAOYIHUI | 0:a4f69f448e86 | 235 | } |
ZHAOYIHUI | 2:f48fe83aecca | 236 | /** |
ZHAOYIHUI | 2:f48fe83aecca | 237 | @when the serial interrupt occures, read rx string into buffer |
ZHAOYIHUI | 2:f48fe83aecca | 238 | */ |
ZHAOYIHUI | 0:a4f69f448e86 | 239 | void serialISR() |
ZHAOYIHUI | 0:a4f69f448e86 | 240 | { |
ZHAOYIHUI | 0:a4f69f448e86 | 241 | //when a serial interrupt occurs, read rx string into buffer |
ZHAOYIHUI | 0:a4f69f448e86 | 242 | serial.gets(rxString,16); |
ZHAOYIHUI | 0:a4f69f448e86 | 243 | //set flag |
ZHAOYIHUI | 0:a4f69f448e86 | 244 | setTimerFlag = 1; |
ZHAOYIHUI | 0:a4f69f448e86 | 245 | } |