Program implementing various applications of the ultrasonic distance sensor SRF02 combined with other components. Five different modules to show the various possible applications of the device. A focus on linear distance measurement, the synchronization of an alert/signalling system and accessibility.

Dependencies:   N5110 SRF02 beep mbed

Committer:
MahletShimellis
Date:
Mon May 11 22:30:17 2015 +0000
Revision:
1:37d0985c814e
Echolocation using Obstacle Detection with Ultrasonic Distance Sensor SRF02

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MahletShimellis 1:37d0985c814e 1 /**
MahletShimellis 1:37d0985c814e 2 @file obstacle.cpp
MahletShimellis 1:37d0985c814e 3 @brief Program Implementation
MahletShimellis 1:37d0985c814e 4 */
MahletShimellis 1:37d0985c814e 5
MahletShimellis 1:37d0985c814e 6 #include "mbed.h"
MahletShimellis 1:37d0985c814e 7 #include "SRF02.h"
MahletShimellis 1:37d0985c814e 8 #include "N5110.h"
MahletShimellis 1:37d0985c814e 9 #include "beep.h"
MahletShimellis 1:37d0985c814e 10 #include "obstacle.h"
MahletShimellis 1:37d0985c814e 11
MahletShimellis 1:37d0985c814e 12
MahletShimellis 1:37d0985c814e 13 //////////////////////////PART 1 - SETTING UP THE MEASUREMENTS//////////////////////////////
MahletShimellis 1:37d0985c814e 14
MahletShimellis 1:37d0985c814e 15 int timerFlag=0;
MahletShimellis 1:37d0985c814e 16 void timerExpired()
MahletShimellis 1:37d0985c814e 17 {
MahletShimellis 1:37d0985c814e 18 timerFlag =1;
MahletShimellis 1:37d0985c814e 19 }
MahletShimellis 1:37d0985c814e 20
MahletShimellis 1:37d0985c814e 21 void error(int code)
MahletShimellis 1:37d0985c814e 22 {
MahletShimellis 1:37d0985c814e 23 while(1) {
MahletShimellis 1:37d0985c814e 24 leds = 0;
MahletShimellis 1:37d0985c814e 25 wait(0.25);
MahletShimellis 1:37d0985c814e 26 leds = code;
MahletShimellis 1:37d0985c814e 27 wait(0.25);
MahletShimellis 1:37d0985c814e 28 }
MahletShimellis 1:37d0985c814e 29 }
MahletShimellis 1:37d0985c814e 30
MahletShimellis 1:37d0985c814e 31 void measureExpired()
MahletShimellis 1:37d0985c814e 32 {
MahletShimellis 1:37d0985c814e 33 measureFlag =1;
MahletShimellis 1:37d0985c814e 34 }
MahletShimellis 1:37d0985c814e 35
MahletShimellis 1:37d0985c814e 36
MahletShimellis 1:37d0985c814e 37 /*
MahletShimellis 1:37d0985c814e 38 void initTMP102()
MahletShimellis 1:37d0985c814e 39 {
MahletShimellis 1:37d0985c814e 40 tmp102.frequency(400000); // set bus speed to 400 kHz
MahletShimellis 1:37d0985c814e 41 int ack; // used to store acknowledgement bit
MahletShimellis 1:37d0985c814e 42 char data[2]; // array for data
MahletShimellis 1:37d0985c814e 43 char reg = CONFIG_REG; // register address
MahletShimellis 1:37d0985c814e 44 //////// Read current status of configuration register ///////
MahletShimellis 1:37d0985c814e 45
MahletShimellis 1:37d0985c814e 46 ack = tmp102.write(TMP102_W_ADD,&reg,1); // send the slave write address and the configuration register address
MahletShimellis 1:37d0985c814e 47 if (ack)
MahletShimellis 1:37d0985c814e 48 error(1); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 49 ack = tmp102.read(TMP102_R_ADD,data,2); // read default 2 bytes from configuration register and store in buffer
MahletShimellis 1:37d0985c814e 50 if (ack)
MahletShimellis 1:37d0985c814e 51 error(2); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 52 ///////// Configure the register //////////
MahletShimellis 1:37d0985c814e 53 // set conversion rate to 1 Hz
MahletShimellis 1:37d0985c814e 54 data[1] |= (1 << 6); // set bit 6
MahletShimellis 1:37d0985c814e 55 data[1] &= ~(1 << 7); // clear bit 7
MahletShimellis 1:37d0985c814e 56
MahletShimellis 1:37d0985c814e 57 //////// Send the configured register to the slave ////////////
MahletShimellis 1:37d0985c814e 58
MahletShimellis 1:37d0985c814e 59 ack = tmp102.write(TMP102_W_ADD,&reg,1); // send the slave write address and the configuration register address
MahletShimellis 1:37d0985c814e 60 if (ack)
MahletShimellis 1:37d0985c814e 61 error(3); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 62 ack = tmp102.write(TMP102_W_ADD,data,2); // send 2 data bytes to the configuration register
MahletShimellis 1:37d0985c814e 63 if (ack)
MahletShimellis 1:37d0985c814e 64 error(4); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 65
MahletShimellis 1:37d0985c814e 66 }
MahletShimellis 1:37d0985c814e 67
MahletShimellis 1:37d0985c814e 68 float getTemperature()
MahletShimellis 1:37d0985c814e 69 {
MahletShimellis 1:37d0985c814e 70 int ack; // used to store acknowledgement bit
MahletShimellis 1:37d0985c814e 71 char data[2]; // array for data
MahletShimellis 1:37d0985c814e 72 char reg = TEMP_REG; // temperature register address
MahletShimellis 1:37d0985c814e 73 ack = tmp102.write(TMP102_W_ADD,&reg,1); // send temperature register address
MahletShimellis 1:37d0985c814e 74 if (ack)
MahletShimellis 1:37d0985c814e 75 error(5); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 76 ack = tmp102.read(TMP102_R_ADD,data,2); // read 2 bytes from temperature register and store in array
MahletShimellis 1:37d0985c814e 77 if (ack)
MahletShimellis 1:37d0985c814e 78 error(6); // if we don't receive acknowledgement, flash error message
MahletShimellis 1:37d0985c814e 79 temperature = (data[0] << 4) | (data[1] >> 4);
MahletShimellis 1:37d0985c814e 80 return temperature*0.0625;
MahletShimellis 1:37d0985c814e 81 }
MahletShimellis 1:37d0985c814e 82
MahletShimellis 1:37d0985c814e 83 float calcSoundSpeed(float temperature)
MahletShimellis 1:37d0985c814e 84 {
MahletShimellis 1:37d0985c814e 85 return soundSpeed = temperature*0.6 + 331.3;
MahletShimellis 1:37d0985c814e 86 }
MahletShimellis 1:37d0985c814e 87
MahletShimellis 1:37d0985c814e 88 float calcSoundTimeDelay (int distance, float soundSpeed)
MahletShimellis 1:37d0985c814e 89 { distance =srf.getDistanceCm();
MahletShimellis 1:37d0985c814e 90 return soundTimeDelay = distance/soundSpeed;
MahletShimellis 1:37d0985c814e 91 }
MahletShimellis 1:37d0985c814e 92 */
MahletShimellis 1:37d0985c814e 93
MahletShimellis 1:37d0985c814e 94
MahletShimellis 1:37d0985c814e 95 ///////////////////PART 2 - Distance Upadate and Speed //////////////////////
MahletShimellis 1:37d0985c814e 96
MahletShimellis 1:37d0985c814e 97
MahletShimellis 1:37d0985c814e 98 void updateExpired()
MahletShimellis 1:37d0985c814e 99 {
MahletShimellis 1:37d0985c814e 100 updateFlag=1; ///
MahletShimellis 1:37d0985c814e 101 }
MahletShimellis 1:37d0985c814e 102
MahletShimellis 1:37d0985c814e 103 void update_distance_new()
MahletShimellis 1:37d0985c814e 104 {
MahletShimellis 1:37d0985c814e 105 lastDistance = newDistance; ///updates the lastDistance variable by storing into it the previous distance measurement
MahletShimellis 1:37d0985c814e 106 newDistance = srf.getDistanceCm();///updates the newDistance variable by adding to it the new distance measurement
MahletShimellis 1:37d0985c814e 107 }
MahletShimellis 1:37d0985c814e 108
MahletShimellis 1:37d0985c814e 109
MahletShimellis 1:37d0985c814e 110 ///////////////////PART 3 - Distance Range Alert//////////////////////////////
MahletShimellis 1:37d0985c814e 111
MahletShimellis 1:37d0985c814e 112 void rangeExpired()
MahletShimellis 1:37d0985c814e 113 {
MahletShimellis 1:37d0985c814e 114 rangeFlag =1;
MahletShimellis 1:37d0985c814e 115 }
MahletShimellis 1:37d0985c814e 116
MahletShimellis 1:37d0985c814e 117 struct State {
MahletShimellis 1:37d0985c814e 118 float bOutput; /// buzzer output value
MahletShimellis 1:37d0985c814e 119 int nextState[5]; /// array of next states
MahletShimellis 1:37d0985c814e 120 };
MahletShimellis 1:37d0985c814e 121 typedef const struct State STyp;
MahletShimellis 1:37d0985c814e 122
MahletShimellis 1:37d0985c814e 123 STyp fsm[5] = {
MahletShimellis 1:37d0985c814e 124 {8000,{0,1,2,3,4}}, // State 0 - object at less than 20 cm away
MahletShimellis 1:37d0985c814e 125 {2000,{0,1,2,3,4}}, // 1 - object in the 20-65cm range from the person
MahletShimellis 1:37d0985c814e 126 {1000,{0,1,2,3,4}}, // 2 - object in the 65-110cm range from the person
MahletShimellis 1:37d0985c814e 127 {500,{0,1,2,3,4}}, // 3 - object in the 110-155cm range from the person
MahletShimellis 1:37d0985c814e 128 {200,{0,1,2,3,4}}, // 4 - object in the 155-200cm range from the person
MahletShimellis 1:37d0985c814e 129
MahletShimellis 1:37d0985c814e 130 };
MahletShimellis 1:37d0985c814e 131
MahletShimellis 1:37d0985c814e 132 void updateState()
MahletShimellis 1:37d0985c814e 133 {
MahletShimellis 1:37d0985c814e 134
MahletShimellis 1:37d0985c814e 135 distance = srf.getDistanceCm();
MahletShimellis 1:37d0985c814e 136 if(distance<=20) rangeState=0;
MahletShimellis 1:37d0985c814e 137 else if((distance>20)&&(distance<=65))rangeState=1;
MahletShimellis 1:37d0985c814e 138 else if ((distance>65)&&(distance<=110))rangeState=2;
MahletShimellis 1:37d0985c814e 139 else if ((distance>110)&&(distance<=155))rangeState=3;
MahletShimellis 1:37d0985c814e 140 else if ((distance>155)&&(distance<=200))rangeState=4;
MahletShimellis 1:37d0985c814e 141
MahletShimellis 1:37d0985c814e 142
MahletShimellis 1:37d0985c814e 143 currentState = fsm[currentState].nextState[rangeState];
MahletShimellis 1:37d0985c814e 144 }
MahletShimellis 1:37d0985c814e 145
MahletShimellis 1:37d0985c814e 146 ///////////////////PART 4 - Beam Pattern ///////////////////////////////////
MahletShimellis 1:37d0985c814e 147
MahletShimellis 1:37d0985c814e 148 double angleArray[5]= {0,10,20,30,40}; /*!<array of angles from the center of the sensor*/
MahletShimellis 1:37d0985c814e 149
MahletShimellis 1:37d0985c814e 150
MahletShimellis 1:37d0985c814e 151 void beamExpired()
MahletShimellis 1:37d0985c814e 152 {
MahletShimellis 1:37d0985c814e 153 beamFlag=1;
MahletShimellis 1:37d0985c814e 154 }
MahletShimellis 1:37d0985c814e 155
MahletShimellis 1:37d0985c814e 156 double convertDegrees(double angleDegrees)
MahletShimellis 1:37d0985c814e 157 {
MahletShimellis 1:37d0985c814e 158 ///uses equivalence of 2pi and 180 degrees
MahletShimellis 1:37d0985c814e 159 return angleDegrees*3.16/180;
MahletShimellis 1:37d0985c814e 160 }
MahletShimellis 1:37d0985c814e 161
MahletShimellis 1:37d0985c814e 162 void drawSemiCircle()
MahletShimellis 1:37d0985c814e 163 {
MahletShimellis 1:37d0985c814e 164 //draws a semi circle on the screen of radius equal to the distance from the object
MahletShimellis 1:37d0985c814e 165 int radius = srf.getDistanceCm(); /// int radius = ((30*srf.getDistanceCm())/20); other possibility
MahletShimellis 1:37d0985c814e 166 lcd.drawCircle(WIDTH/2,1,radius,0); /// x,y,radius,transparent with outline
MahletShimellis 1:37d0985c814e 167 lcd.drawLine(WIDTH/2,1,WIDTH/2,radius,2); ///draws one diameter
MahletShimellis 1:37d0985c814e 168 lcd.refresh();
MahletShimellis 1:37d0985c814e 169 }
MahletShimellis 1:37d0985c814e 170
MahletShimellis 1:37d0985c814e 171 void drawBeamLines()
MahletShimellis 1:37d0985c814e 172 {
MahletShimellis 1:37d0985c814e 173 ///draws a beam line for each calcualted value
MahletShimellis 1:37d0985c814e 174 lcd.drawLine(WIDTH/2,1,WIDTH/2+l,h,2);
MahletShimellis 1:37d0985c814e 175 lcd.drawLine(WIDTH/2,1,WIDTH/2-l,h,2);
MahletShimellis 1:37d0985c814e 176 lcd.refresh();
MahletShimellis 1:37d0985c814e 177 }
MahletShimellis 1:37d0985c814e 178
MahletShimellis 1:37d0985c814e 179 double lat(double a, double d)
MahletShimellis 1:37d0985c814e 180 {
MahletShimellis 1:37d0985c814e 181 return (tan(a) *d);
MahletShimellis 1:37d0985c814e 182 }
MahletShimellis 1:37d0985c814e 183
MahletShimellis 1:37d0985c814e 184 double hyp(double a, double d)
MahletShimellis 1:37d0985c814e 185 {
MahletShimellis 1:37d0985c814e 186 return ((tan(a) *d)/sin(a));
MahletShimellis 1:37d0985c814e 187 }
MahletShimellis 1:37d0985c814e 188
MahletShimellis 1:37d0985c814e 189 /////////////////////////PART 5 - the Wall Follower Simulation //////////////////////
MahletShimellis 1:37d0985c814e 190
MahletShimellis 1:37d0985c814e 191 void wallExpired()
MahletShimellis 1:37d0985c814e 192 {
MahletShimellis 1:37d0985c814e 193 wallFlag=1;
MahletShimellis 1:37d0985c814e 194 }
MahletShimellis 1:37d0985c814e 195
MahletShimellis 1:37d0985c814e 196 void moveForward()
MahletShimellis 1:37d0985c814e 197 {
MahletShimellis 1:37d0985c814e 198 /// sets pixel to move forward
MahletShimellis 1:37d0985c814e 199
MahletShimellis 1:37d0985c814e 200 for(int k=0; k<=22; k++) {
MahletShimellis 1:37d0985c814e 201 lcd.setPixel(16,k); /// (x,y) starting point of the pixel - here fixed x coordinate - vertical movement
MahletShimellis 1:37d0985c814e 202 wait(0.2); ///can be considered as the "speed of the movement" because it defines the rate if change of pixel - delay between two k values
MahletShimellis 1:37d0985c814e 203 pix++; ///increments the pix vlaue for each increase in k
MahletShimellis 1:37d0985c814e 204 lcd.refresh();
MahletShimellis 1:37d0985c814e 205 }
MahletShimellis 1:37d0985c814e 206 }
MahletShimellis 1:37d0985c814e 207
MahletShimellis 1:37d0985c814e 208 void turnLeftForward_one()
MahletShimellis 1:37d0985c814e 209 {
MahletShimellis 1:37d0985c814e 210 ///sets the pixel to turn left forward
MahletShimellis 1:37d0985c814e 211
MahletShimellis 1:37d0985c814e 212 for(int l=0; l<=64; l++) {
MahletShimellis 1:37d0985c814e 213 lcd.setPixel(l+16,22); /// (x,22) starting point of the pixel - here fixed y coordinate - horizontal movement
MahletShimellis 1:37d0985c814e 214 wait(0.2);
MahletShimellis 1:37d0985c814e 215 pix=pix+1; ///increments the pix vlaue for each increase in l
MahletShimellis 1:37d0985c814e 216 lcd.refresh();
MahletShimellis 1:37d0985c814e 217 }
MahletShimellis 1:37d0985c814e 218
MahletShimellis 1:37d0985c814e 219 }
MahletShimellis 1:37d0985c814e 220
MahletShimellis 1:37d0985c814e 221 void turnLeftForward_two()
MahletShimellis 1:37d0985c814e 222 {
MahletShimellis 1:37d0985c814e 223 ///sets the pixel to turn right forward -one
MahletShimellis 1:37d0985c814e 224
MahletShimellis 1:37d0985c814e 225 for (int m=0; m<=16; m++) {
MahletShimellis 1:37d0985c814e 226 lcd.setPixel(80,m+22); /// (80,y) starting point of the pixel - here fixed x coordinate - vertical movement
MahletShimellis 1:37d0985c814e 227 wait(0.2);
MahletShimellis 1:37d0985c814e 228 pix=pix+1; ///increments the pix vlaue for each increase in m
MahletShimellis 1:37d0985c814e 229 lcd.refresh();
MahletShimellis 1:37d0985c814e 230 }
MahletShimellis 1:37d0985c814e 231
MahletShimellis 1:37d0985c814e 232 }
MahletShimellis 1:37d0985c814e 233
MahletShimellis 1:37d0985c814e 234 void turnRightForward()
MahletShimellis 1:37d0985c814e 235 {
MahletShimellis 1:37d0985c814e 236 ///sets the pixel to turn right forward -two
MahletShimellis 1:37d0985c814e 237
MahletShimellis 1:37d0985c814e 238 for(int n=0; n<=78; n++) {
MahletShimellis 1:37d0985c814e 239 lcd.setPixel(80-n,38); /// (x,38) starting point of the pixel - here fixed y coordinate - horizontal movement- x=80-n because counting down from the end x=80 to he beginning x=2 of the screen
MahletShimellis 1:37d0985c814e 240 wait(0.2);
MahletShimellis 1:37d0985c814e 241 pix=pix+1; ///increments the pix vlaue for each increase in n
MahletShimellis 1:37d0985c814e 242 lcd.refresh();
MahletShimellis 1:37d0985c814e 243 }
MahletShimellis 1:37d0985c814e 244 //lcd.refresh();
MahletShimellis 1:37d0985c814e 245 }
MahletShimellis 1:37d0985c814e 246
MahletShimellis 1:37d0985c814e 247
MahletShimellis 1:37d0985c814e 248 ///intial beep zero move forward
MahletShimellis 1:37d0985c814e 249 void beep_zero()
MahletShimellis 1:37d0985c814e 250 {
MahletShimellis 1:37d0985c814e 251 int sound_zero = 200; /// local varaible integer gives specific frequency value for the buzzer
MahletShimellis 1:37d0985c814e 252 float time_zero = 0.22; /// local varaible integer gives specific time for the buzzer
MahletShimellis 1:37d0985c814e 253 buzzer.beep(sound_zero,time_zero);
MahletShimellis 1:37d0985c814e 254
MahletShimellis 1:37d0985c814e 255 }
MahletShimellis 1:37d0985c814e 256
MahletShimellis 1:37d0985c814e 257 ///turns on beep one Turn Left
MahletShimellis 1:37d0985c814e 258 void beep_one()
MahletShimellis 1:37d0985c814e 259 {
MahletShimellis 1:37d0985c814e 260 int sound_one = 600;
MahletShimellis 1:37d0985c814e 261 float time_one = 0.2;
MahletShimellis 1:37d0985c814e 262 buzzer.beep(sound_one,time_one);
MahletShimellis 1:37d0985c814e 263 }
MahletShimellis 1:37d0985c814e 264
MahletShimellis 1:37d0985c814e 265 /// turns on beep two Trun Left and move Forward
MahletShimellis 1:37d0985c814e 266 void beep_two()
MahletShimellis 1:37d0985c814e 267 {
MahletShimellis 1:37d0985c814e 268 int sound_two = 800;
MahletShimellis 1:37d0985c814e 269 float time_two = 0.23;
MahletShimellis 1:37d0985c814e 270 buzzer.beep(sound_two,time_two);
MahletShimellis 1:37d0985c814e 271 }
MahletShimellis 1:37d0985c814e 272
MahletShimellis 1:37d0985c814e 273 //turns on beep three Turn Right
MahletShimellis 1:37d0985c814e 274 void beep_three()
MahletShimellis 1:37d0985c814e 275 {
MahletShimellis 1:37d0985c814e 276 int sound_three = 1600;
MahletShimellis 1:37d0985c814e 277 float time_three = 0.2;
MahletShimellis 1:37d0985c814e 278 buzzer.beep(sound_three,time_three);
MahletShimellis 1:37d0985c814e 279 }
MahletShimellis 1:37d0985c814e 280
MahletShimellis 1:37d0985c814e 281 /// turns on beep four Turn Right and move Forward
MahletShimellis 1:37d0985c814e 282 void beep_four()
MahletShimellis 1:37d0985c814e 283 {
MahletShimellis 1:37d0985c814e 284 int sound_four = 2000;
MahletShimellis 1:37d0985c814e 285 float time_four = 0.14;
MahletShimellis 1:37d0985c814e 286 buzzer.beep(sound_four,time_four);
MahletShimellis 1:37d0985c814e 287 }
MahletShimellis 1:37d0985c814e 288
MahletShimellis 1:37d0985c814e 289 /// turns on beep five Stop Dead End
MahletShimellis 1:37d0985c814e 290 void beep_five()
MahletShimellis 1:37d0985c814e 291 {
MahletShimellis 1:37d0985c814e 292 int sound_five = 2600;
MahletShimellis 1:37d0985c814e 293 float time_five = 0.6;
MahletShimellis 1:37d0985c814e 294 buzzer.beep(sound_five,time_five);
MahletShimellis 1:37d0985c814e 295 }
MahletShimellis 1:37d0985c814e 296
MahletShimellis 1:37d0985c814e 297 void toggle_red()
MahletShimellis 1:37d0985c814e 298 {
MahletShimellis 1:37d0985c814e 299 red=!red; ///toggle red led
MahletShimellis 1:37d0985c814e 300 }
MahletShimellis 1:37d0985c814e 301 void toggle_yellow()
MahletShimellis 1:37d0985c814e 302 {
MahletShimellis 1:37d0985c814e 303 yellow=!yellow; ///toggles yellow led
MahletShimellis 1:37d0985c814e 304 }
MahletShimellis 1:37d0985c814e 305 void toggle_green()
MahletShimellis 1:37d0985c814e 306 {
MahletShimellis 1:37d0985c814e 307 green=!green; ///toggles green led
MahletShimellis 1:37d0985c814e 308 }
MahletShimellis 1:37d0985c814e 309
MahletShimellis 1:37d0985c814e 310
MahletShimellis 1:37d0985c814e 311
MahletShimellis 1:37d0985c814e 312 void move()
MahletShimellis 1:37d0985c814e 313 {
MahletShimellis 1:37d0985c814e 314 if (pix<=22) {
MahletShimellis 1:37d0985c814e 315 lcd.printString(" Forward ",32,0);
MahletShimellis 1:37d0985c814e 316 beep_ticker_zero.attach(&beep_zero, 0.61); //move forward
MahletShimellis 1:37d0985c814e 317 toggle_green_ticker.attach(&toggle_green, 0.61);
MahletShimellis 1:37d0985c814e 318 moveForward();
MahletShimellis 1:37d0985c814e 319 }
MahletShimellis 1:37d0985c814e 320
MahletShimellis 1:37d0985c814e 321 beep_ticker_zero.detach();
MahletShimellis 1:37d0985c814e 322 beep_ticker_one.attach(&beep_one, 0.2);//turn left
MahletShimellis 1:37d0985c814e 323 lcd.printString(" T Left ",32,0);
MahletShimellis 1:37d0985c814e 324 toggle_green_ticker.detach();
MahletShimellis 1:37d0985c814e 325 toggle_red_ticker.attach(&toggle_red,0.1);
MahletShimellis 1:37d0985c814e 326 wait(0.5);
MahletShimellis 1:37d0985c814e 327 beep_ticker_one.detach();
MahletShimellis 1:37d0985c814e 328
MahletShimellis 1:37d0985c814e 329
MahletShimellis 1:37d0985c814e 330 if (22<pix && pix<86) {
MahletShimellis 1:37d0985c814e 331 toggle_red_ticker.detach();
MahletShimellis 1:37d0985c814e 332 lcd.printString(" Forward ",32,0);
MahletShimellis 1:37d0985c814e 333 beep_ticker_two.attach(&beep_two, 0.66); //turn left and move forward
MahletShimellis 1:37d0985c814e 334 toggle_green_ticker.attach(&toggle_green, 0.66);
MahletShimellis 1:37d0985c814e 335 turnLeftForward_one();
MahletShimellis 1:37d0985c814e 336 }
MahletShimellis 1:37d0985c814e 337
MahletShimellis 1:37d0985c814e 338 beep_ticker_two.detach();
MahletShimellis 1:37d0985c814e 339 beep_ticker_three.attach(&beep_three,0.2);//turn right
MahletShimellis 1:37d0985c814e 340 lcd.printString(" T Right ",32,0);
MahletShimellis 1:37d0985c814e 341 toggle_green_ticker.detach();
MahletShimellis 1:37d0985c814e 342 toggle_red_ticker.attach(&toggle_red,0.1);
MahletShimellis 1:37d0985c814e 343 wait(0.5);
MahletShimellis 1:37d0985c814e 344 beep_ticker_three.detach();
MahletShimellis 1:37d0985c814e 345
MahletShimellis 1:37d0985c814e 346
MahletShimellis 1:37d0985c814e 347 if(86<pix && pix<102) {
MahletShimellis 1:37d0985c814e 348 toggle_red_ticker.detach();
MahletShimellis 1:37d0985c814e 349 lcd.printString(" Forward ",32,0);
MahletShimellis 1:37d0985c814e 350 toggle_green_ticker.attach(&toggle_green, 0.76);
MahletShimellis 1:37d0985c814e 351 beep_ticker_four.attach(&beep_four, 0.76);//turn right and move forward
MahletShimellis 1:37d0985c814e 352 turnLeftForward_two();
MahletShimellis 1:37d0985c814e 353 }
MahletShimellis 1:37d0985c814e 354
MahletShimellis 1:37d0985c814e 355 beep_ticker_four.detach();
MahletShimellis 1:37d0985c814e 356 beep_ticker_three.attach(&beep_three,0.2);//turn right
MahletShimellis 1:37d0985c814e 357 lcd.printString(" T Right ",32,0);
MahletShimellis 1:37d0985c814e 358 toggle_red_ticker.attach(&toggle_red,0.1);
MahletShimellis 1:37d0985c814e 359 wait(0.5);
MahletShimellis 1:37d0985c814e 360 beep_ticker_three.detach();
MahletShimellis 1:37d0985c814e 361
MahletShimellis 1:37d0985c814e 362
MahletShimellis 1:37d0985c814e 363 if (102<pix) {
MahletShimellis 1:37d0985c814e 364 toggle_red_ticker.detach();
MahletShimellis 1:37d0985c814e 365 beep_ticker_four.attach(&beep_four,0.8);///turn right and move forward- function called every 0.8s
MahletShimellis 1:37d0985c814e 366 toggle_green_ticker.attach(&toggle_green, 0.76); /// toggle green led function called every 0.76s
MahletShimellis 1:37d0985c814e 367 lcd.printString(" Forward ",32,0);
MahletShimellis 1:37d0985c814e 368 turnRightForward();
MahletShimellis 1:37d0985c814e 369 }
MahletShimellis 1:37d0985c814e 370
MahletShimellis 1:37d0985c814e 371 beep_ticker_four.detach();
MahletShimellis 1:37d0985c814e 372 toggle_green_ticker.detach();
MahletShimellis 1:37d0985c814e 373 lcd.printString(" STOP!! ",32,0);
MahletShimellis 1:37d0985c814e 374 toggle_red_ticker.attach(&toggle_red,0.1);
MahletShimellis 1:37d0985c814e 375 beep_ticker_five.attach(&beep_five,0.8);//stop dead end
MahletShimellis 1:37d0985c814e 376 }
MahletShimellis 1:37d0985c814e 377
MahletShimellis 1:37d0985c814e 378 void drawMaze()
MahletShimellis 1:37d0985c814e 379 {
MahletShimellis 1:37d0985c814e 380 lcd.drawRect(0,0,12,25,1); /// top left filled rectangle-green on report
MahletShimellis 1:37d0985c814e 381 lcd.drawRect(20,0,10,20,1); /// top middle filled rectangle-orange on report
MahletShimellis 1:37d0985c814e 382 lcd.drawRect(30,10,52,10,1); /// top right filled rectangle-pink on report
MahletShimellis 1:37d0985c814e 383 lcd.drawRect(0,25,76,10,1); /// middle filled rectangle-purple on report
MahletShimellis 1:37d0985c814e 384 lcd.drawRect(0,40,80,1,1); /// bottom filled rectangle-red on report
MahletShimellis 1:37d0985c814e 385 lcd.drawRect(0,36,1,4,1); /// dead end small filled rectangle-black on report
MahletShimellis 1:37d0985c814e 386 lcd.refresh();
MahletShimellis 1:37d0985c814e 387 }
MahletShimellis 1:37d0985c814e 388
MahletShimellis 1:37d0985c814e 389 ///////////////////////////////Transitions/User interface (button) selection and event order elements//////////////////////////////////
MahletShimellis 1:37d0985c814e 390
MahletShimellis 1:37d0985c814e 391 void buttonPressed()
MahletShimellis 1:37d0985c814e 392 {
MahletShimellis 1:37d0985c814e 393 buttonFlag++; ///increments and keepd the value of the buttonFlag counter for every button press
MahletShimellis 1:37d0985c814e 394 if ( buttonFlag > 4) { /// sets the limit value of the buttonFlag before going back to zero => five different flag states to be used for the five different modules
MahletShimellis 1:37d0985c814e 395 buttonFlag = 0;
MahletShimellis 1:37d0985c814e 396 }
MahletShimellis 1:37d0985c814e 397 }
MahletShimellis 1:37d0985c814e 398
MahletShimellis 1:37d0985c814e 399
MahletShimellis 1:37d0985c814e 400 void manageScreen()
MahletShimellis 1:37d0985c814e 401 {
MahletShimellis 1:37d0985c814e 402 if ( buttonFlag== 0) {
MahletShimellis 1:37d0985c814e 403 measureFlag = !measureFlag; /// toggles measureFlag - if the flag is intially low then it goes high for buttonFlag = 0 - first screen view
MahletShimellis 1:37d0985c814e 404 }
MahletShimellis 1:37d0985c814e 405 if ( buttonFlag == 1) {
MahletShimellis 1:37d0985c814e 406 updateFlag = !updateFlag; /// toggles updateFlag - if the flag is intially low then it goes high for buttonFlag = 1 - first button press - second screen view
MahletShimellis 1:37d0985c814e 407 }
MahletShimellis 1:37d0985c814e 408 if ( buttonFlag == 2) {
MahletShimellis 1:37d0985c814e 409
MahletShimellis 1:37d0985c814e 410 rangeFlag = !rangeFlag; /// toggles rangeFlag - if the flag is intially low then it goes high for buttonFlag = 2 - second button press - third screen view
MahletShimellis 1:37d0985c814e 411 }
MahletShimellis 1:37d0985c814e 412 if ( buttonFlag == 3) {
MahletShimellis 1:37d0985c814e 413 beamFlag = !beamFlag; /// toggles beamFlag - if the flag is intially low then it goes high for buttonFlag = 3 - third button press - fourth screen view
MahletShimellis 1:37d0985c814e 414 }
MahletShimellis 1:37d0985c814e 415 if ( buttonFlag == 4) {
MahletShimellis 1:37d0985c814e 416 wallFlag = !wallFlag; /// toggles wallFlag - if the flag is intially low then it goes high for buttonFlag = 4 - fourth button press - fifth screen view
MahletShimellis 1:37d0985c814e 417 }
MahletShimellis 1:37d0985c814e 418
MahletShimellis 1:37d0985c814e 419 if(measureFlag == 1) {
MahletShimellis 1:37d0985c814e 420 measure_ticker.attach(&update_distance_new,1.0);
MahletShimellis 1:37d0985c814e 421 // temperature_ticker.attach(&getTemperature,1.0);
MahletShimellis 1:37d0985c814e 422 } else {
MahletShimellis 1:37d0985c814e 423 measure_ticker.detach();
MahletShimellis 1:37d0985c814e 424 }
MahletShimellis 1:37d0985c814e 425
MahletShimellis 1:37d0985c814e 426 if(updateFlag == 1) {
MahletShimellis 1:37d0985c814e 427
MahletShimellis 1:37d0985c814e 428 update_ticker.attach(&updateExpired,2.0);
MahletShimellis 1:37d0985c814e 429
MahletShimellis 1:37d0985c814e 430 } else {
MahletShimellis 1:37d0985c814e 431 update_ticker.detach(); // detach ticker
MahletShimellis 1:37d0985c814e 432 }
MahletShimellis 1:37d0985c814e 433
MahletShimellis 1:37d0985c814e 434 if(rangeFlag == 1) {
MahletShimellis 1:37d0985c814e 435 range_ticker.attach(&rangeExpired,3.0);
MahletShimellis 1:37d0985c814e 436 } else {
MahletShimellis 1:37d0985c814e 437 range_ticker.detach();
MahletShimellis 1:37d0985c814e 438 }
MahletShimellis 1:37d0985c814e 439
MahletShimellis 1:37d0985c814e 440 if(beamFlag == 1) {
MahletShimellis 1:37d0985c814e 441 beam_ticker.attach(&beamExpired,1.0);
MahletShimellis 1:37d0985c814e 442 } else {
MahletShimellis 1:37d0985c814e 443 beam_ticker.detach();
MahletShimellis 1:37d0985c814e 444 }
MahletShimellis 1:37d0985c814e 445
MahletShimellis 1:37d0985c814e 446 if(wallFlag == 1) {
MahletShimellis 1:37d0985c814e 447 wall_ticker.attach(&wallExpired, 4.0);
MahletShimellis 1:37d0985c814e 448 } else {
MahletShimellis 1:37d0985c814e 449 wall_ticker.detach();
MahletShimellis 1:37d0985c814e 450 }
MahletShimellis 1:37d0985c814e 451 }
MahletShimellis 1:37d0985c814e 452
MahletShimellis 1:37d0985c814e 453
MahletShimellis 1:37d0985c814e 454
MahletShimellis 1:37d0985c814e 455
MahletShimellis 1:37d0985c814e 456
MahletShimellis 1:37d0985c814e 457 int main()
MahletShimellis 1:37d0985c814e 458 {
MahletShimellis 1:37d0985c814e 459 lcd.init(); //initializes the LCD display
MahletShimellis 1:37d0985c814e 460 /// initTMP102();
MahletShimellis 1:37d0985c814e 461
MahletShimellis 1:37d0985c814e 462 lcd.normalMode(); /// normal colour mode
MahletShimellis 1:37d0985c814e 463 lcd.setBrightness(0.5); /// put LED backlight on 50%
MahletShimellis 1:37d0985c814e 464 button.rise(&buttonPressed); /// indicates that the button has been pressed. button flag rises when button pressed
MahletShimellis 1:37d0985c814e 465
MahletShimellis 1:37d0985c814e 466 measure_ticker.attach(&measureExpired,1.0);
MahletShimellis 1:37d0985c814e 467 update_ticker.attach(&updateExpired,2.0);
MahletShimellis 1:37d0985c814e 468 beam_ticker.attach(&beamExpired,3.0);
MahletShimellis 1:37d0985c814e 469 // update_ticker_two.attach(&update_distance_new,2.0);
MahletShimellis 1:37d0985c814e 470 range_ticker.attach(&rangeExpired,4.0);
MahletShimellis 1:37d0985c814e 471 wall_ticker.attach(&wallExpired, 5.0);
MahletShimellis 1:37d0985c814e 472
MahletShimellis 1:37d0985c814e 473
MahletShimellis 1:37d0985c814e 474 while(1) {
MahletShimellis 1:37d0985c814e 475 // distance = srf.getDistanceCm();
MahletShimellis 1:37d0985c814e 476
MahletShimellis 1:37d0985c814e 477 manageScreen();
MahletShimellis 1:37d0985c814e 478 if (timerFlag) {
MahletShimellis 1:37d0985c814e 479 timerFlag=0; ///reset flag
MahletShimellis 1:37d0985c814e 480
MahletShimellis 1:37d0985c814e 481
MahletShimellis 1:37d0985c814e 482 if(measureFlag) {
MahletShimellis 1:37d0985c814e 483 lcd.clear();
MahletShimellis 1:37d0985c814e 484 measureFlag =0; ///reset flag
MahletShimellis 1:37d0985c814e 485
MahletShimellis 1:37d0985c814e 486 char buffer[14];
MahletShimellis 1:37d0985c814e 487
MahletShimellis 1:37d0985c814e 488 distance = srf.getDistanceCm(); /// same idea with floats
MahletShimellis 1:37d0985c814e 489 float length = sprintf(buffer,"D = %.2f cm",distance);
MahletShimellis 1:37d0985c814e 490 if (length <= 14)
MahletShimellis 1:37d0985c814e 491 lcd.printString(buffer,0,4);
MahletShimellis 1:37d0985c814e 492
MahletShimellis 1:37d0985c814e 493 /* temperature = getTemperature();
MahletShimellis 1:37d0985c814e 494 int lengthT = sprintf(buffer,"T = %.2f C",temperature); /// print formatted data to buffer
MahletShimellis 1:37d0985c814e 495 if (lengthT <= 14) /// if string will fit on display
MahletShimellis 1:37d0985c814e 496 lcd.printString(buffer,0,5);
MahletShimellis 1:37d0985c814e 497
MahletShimellis 1:37d0985c814e 498 soundSpeed = calcSoundSpeed(temperature);
MahletShimellis 1:37d0985c814e 499 soundTimeDelay = calcSoundTimeDelay(distance, soundSpeed);
MahletShimellis 1:37d0985c814e 500 */
MahletShimellis 1:37d0985c814e 501 }
MahletShimellis 1:37d0985c814e 502 lcd.refresh();
MahletShimellis 1:37d0985c814e 503
MahletShimellis 1:37d0985c814e 504
MahletShimellis 1:37d0985c814e 505 if(updateFlag) {
MahletShimellis 1:37d0985c814e 506 lcd.clear();
MahletShimellis 1:37d0985c814e 507 updateFlag=0; ///reset flag
MahletShimellis 1:37d0985c814e 508 char bufferOne[14]; ///character array that stores the values of the newDistance variable
MahletShimellis 1:37d0985c814e 509 char bufferTwo[14];///character array that stores the values of the lastDistance variable
MahletShimellis 1:37d0985c814e 510
MahletShimellis 1:37d0985c814e 511
MahletShimellis 1:37d0985c814e 512
MahletShimellis 1:37d0985c814e 513 float lengthN = sprintf(bufferOne,"Dn = %.2f cm",distance);
MahletShimellis 1:37d0985c814e 514 if (lengthN <= 14)
MahletShimellis 1:37d0985c814e 515 lcd.printString(bufferTwo,0,4);
MahletShimellis 1:37d0985c814e 516
MahletShimellis 1:37d0985c814e 517 float lengthL = sprintf(bufferTwo,"Dl = %.2f cm",lastDistance);
MahletShimellis 1:37d0985c814e 518 if (lengthL <= 14)
MahletShimellis 1:37d0985c814e 519 lcd.printString(bufferTwo,0,5);
MahletShimellis 1:37d0985c814e 520 }
MahletShimellis 1:37d0985c814e 521 lcd.refresh();
MahletShimellis 1:37d0985c814e 522
MahletShimellis 1:37d0985c814e 523
MahletShimellis 1:37d0985c814e 524 if (rangeFlag) {
MahletShimellis 1:37d0985c814e 525 lcd.clear();
MahletShimellis 1:37d0985c814e 526 rangeFlag=0; ///reset flag
MahletShimellis 1:37d0985c814e 527 char buffer[14];
MahletShimellis 1:37d0985c814e 528
MahletShimellis 1:37d0985c814e 529 // distance = srf.getDistanceCm(); // same idea with floats
MahletShimellis 1:37d0985c814e 530 float length = sprintf(buffer," %.2f cm",distance);
MahletShimellis 1:37d0985c814e 531 if (length <= 14) {
MahletShimellis 1:37d0985c814e 532 lcd.printString(buffer,11,2);
MahletShimellis 1:37d0985c814e 533 }
MahletShimellis 1:37d0985c814e 534
MahletShimellis 1:37d0985c814e 535 buzzerFrequency=fsm[currentState].bOutput; /// retrieves the buzzer frequency associated to the currentState from the FSM definition
MahletShimellis 1:37d0985c814e 536 buzzer.beep(buzzerFrequency,1);
MahletShimellis 1:37d0985c814e 537 float lengthB = sprintf(buffer," %.2f hz",buzzerFrequency);
MahletShimellis 1:37d0985c814e 538 if (lengthB <= 14) {
MahletShimellis 1:37d0985c814e 539 lcd.printString(buffer,11,4);
MahletShimellis 1:37d0985c814e 540 }
MahletShimellis 1:37d0985c814e 541 lcd.refresh();
MahletShimellis 1:37d0985c814e 542 }
MahletShimellis 1:37d0985c814e 543
MahletShimellis 1:37d0985c814e 544
MahletShimellis 1:37d0985c814e 545 if (beamFlag) {
MahletShimellis 1:37d0985c814e 546 lcd.clear();
MahletShimellis 1:37d0985c814e 547 beamFlag =0;
MahletShimellis 1:37d0985c814e 548
MahletShimellis 1:37d0985c814e 549 z++;
MahletShimellis 1:37d0985c814e 550 if (z>=5) z=0;
MahletShimellis 1:37d0985c814e 551 angleDegrees = angleArray[z];
MahletShimellis 1:37d0985c814e 552 angleRadians=convertDegrees(angleDegrees);
MahletShimellis 1:37d0985c814e 553 a=angleRadians;
MahletShimellis 1:37d0985c814e 554
MahletShimellis 1:37d0985c814e 555 drawSemiCircle();
MahletShimellis 1:37d0985c814e 556 d =srf.getDistanceCm();
MahletShimellis 1:37d0985c814e 557 //simply assigns the function results under conditions (a,d) to the distance variable values. calls the pointers defined previously
MahletShimellis 1:37d0985c814e 558 lateralDistance = 2*lat(a,d);
MahletShimellis 1:37d0985c814e 559 h = hyp(a,d);
MahletShimellis 1:37d0985c814e 560
MahletShimellis 1:37d0985c814e 561 drawBeamLines();
MahletShimellis 1:37d0985c814e 562
MahletShimellis 1:37d0985c814e 563 }
MahletShimellis 1:37d0985c814e 564 lcd.refresh();
MahletShimellis 1:37d0985c814e 565
MahletShimellis 1:37d0985c814e 566
MahletShimellis 1:37d0985c814e 567 if (wallFlag) {
MahletShimellis 1:37d0985c814e 568 lcd.clear();
MahletShimellis 1:37d0985c814e 569 wallFlag=0; ///reset flag
MahletShimellis 1:37d0985c814e 570 drawMaze(); ///draws the screen backgroung structure
MahletShimellis 1:37d0985c814e 571 move(); ///controls the movement and associated signals for the moving pixel point
MahletShimellis 1:37d0985c814e 572 }
MahletShimellis 1:37d0985c814e 573
MahletShimellis 1:37d0985c814e 574 }
MahletShimellis 1:37d0985c814e 575 }
MahletShimellis 1:37d0985c814e 576 }
MahletShimellis 1:37d0985c814e 577
MahletShimellis 1:37d0985c814e 578