Ultrasonic sensor project. Displays readings on LCD. Reverse parking sensor.

Dependencies:   N5110 SRF02 beep mbed

Committer:
ZHAOYIHUI
Date:
Thu May 07 15:51:17 2015 +0000
Revision:
4:e485ad337011
Parent:
3:3dc3d2da405a
the fourth version of my project

Who changed what in which revision?

UserRevisionLine numberNew 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 3:3dc3d2da405a 54 /**
ZHAOYIHUI 3:3dc3d2da405a 55 @Interrupt Service Routine
ZHAOYIHUI 3:3dc3d2da405a 56 */
ZHAOYIHUI 0:a4f69f448e86 57 void buttonPressed()
ZHAOYIHUI 0:a4f69f448e86 58 {
ZHAOYIHUI 0:a4f69f448e86 59 buttonFlag = 1; // set S3 flag
ZHAOYIHUI 0:a4f69f448e86 60 }
ZHAOYIHUI 3:3dc3d2da405a 61 /**
ZHAOYIHUI 3:3dc3d2da405a 62 @Interrupt Service Routine
ZHAOYIHUI 3:3dc3d2da405a 63 */
ZHAOYIHUI 0:a4f69f448e86 64 void buttonPressed2()
ZHAOYIHUI 0:a4f69f448e86 65 {
ZHAOYIHUI 0:a4f69f448e86 66 state = !state; // change the state when press the button
ZHAOYIHUI 0:a4f69f448e86 67
ZHAOYIHUI 0:a4f69f448e86 68 }
ZHAOYIHUI 3:3dc3d2da405a 69 /**
ZHAOYIHUI 3:3dc3d2da405a 70 read ten times results from the sensor in 1 second
ZHAOYIHUI 3:3dc3d2da405a 71 calculate the average
ZHAOYIHUI 3:3dc3d2da405a 72 */
ZHAOYIHUI 0:a4f69f448e86 73 float getAverage()// calculate the average distance
ZHAOYIHUI 0:a4f69f448e86 74 {
ZHAOYIHUI 0:a4f69f448e86 75 int sum = 0; // sum = 0
ZHAOYIHUI 0:a4f69f448e86 76
ZHAOYIHUI 0:a4f69f448e86 77 float average; // the type of average is float
ZHAOYIHUI 0:a4f69f448e86 78
ZHAOYIHUI 0:a4f69f448e86 79 for(int i=0; i<10; i++) {// loop for get 10 distances in 1 sec
ZHAOYIHUI 0:a4f69f448e86 80 sum += srf02.getDistanceCm();// read the value from the sensor and sum up
ZHAOYIHUI 0:a4f69f448e86 81
ZHAOYIHUI 0:a4f69f448e86 82 wait_ms(100);// wait 100ms
ZHAOYIHUI 0:a4f69f448e86 83
ZHAOYIHUI 0:a4f69f448e86 84 }
ZHAOYIHUI 0:a4f69f448e86 85
ZHAOYIHUI 0:a4f69f448e86 86 // serial - print sum
ZHAOYIHUI 0:a4f69f448e86 87
ZHAOYIHUI 0:a4f69f448e86 88 average = sum/10.0;// the average is the sum divided by 10
ZHAOYIHUI 0:a4f69f448e86 89 // serial - print average
ZHAOYIHUI 0:a4f69f448e86 90 return average;
ZHAOYIHUI 0:a4f69f448e86 91
ZHAOYIHUI 0:a4f69f448e86 92 }
ZHAOYIHUI 0:a4f69f448e86 93 /**
ZHAOYIHUI 3:3dc3d2da405a 94 RTC is used
ZHAOYIHUI 3:3dc3d2da405a 95 The button S2 is used to change the unit
ZHAOYIHUI 3:3dc3d2da405a 96 The button S3 is used to change the brightness
ZHAOYIHUI 3:3dc3d2da405a 97 Display the result and time on the LCD
ZHAOYIHUI 0:a4f69f448e86 98 */
ZHAOYIHUI 0:a4f69f448e86 99 int main()
ZHAOYIHUI 0:a4f69f448e86 100 {
ZHAOYIHUI 0:a4f69f448e86 101 buzzer.beep(1000,1.0);// a sound for start
ZHAOYIHUI 0:a4f69f448e86 102 lcd.init();//first need to initialise display
ZHAOYIHUI 0:a4f69f448e86 103 lcd.printString("Ultrasonic",1,1);
ZHAOYIHUI 0:a4f69f448e86 104 lcd.printString("Ranger",5,3);
ZHAOYIHUI 0:a4f69f448e86 105 lcd.printString("Finder",7,5);
ZHAOYIHUI 0:a4f69f448e86 106 wait(1.5);//wait 1.5 to start to detect the distance
ZHAOYIHUI 0:a4f69f448e86 107 lcd.clear();// clear the screen and buffer
ZHAOYIHUI 0:a4f69f448e86 108
ZHAOYIHUI 0:a4f69f448e86 109 //RTC
ZHAOYIHUI 0:a4f69f448e86 110 serial.attach(&serialISR);// attach serial string
ZHAOYIHUI 0:a4f69f448e86 111 char t[30];// buffer used to store time string
ZHAOYIHUI 0:a4f69f448e86 112 button.rise(&buttonPressed);//event generated on rising edge
ZHAOYIHUI 0:a4f69f448e86 113 button2.rise(&buttonPressed2);// event generated on rising edge
ZHAOYIHUI 0:a4f69f448e86 114 // set the buzzer make noise at 1000HZ in 1 seconds when turn on the device
ZHAOYIHUI 0:a4f69f448e86 115 led = 0; //set the red led is off when turn on the deivce
ZHAOYIHUI 0:a4f69f448e86 116
ZHAOYIHUI 0:a4f69f448e86 117
ZHAOYIHUI 0:a4f69f448e86 118 while(1)
ZHAOYIHUI 0:a4f69f448e86 119 {
ZHAOYIHUI 0:a4f69f448e86 120 lcd.printString("Distance is :",0,0);// display the sentence on the first line
ZHAOYIHUI 0:a4f69f448e86 121 // RTC
ZHAOYIHUI 0:a4f69f448e86 122 time_t seconds = time(NULL);//get current time
ZHAOYIHUI 0:a4f69f448e86 123
ZHAOYIHUI 0:a4f69f448e86 124 strftime(t, 30 , "%X %D",localtime(&seconds));//format time into a string(time and data)
ZHAOYIHUI 0:a4f69f448e86 125
ZHAOYIHUI 0:a4f69f448e86 126 serial.printf("Time = %s\n" ,t);//print over serial for texting
ZHAOYIHUI 0:a4f69f448e86 127 lcd.printString(t,0,4);// dispaly the data on the screen
ZHAOYIHUI 0:a4f69f448e86 128 /*
ZHAOYIHUI 0:a4f69f448e86 129 float average =getAverage();// get the data from the getAverage function
ZHAOYIHUI 0:a4f69f448e86 130 char A[14];// buffer of the average
ZHAOYIHUI 0:a4f69f448e86 131 length = sprintf(A,"D = %.2f cm",average);
ZHAOYIHUI 0:a4f69f448e86 132 lcd.printString(A,0,2);// display the date on the screen
ZHAOYIHUI 0:a4f69f448e86 133 */
ZHAOYIHUI 0:a4f69f448e86 134
ZHAOYIHUI 0:a4f69f448e86 135 if(setTimerFlag)// if updated time has been sent
ZHAOYIHUI 0:a4f69f448e86 136 {
ZHAOYIHUI 0:a4f69f448e86 137 setTimerFlag = 0; // clear flag
ZHAOYIHUI 0:a4f69f448e86 138 setTime();//update
ZHAOYIHUI 0:a4f69f448e86 139
ZHAOYIHUI 0:a4f69f448e86 140 }
ZHAOYIHUI 0:a4f69f448e86 141
ZHAOYIHUI 0:a4f69f448e86 142
ZHAOYIHUI 0:a4f69f448e86 143 // display the distance on the screen
ZHAOYIHUI 0:a4f69f448e86 144
ZHAOYIHUI 0:a4f69f448e86 145 int distance = srf02.getDistanceCm();// the distance is a integer and get the data from the getDistanceCm function
ZHAOYIHUI 0:a4f69f448e86 146 char buffer[14];//create a buffer to store 14 characters
ZHAOYIHUI 0:a4f69f448e86 147 int length = sprintf(buffer,"D = %d cm",distance); // scan this buffer and D = %d cm and calculate the length
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,1); // display the answer on the LCD screen
ZHAOYIHUI 0:a4f69f448e86 151 */
ZHAOYIHUI 0:a4f69f448e86 152 char buffer2[14];
ZHAOYIHUI 0:a4f69f448e86 153 float inch = distance/30.48 ; // change the distance from to inches
ZHAOYIHUI 0:a4f69f448e86 154 length = sprintf(buffer2,"D = %.2f ft",inch); // scan the length again
ZHAOYIHUI 0:a4f69f448e86 155 /*
ZHAOYIHUI 0:a4f69f448e86 156 if(length <= 14)//if statement set the lenght should less than 14
ZHAOYIHUI 0:a4f69f448e86 157 lcd.printString(buffer,0,3);// display the answer on the LCD screen
ZHAOYIHUI 0:a4f69f448e86 158 */
ZHAOYIHUI 0:a4f69f448e86 159
ZHAOYIHUI 0:a4f69f448e86 160 wait(1.0);// wait 1 second to do next measurement
ZHAOYIHUI 0:a4f69f448e86 161 lcd.clear(); // clear the buffer and refesh the lcd to avoide repeat pixel
ZHAOYIHUI 0:a4f69f448e86 162 if(distance<15)// the srf02 can not measure the distance low than 15
ZHAOYIHUI 0:a4f69f448e86 163 {
ZHAOYIHUI 0:a4f69f448e86 164 lcd.printString("ERROR!!!",0,1);// print ERROR on the screen
ZHAOYIHUI 0:a4f69f448e86 165 lcd.printString("MINUMUM",0,3);// show the MINUMUN
ZHAOYIHUI 0:a4f69f448e86 166 //as well
ZHAOYIHUI 0:a4f69f448e86 167 }
ZHAOYIHUI 0:a4f69f448e86 168 if(distance<30 && distance >15)
ZHAOYIHUI 0:a4f69f448e86 169 { // if the distance less than the 30, the buzzer and red led on work
ZHAOYIHUI 0:a4f69f448e86 170 //buzzer
ZHAOYIHUI 0:a4f69f448e86 171 buzzer.beep(4000,0.7);// buzzer make noise at 3000hz in 0.5second
ZHAOYIHUI 0:a4f69f448e86 172 led = 1;//red led on
ZHAOYIHUI 0:a4f69f448e86 173 }
ZHAOYIHUI 0:a4f69f448e86 174 else if
ZHAOYIHUI 0:a4f69f448e86 175 (distance > 30 && distance <60)
ZHAOYIHUI 0:a4f69f448e86 176 { //if the distance between the 30 and 60 cm.
ZHAOYIHUI 0:a4f69f448e86 177
ZHAOYIHUI 0:a4f69f448e86 178 buzzer.beep(1000,0.5);// the buzzer make noise at 1000hz in 0.2 second
ZHAOYIHUI 0:a4f69f448e86 179 led = 0;
ZHAOYIHUI 0:a4f69f448e86 180
ZHAOYIHUI 0:a4f69f448e86 181 }
ZHAOYIHUI 0:a4f69f448e86 182 else if(distance > 60 && distance< 100)
ZHAOYIHUI 0:a4f69f448e86 183 { // if the distance between 60 and 100 cm
ZHAOYIHUI 0:a4f69f448e86 184 buzzer.beep(400,0.2);// the buzzer make noise at 500 hz in 0.1 second
ZHAOYIHUI 0:a4f69f448e86 185 led = 0 ;
ZHAOYIHUI 0:a4f69f448e86 186
ZHAOYIHUI 0:a4f69f448e86 187 }
ZHAOYIHUI 0:a4f69f448e86 188
ZHAOYIHUI 0:a4f69f448e86 189 // set the buttons
ZHAOYIHUI 0:a4f69f448e86 190
ZHAOYIHUI 0:a4f69f448e86 191 switch(state)
ZHAOYIHUI 0:a4f69f448e86 192 {
ZHAOYIHUI 0:a4f69f448e86 193 case centimeter: // in centimeter cas
ZHAOYIHUI 0:a4f69f448e86 194 state = 1;// let the state to 1
ZHAOYIHUI 0:a4f69f448e86 195 if(length <= 14)// if statement set the lenght should less than 14
ZHAOYIHUI 0:a4f69f448e86 196 lcd.printString(buffer,0,2); // display the answer on the LCD screen
ZHAOYIHUI 0:a4f69f448e86 197 break;//out of the funcion
ZHAOYIHUI 0:a4f69f448e86 198 case inches:// in inches case
ZHAOYIHUI 0:a4f69f448e86 199 state = 0;// set the state = 0
ZHAOYIHUI 0:a4f69f448e86 200 if(length <= 14)//if statement set the lenght should less than 14
ZHAOYIHUI 0:a4f69f448e86 201 lcd.printString(buffer2,0,2);// display the answer on the LCD screen
ZHAOYIHUI 0:a4f69f448e86 202 break;//out the funcion
ZHAOYIHUI 0:a4f69f448e86 203 default:
ZHAOYIHUI 0:a4f69f448e86 204 break;
ZHAOYIHUI 0:a4f69f448e86 205
ZHAOYIHUI 0:a4f69f448e86 206 }
ZHAOYIHUI 0:a4f69f448e86 207 if(buttonFlag)
ZHAOYIHUI 0:a4f69f448e86 208 {
ZHAOYIHUI 0:a4f69f448e86 209 buttonFlag =0;// set buttonFlag = 0
ZHAOYIHUI 0:a4f69f448e86 210 lcd.setBrightness(brightness);//set the brightness
ZHAOYIHUI 0:a4f69f448e86 211 switch(brightness)// check the state what the brightness
ZHAOYIHUI 0:a4f69f448e86 212 {
ZHAOYIHUI 0:a4f69f448e86 213 case light:// if the brightness is 1
ZHAOYIHUI 0:a4f69f448e86 214 brightness = 0;// set brightness to 0
ZHAOYIHUI 0:a4f69f448e86 215 break;// go out of the loop
ZHAOYIHUI 0:a4f69f448e86 216 case dark:// if the brightness is 0
ZHAOYIHUI 0:a4f69f448e86 217 brightness = 1;// set to brightness to 1
ZHAOYIHUI 0:a4f69f448e86 218 break;
ZHAOYIHUI 0:a4f69f448e86 219 default:
ZHAOYIHUI 0:a4f69f448e86 220 break;
ZHAOYIHUI 0:a4f69f448e86 221 }
ZHAOYIHUI 0:a4f69f448e86 222 }
ZHAOYIHUI 0:a4f69f448e86 223
ZHAOYIHUI 0:a4f69f448e86 224 }
ZHAOYIHUI 0:a4f69f448e86 225
ZHAOYIHUI 0:a4f69f448e86 226
ZHAOYIHUI 0:a4f69f448e86 227
ZHAOYIHUI 0:a4f69f448e86 228 }
ZHAOYIHUI 2:f48fe83aecca 229 /**
ZHAOYIHUI 4:e485ad337011 230 converts a string to an integer
ZHAOYIHUI 4:e485ad337011 231 and set the current time
ZHAOYIHUI 2:f48fe83aecca 232 */
ZHAOYIHUI 0:a4f69f448e86 233 void setTime()
ZHAOYIHUI 0:a4f69f448e86 234 {
ZHAOYIHUI 0:a4f69f448e86 235 // pring something for debugging
ZHAOYIHUI 0:a4f69f448e86 236 serial.printf("set_time - %s",rxString);
ZHAOYIHUI 0:a4f69f448e86 237 //atoi()converts a string to an integer
ZHAOYIHUI 0:a4f69f448e86 238 int time = atoi(rxString);
ZHAOYIHUI 0:a4f69f448e86 239 //update the time
ZHAOYIHUI 0:a4f69f448e86 240 set_time(time);
ZHAOYIHUI 0:a4f69f448e86 241 }
ZHAOYIHUI 2:f48fe83aecca 242 /**
ZHAOYIHUI 2:f48fe83aecca 243 @when the serial interrupt occures, read rx string into buffer
ZHAOYIHUI 2:f48fe83aecca 244 */
ZHAOYIHUI 0:a4f69f448e86 245 void serialISR()
ZHAOYIHUI 0:a4f69f448e86 246 {
ZHAOYIHUI 0:a4f69f448e86 247 //when a serial interrupt occurs, read rx string into buffer
ZHAOYIHUI 0:a4f69f448e86 248 serial.gets(rxString,16);
ZHAOYIHUI 0:a4f69f448e86 249 //set flag
ZHAOYIHUI 0:a4f69f448e86 250 setTimerFlag = 1;
ZHAOYIHUI 0:a4f69f448e86 251 }