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

Dependencies:   N5110 SRF02 beep mbed

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?

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 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 }