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

Dependencies:   N5110 SRF02 beep mbed

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