![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
A program designed to get the distance from an SRF02 distance sensor and create an audible and visual indication of that distance with data logging capabilities.
Dependencies: N5110 PowerControl SRF02 mbed
main.cpp@6:d6afc4026a1d, 2015-04-09 (annotated)
- Committer:
- el13sr
- Date:
- Thu Apr 09 11:32:48 2015 +0000
- Revision:
- 6:d6afc4026a1d
- Parent:
- 5:c57cd4c57c40
- Child:
- 7:65bdd2d0d6ad
v0.5 - Added working modes and powered down ethernet.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el13sr | 0:7d01de89a1ff | 1 | // Distance Sensor Project |
el13sr | 0:7d01de89a1ff | 2 | // Main File "main.cpp" |
el13sr | 0:7d01de89a1ff | 3 | // Designed By Sam Russell (200773195) |
el13sr | 6:d6afc4026a1d | 4 | // Date: 09/04/2015 || Version: 0.5 |
el13sr | 0:7d01de89a1ff | 5 | |
el13sr | 1:387d5e6fa05f | 6 | #include "main.h" |
el13sr | 0:7d01de89a1ff | 7 | |
el13sr | 4:0bd5c189f2f3 | 8 | void welcomeScreen() |
el13sr | 4:0bd5c189f2f3 | 9 | { |
el13sr | 4:0bd5c189f2f3 | 10 | display.printString("--++--++--++--",0,0); //Print string of "" at x,y locations. |
el13sr | 4:0bd5c189f2f3 | 11 | display.printString("Distance",18,1); |
el13sr | 4:0bd5c189f2f3 | 12 | display.printString("Sensor",22,2); |
el13sr | 4:0bd5c189f2f3 | 13 | display.printString("--++--++--++--",0,3); |
el13sr | 4:0bd5c189f2f3 | 14 | display.printString("Sam Russell",10,4); |
el13sr | 4:0bd5c189f2f3 | 15 | display.printString("--++--++--++--",0,5); |
el13sr | 4:0bd5c189f2f3 | 16 | wait(2); //Delay between the introduction and the begining of the game. |
el13sr | 4:0bd5c189f2f3 | 17 | display.clear(); //Clears the display. |
el13sr | 4:0bd5c189f2f3 | 18 | } |
el13sr | 4:0bd5c189f2f3 | 19 | |
el13sr | 4:0bd5c189f2f3 | 20 | void barChart() |
el13sr | 4:0bd5c189f2f3 | 21 | { |
el13sr | 4:0bd5c189f2f3 | 22 | if(distance<30) { |
el13sr | 4:0bd5c189f2f3 | 23 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 6:d6afc4026a1d | 24 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 25 | buzzer.period(1/246.94); |
el13sr | 6:d6afc4026a1d | 26 | } |
el13sr | 4:0bd5c189f2f3 | 27 | } else if(distance<60) { |
el13sr | 4:0bd5c189f2f3 | 28 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 29 | display.drawRect(2,2,8,16,1); //Draw 1 Bar |
el13sr | 6:d6afc4026a1d | 30 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 31 | buzzer.period(1/246.94); |
el13sr | 6:d6afc4026a1d | 32 | } |
el13sr | 4:0bd5c189f2f3 | 33 | } else if(distance<90) { |
el13sr | 4:0bd5c189f2f3 | 34 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 35 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 36 | display.drawRect(12,2,8,16,1); //Draw 2 Bars |
el13sr | 6:d6afc4026a1d | 37 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 38 | buzzer.period(1/261.63); |
el13sr | 6:d6afc4026a1d | 39 | } |
el13sr | 4:0bd5c189f2f3 | 40 | } else if(distance<120) { |
el13sr | 4:0bd5c189f2f3 | 41 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 42 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 43 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 44 | display.drawRect(22,2,8,16,1); //Draw 3 Bars |
el13sr | 6:d6afc4026a1d | 45 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 46 | buzzer.period(1/261.63); |
el13sr | 6:d6afc4026a1d | 47 | } |
el13sr | 4:0bd5c189f2f3 | 48 | } else if(distance<150) { |
el13sr | 4:0bd5c189f2f3 | 49 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 50 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 51 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 52 | display.drawRect(22,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 53 | display.drawRect(32,2,8,16,1); //Draw 4 Bars |
el13sr | 6:d6afc4026a1d | 54 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 55 | buzzer.period(1/293.66); |
el13sr | 6:d6afc4026a1d | 56 | } |
el13sr | 4:0bd5c189f2f3 | 57 | } else if(distance<180) { |
el13sr | 4:0bd5c189f2f3 | 58 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 59 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 60 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 61 | display.drawRect(22,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 62 | display.drawRect(32,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 63 | display.drawRect(42,2,8,16,1); //Draw 5 Bars |
el13sr | 6:d6afc4026a1d | 64 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 65 | buzzer.period(1/293.66); |
el13sr | 6:d6afc4026a1d | 66 | } |
el13sr | 4:0bd5c189f2f3 | 67 | } else if(distance<210) { |
el13sr | 4:0bd5c189f2f3 | 68 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 69 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 70 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 71 | display.drawRect(22,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 72 | display.drawRect(32,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 73 | display.drawRect(42,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 74 | display.drawRect(52,2,8,16,1); //Draw 6 Bars |
el13sr | 6:d6afc4026a1d | 75 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 76 | buzzer.period(1/329.63); |
el13sr | 6:d6afc4026a1d | 77 | } |
el13sr | 4:0bd5c189f2f3 | 78 | } else if(distance<240) { |
el13sr | 4:0bd5c189f2f3 | 79 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 80 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 81 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 82 | display.drawRect(22,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 83 | display.drawRect(32,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 84 | display.drawRect(42,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 85 | display.drawRect(52,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 86 | display.drawRect(62,2,8,16,1); //Draw 7 Bars |
el13sr | 6:d6afc4026a1d | 87 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 88 | buzzer.period(1/329.63); |
el13sr | 6:d6afc4026a1d | 89 | } |
el13sr | 4:0bd5c189f2f3 | 90 | } else { |
el13sr | 4:0bd5c189f2f3 | 91 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 4:0bd5c189f2f3 | 92 | display.drawRect(2,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 93 | display.drawRect(12,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 94 | display.drawRect(22,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 95 | display.drawRect(32,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 96 | display.drawRect(42,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 97 | display.drawRect(52,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 98 | display.drawRect(62,2,8,16,1); |
el13sr | 4:0bd5c189f2f3 | 99 | display.drawRect(72,2,8,16,1); //Draw 8 Bars |
el13sr | 6:d6afc4026a1d | 100 | if(mode==0) { |
el13sr | 6:d6afc4026a1d | 101 | buzzer.period(1/349.23); |
el13sr | 6:d6afc4026a1d | 102 | } |
el13sr | 4:0bd5c189f2f3 | 103 | } |
el13sr | 4:0bd5c189f2f3 | 104 | } |
el13sr | 4:0bd5c189f2f3 | 105 | |
el13sr | 0:7d01de89a1ff | 106 | void error(int code) |
el13sr | 0:7d01de89a1ff | 107 | //ERROR CODE |
el13sr | 0:7d01de89a1ff | 108 | { |
el13sr | 0:7d01de89a1ff | 109 | while(1) { |
el13sr | 0:7d01de89a1ff | 110 | leds = 0; |
el13sr | 0:7d01de89a1ff | 111 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 112 | leds = code; |
el13sr | 0:7d01de89a1ff | 113 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 114 | } |
el13sr | 0:7d01de89a1ff | 115 | } |
el13sr | 0:7d01de89a1ff | 116 | |
el13sr | 1:387d5e6fa05f | 117 | void setTime() |
el13sr | 1:387d5e6fa05f | 118 | { |
el13sr | 1:387d5e6fa05f | 119 | // print time for debugging |
el13sr | 1:387d5e6fa05f | 120 | pc.printf("set_time - %s",rxString); |
el13sr | 1:387d5e6fa05f | 121 | // atoi() converts a string to an integer |
el13sr | 1:387d5e6fa05f | 122 | int time = atoi(rxString); |
el13sr | 1:387d5e6fa05f | 123 | // update the time |
el13sr | 1:387d5e6fa05f | 124 | set_time(time); |
el13sr | 1:387d5e6fa05f | 125 | } |
el13sr | 1:387d5e6fa05f | 126 | |
el13sr | 1:387d5e6fa05f | 127 | void serialISR() |
el13sr | 1:387d5e6fa05f | 128 | { |
el13sr | 1:387d5e6fa05f | 129 | // when a serial interrupt occurs, read rx string into buffer |
el13sr | 1:387d5e6fa05f | 130 | pc.gets(rxString,16); |
el13sr | 1:387d5e6fa05f | 131 | // set flag |
el13sr | 1:387d5e6fa05f | 132 | setTimeFlag = 1; |
el13sr | 1:387d5e6fa05f | 133 | } |
el13sr | 1:387d5e6fa05f | 134 | |
el13sr | 3:4e8fb4fb54df | 135 | void writeDataToFile(char* data, int dataDistance) |
el13sr | 1:387d5e6fa05f | 136 | { |
el13sr | 2:ebcfecb68cca | 137 | logLED = 1; // turn on LEDs for feedback |
el13sr | 2:ebcfecb68cca | 138 | pc.printf("Data Logged\n"); //DEBUG MESSAGE |
el13sr | 2:ebcfecb68cca | 139 | FILE *fp = fopen("/local/log.csv", "a"); // open 'log.txt' for appending |
el13sr | 1:387d5e6fa05f | 140 | // if the file doesn't exist it is created, if it exists, data is appended to the end |
el13sr | 3:4e8fb4fb54df | 141 | fprintf(fp,"%s %d\n",data,dataDistance); // print string to file |
el13sr | 2:ebcfecb68cca | 142 | fclose(fp); // close file |
el13sr | 1:387d5e6fa05f | 143 | } |
el13sr | 1:387d5e6fa05f | 144 | |
el13sr | 1:387d5e6fa05f | 145 | //When timer expires set flag to equal 1. |
el13sr | 1:387d5e6fa05f | 146 | void timerExpired() |
el13sr | 1:387d5e6fa05f | 147 | { |
el13sr | 1:387d5e6fa05f | 148 | timerflag = 1; |
el13sr | 1:387d5e6fa05f | 149 | } |
el13sr | 1:387d5e6fa05f | 150 | |
el13sr | 0:7d01de89a1ff | 151 | float avgDist() |
el13sr | 0:7d01de89a1ff | 152 | //After 10 readings calculate the average and define that as the total distance. |
el13sr | 0:7d01de89a1ff | 153 | { |
el13sr | 0:7d01de89a1ff | 154 | float d1 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 155 | float d2 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 156 | float d3 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 157 | float d4 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 158 | float d5 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 159 | float d6 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 160 | float d7 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 161 | float d8 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 162 | float d9 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 163 | float d10 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 164 | float distance = (d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)/10; |
el13sr | 0:7d01de89a1ff | 165 | return distance; |
el13sr | 0:7d01de89a1ff | 166 | } |
el13sr | 0:7d01de89a1ff | 167 | |
el13sr | 4:0bd5c189f2f3 | 168 | void buttonPressed() |
el13sr | 4:0bd5c189f2f3 | 169 | { |
el13sr | 5:c57cd4c57c40 | 170 | wait(0.2); |
el13sr | 4:0bd5c189f2f3 | 171 | mode++; //count up mode when button is pressed. |
el13sr | 4:0bd5c189f2f3 | 172 | } |
el13sr | 4:0bd5c189f2f3 | 173 | |
el13sr | 1:387d5e6fa05f | 174 | int main() |
el13sr | 1:387d5e6fa05f | 175 | { |
el13sr | 6:d6afc4026a1d | 176 | PHY_PowerDown(); //Powers down the ethernet. |
el13sr | 1:387d5e6fa05f | 177 | pc.baud(9600); //setting the baud rate |
el13sr | 1:387d5e6fa05f | 178 | timer.attach(&timerExpired,1); |
el13sr | 1:387d5e6fa05f | 179 | display.init(); // Initialise the display. |
el13sr | 1:387d5e6fa05f | 180 | display.clear(); // Clears the starting pattern from the screen. |
el13sr | 5:c57cd4c57c40 | 181 | welcomeScreen(); // Displays the welcome screen. |
el13sr | 1:387d5e6fa05f | 182 | pc.attach(&serialISR); // attach serial ISR |
el13sr | 1:387d5e6fa05f | 183 | char buffer[30]; // buffer used to store time string |
el13sr | 1:387d5e6fa05f | 184 | set_time(0); // initialise time to 1st January 1970 |
el13sr | 2:ebcfecb68cca | 185 | |
el13sr | 4:0bd5c189f2f3 | 186 | Button.rise(&buttonPressed); //change mode when button is pressed. |
el13sr | 4:0bd5c189f2f3 | 187 | |
el13sr | 1:387d5e6fa05f | 188 | while(1) { |
el13sr | 1:387d5e6fa05f | 189 | if(timerflag) { |
el13sr | 1:387d5e6fa05f | 190 | timerflag = 0; |
el13sr | 1:387d5e6fa05f | 191 | ///Read sensor distance in cm and print to the serial port. |
el13sr | 1:387d5e6fa05f | 192 | distance = avgDist(); //Set the distance variable to the averaged value from the sensor. |
el13sr | 1:387d5e6fa05f | 193 | time_t seconds = time(NULL); // get current time |
el13sr | 1:387d5e6fa05f | 194 | // format time into a string (time and date) |
el13sr | 1:387d5e6fa05f | 195 | strftime(buffer, 30 , "%R %d/%m/%y", localtime(&seconds)); |
el13sr | 1:387d5e6fa05f | 196 | // print over serial |
el13sr | 3:4e8fb4fb54df | 197 | pc.printf("%s , %d cm\n",buffer,distance); //print the temperature value and the date/time to the serial. |
el13sr | 2:ebcfecb68cca | 198 | display.clear(); //Clear the display, updating bar graph. |
el13sr | 4:0bd5c189f2f3 | 199 | if(mode==0) { |
el13sr | 4:0bd5c189f2f3 | 200 | display.printString("Normal Mode",8,5); //Print mode name to screen. |
el13sr | 6:d6afc4026a1d | 201 | buzzer =0.5; |
el13sr | 4:0bd5c189f2f3 | 202 | leds = 3; //mbed LED indication of mode. |
el13sr | 4:0bd5c189f2f3 | 203 | } else if(mode==1) { |
el13sr | 4:0bd5c189f2f3 | 204 | display.printString("Quiet Mode",10,5); //Print mode name to screen. |
el13sr | 6:d6afc4026a1d | 205 | buzzer =0; |
el13sr | 4:0bd5c189f2f3 | 206 | leds = 1; //mbed LED indication of mode. |
el13sr | 4:0bd5c189f2f3 | 207 | } else if(mode==2) { |
el13sr | 4:0bd5c189f2f3 | 208 | display.printString("Power Saving",8,5); //Print mode name to screen. |
el13sr | 6:d6afc4026a1d | 209 | backlight = 0; |
el13sr | 6:d6afc4026a1d | 210 | Sleep(); |
el13sr | 4:0bd5c189f2f3 | 211 | leds = 0; //mbed LED indication of mode. |
el13sr | 5:c57cd4c57c40 | 212 | } else if(mode==3) { |
el13sr | 5:c57cd4c57c40 | 213 | //when mode becomes an integer value of 3, reset mode. |
el13sr | 6:d6afc4026a1d | 214 | backlight =1; |
el13sr | 5:c57cd4c57c40 | 215 | mode=0; |
el13sr | 4:0bd5c189f2f3 | 216 | } |
el13sr | 2:ebcfecb68cca | 217 | char buffer2[50]; // buffer2 is used to store the distance string. |
el13sr | 2:ebcfecb68cca | 218 | sprintf (buffer2, "%d cm", distance); //Composes a printf compatable string and stores the distance in the buffer2. |
el13sr | 2:ebcfecb68cca | 219 | display.printString(buffer2,25,3); //prints the string stored in buffer2 |
el13sr | 4:0bd5c189f2f3 | 220 | float L = Switch.read(); //check switch value |
el13sr | 1:387d5e6fa05f | 221 | if(L>0.9) { |
el13sr | 1:387d5e6fa05f | 222 | //When switch is on, save the data to file and turn indicator on. |
el13sr | 1:387d5e6fa05f | 223 | writeDataToFile(buffer,distance); |
el13sr | 1:387d5e6fa05f | 224 | pc.printf("Logging Data\n"); //DEBUG MESSAGE |
el13sr | 2:ebcfecb68cca | 225 | } else { |
el13sr | 2:ebcfecb68cca | 226 | //When switch is off, don't save the data to file and turn indictor off. |
el13sr | 2:ebcfecb68cca | 227 | logLED = 0; |
el13sr | 2:ebcfecb68cca | 228 | pc.printf("Not Logging Data\n"); |
el13sr | 1:387d5e6fa05f | 229 | } |
el13sr | 4:0bd5c189f2f3 | 230 | barChart(); //draw bar chart indicator. |
el13sr | 1:387d5e6fa05f | 231 | } |
el13sr | 1:387d5e6fa05f | 232 | if (setTimeFlag) { // if updated time has been sent |
el13sr | 2:ebcfecb68cca | 233 | setTimeFlag = 0; // clear flag |
el13sr | 2:ebcfecb68cca | 234 | setTime(); // update time |
el13sr | 1:387d5e6fa05f | 235 | } |
el13sr | 1:387d5e6fa05f | 236 | } |
el13sr | 1:387d5e6fa05f | 237 | } |