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