![](/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@9:4a319e9db41c, 2015-04-23 (annotated)
- Committer:
- el13sr
- Date:
- Thu Apr 23 10:36:07 2015 +0000
- Revision:
- 9:4a319e9db41c
- Parent:
- 8:fc978cfd5763
- Child:
- 10:b61013738793
Added missing documentation for 'void barchar()'; Fixed a wording error in documentation
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 | 8:fc978cfd5763 | 19 | display.init(); /// Initialise the display. |
el13sr | 8:fc978cfd5763 | 20 | display.clear(); /// Clears the starting pattern from the screen. |
el13sr | 7:65bdd2d0d6ad | 21 | display.printString("--++--++--++--",0,0); ///Print string of "" at x,y locations. |
el13sr | 4:0bd5c189f2f3 | 22 | display.printString("Distance",18,1); |
el13sr | 4:0bd5c189f2f3 | 23 | display.printString("Sensor",22,2); |
el13sr | 4:0bd5c189f2f3 | 24 | display.printString("--++--++--++--",0,3); |
el13sr | 4:0bd5c189f2f3 | 25 | display.printString("Sam Russell",10,4); |
el13sr | 4:0bd5c189f2f3 | 26 | display.printString("--++--++--++--",0,5); |
el13sr | 7:65bdd2d0d6ad | 27 | wait(2); ///Delay between the introduction and the begining of the game. |
el13sr | 7:65bdd2d0d6ad | 28 | display.clear(); ///Clears the display. |
el13sr | 4:0bd5c189f2f3 | 29 | } |
el13sr | 4:0bd5c189f2f3 | 30 | |
el13sr | 4:0bd5c189f2f3 | 31 | void barChart() |
el13sr | 4:0bd5c189f2f3 | 32 | { |
el13sr | 7:65bdd2d0d6ad | 33 | int buzz=0; |
el13sr | 7:65bdd2d0d6ad | 34 | display.drawRect(0,0,82,20,0); ///Draw initial bar graph border. |
el13sr | 7:65bdd2d0d6ad | 35 | if (distance>240) { |
el13sr | 7:65bdd2d0d6ad | 36 | display.drawRect(72,2,8,16,1); ///Draw 8 Bars |
el13sr | 9:4a319e9db41c | 37 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 38 | buzzer.period(1/349.23); ///Plays note 'Fa' |
el13sr | 9:4a319e9db41c | 39 | buzz=1; ///sets buzz to one, to prevent multiple notes playing. |
el13sr | 6:d6afc4026a1d | 40 | } |
el13sr | 7:65bdd2d0d6ad | 41 | }if(distance>210) { |
el13sr | 7:65bdd2d0d6ad | 42 | display.drawRect(62,2,8,16,1); ///Draw 7 Bars |
el13sr | 7:65bdd2d0d6ad | 43 | if(mode==0&&buzz==0) { |
el13sr | 9:4a319e9db41c | 44 | buzzer.period(1/329.63); ///Plays note 'Mi' |
el13sr | 9:4a319e9db41c | 45 | buzz=1; ///sets buzz to one, to prevent multiple notes playing. |
el13sr | 6:d6afc4026a1d | 46 | } |
el13sr | 7:65bdd2d0d6ad | 47 | }if(distance>180) { |
el13sr | 7:65bdd2d0d6ad | 48 | display.drawRect(52,2,8,16,1); ///Draw 6 Bars |
el13sr | 9:4a319e9db41c | 49 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 50 | buzzer.period(1/329.63); ///Plays note 'Mi' |
el13sr | 9:4a319e9db41c | 51 | buzz=1; ///sets buzz to one, to prevent multiple notes playing. |
el13sr | 6:d6afc4026a1d | 52 | } |
el13sr | 7:65bdd2d0d6ad | 53 | } if(distance>150) { |
el13sr | 7:65bdd2d0d6ad | 54 | display.drawRect(42,2,8,16,1); ///Draw 5 Bars |
el13sr | 9:4a319e9db41c | 55 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 56 | buzzer.period(1/293.66); ///Plays note 'Re' |
el13sr | 7:65bdd2d0d6ad | 57 | buzz=1; |
el13sr | 6:d6afc4026a1d | 58 | } |
el13sr | 7:65bdd2d0d6ad | 59 | } if(distance>120) { |
el13sr | 7:65bdd2d0d6ad | 60 | display.drawRect(32,2,8,16,1); ///Draw 4 Bars |
el13sr | 9:4a319e9db41c | 61 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 62 | buzzer.period(1/293.66); ///Plays note 'Re' |
el13sr | 7:65bdd2d0d6ad | 63 | buzz=1; |
el13sr | 6:d6afc4026a1d | 64 | } |
el13sr | 7:65bdd2d0d6ad | 65 | } if(distance>90) { |
el13sr | 7:65bdd2d0d6ad | 66 | display.drawRect(22,2,8,16,1); ///Draw 3 Bars |
el13sr | 9:4a319e9db41c | 67 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 68 | buzzer.period(1/261.63); ///Plays note 'Do' |
el13sr | 7:65bdd2d0d6ad | 69 | buzz=1; |
el13sr | 6:d6afc4026a1d | 70 | } |
el13sr | 7:65bdd2d0d6ad | 71 | }if(distance>60) { |
el13sr | 7:65bdd2d0d6ad | 72 | display.drawRect(12,2,8,16,1); ///Draw 2 Bars |
el13sr | 9:4a319e9db41c | 73 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 74 | buzzer.period(1/261.63); ///Plays note 'Do' |
el13sr | 7:65bdd2d0d6ad | 75 | buzz=1; |
el13sr | 6:d6afc4026a1d | 76 | } |
el13sr | 7:65bdd2d0d6ad | 77 | } if(distance>30) { |
el13sr | 7:65bdd2d0d6ad | 78 | display.drawRect(2,2,8,16,1); ///Draw 1 Bar |
el13sr | 9:4a319e9db41c | 79 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 80 | buzzer.period(1/246.94); ///Plays note 'Si' |
el13sr | 7:65bdd2d0d6ad | 81 | buzz=1; |
el13sr | 6:d6afc4026a1d | 82 | } |
el13sr | 7:65bdd2d0d6ad | 83 | } |
el13sr | 7:65bdd2d0d6ad | 84 | if(distance<30) { |
el13sr | 9:4a319e9db41c | 85 | if(mode==0 && buzz==0) { ///when mode is normal buzz is zero, play a note. |
el13sr | 9:4a319e9db41c | 86 | buzzer.period(1/246.94); ///Plays note 'Si' |
el13sr | 7:65bdd2d0d6ad | 87 | buzz=1; |
el13sr | 7:65bdd2d0d6ad | 88 | } |
el13sr | 7:65bdd2d0d6ad | 89 | } |
el13sr | 4:0bd5c189f2f3 | 90 | } |
el13sr | 4:0bd5c189f2f3 | 91 | |
el13sr | 0:7d01de89a1ff | 92 | void error(int code) |
el13sr | 7:65bdd2d0d6ad | 93 | ///ERROR CODE |
el13sr | 0:7d01de89a1ff | 94 | { |
el13sr | 0:7d01de89a1ff | 95 | while(1) { |
el13sr | 0:7d01de89a1ff | 96 | leds = 0; |
el13sr | 0:7d01de89a1ff | 97 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 98 | leds = code; |
el13sr | 0:7d01de89a1ff | 99 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 100 | } |
el13sr | 0:7d01de89a1ff | 101 | } |
el13sr | 0:7d01de89a1ff | 102 | |
el13sr | 1:387d5e6fa05f | 103 | void setTime() |
el13sr | 1:387d5e6fa05f | 104 | { |
el13sr | 7:65bdd2d0d6ad | 105 | /// print time for debugging |
el13sr | 1:387d5e6fa05f | 106 | pc.printf("set_time - %s",rxString); |
el13sr | 7:65bdd2d0d6ad | 107 | /// atoi() converts a string to an integer |
el13sr | 1:387d5e6fa05f | 108 | int time = atoi(rxString); |
el13sr | 7:65bdd2d0d6ad | 109 | /// update the time |
el13sr | 1:387d5e6fa05f | 110 | set_time(time); |
el13sr | 1:387d5e6fa05f | 111 | } |
el13sr | 1:387d5e6fa05f | 112 | |
el13sr | 1:387d5e6fa05f | 113 | void serialISR() |
el13sr | 1:387d5e6fa05f | 114 | { |
el13sr | 7:65bdd2d0d6ad | 115 | /// when a serial interrupt occurs, read rx string into buffer |
el13sr | 1:387d5e6fa05f | 116 | pc.gets(rxString,16); |
el13sr | 7:65bdd2d0d6ad | 117 | /// set flag |
el13sr | 1:387d5e6fa05f | 118 | setTimeFlag = 1; |
el13sr | 1:387d5e6fa05f | 119 | } |
el13sr | 1:387d5e6fa05f | 120 | |
el13sr | 3:4e8fb4fb54df | 121 | void writeDataToFile(char* data, int dataDistance) |
el13sr | 1:387d5e6fa05f | 122 | { |
el13sr | 7:65bdd2d0d6ad | 123 | logLED = 1; /// turn on LEDs for feedback |
el13sr | 7:65bdd2d0d6ad | 124 | pc.printf("Data Logged\n"); ///DEBUG MESSAGE |
el13sr | 7:65bdd2d0d6ad | 125 | FILE *fp = fopen("/local/log.csv", "a"); /// open 'log.txt' for appending |
el13sr | 7:65bdd2d0d6ad | 126 | /// if the file doesn't exist it is created, if it exists, data is appended to the end |
el13sr | 7:65bdd2d0d6ad | 127 | fprintf(fp,"%s %d\n",data,dataDistance); /// print string to file |
el13sr | 7:65bdd2d0d6ad | 128 | fclose(fp); /// close file |
el13sr | 1:387d5e6fa05f | 129 | } |
el13sr | 1:387d5e6fa05f | 130 | |
el13sr | 7:65bdd2d0d6ad | 131 | ///When timer expires set flag to equal 1. |
el13sr | 1:387d5e6fa05f | 132 | void timerExpired() |
el13sr | 1:387d5e6fa05f | 133 | { |
el13sr | 1:387d5e6fa05f | 134 | timerflag = 1; |
el13sr | 1:387d5e6fa05f | 135 | } |
el13sr | 1:387d5e6fa05f | 136 | |
el13sr | 0:7d01de89a1ff | 137 | float avgDist() |
el13sr | 7:65bdd2d0d6ad | 138 | ///After 10 readings calculate the average and define that as the total distance. |
el13sr | 0:7d01de89a1ff | 139 | { |
el13sr | 0:7d01de89a1ff | 140 | float d1 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 141 | float d2 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 142 | float d3 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 143 | float d4 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 144 | float d5 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 145 | float d6 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 146 | float d7 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 147 | float d8 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 148 | float d9 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 149 | float d10 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 150 | float distance = (d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)/10; |
el13sr | 0:7d01de89a1ff | 151 | return distance; |
el13sr | 0:7d01de89a1ff | 152 | } |
el13sr | 0:7d01de89a1ff | 153 | |
el13sr | 4:0bd5c189f2f3 | 154 | void buttonPressed() |
el13sr | 4:0bd5c189f2f3 | 155 | { |
el13sr | 5:c57cd4c57c40 | 156 | wait(0.2); |
el13sr | 7:65bdd2d0d6ad | 157 | mode++; ///count up mode when button is pressed. |
el13sr | 4:0bd5c189f2f3 | 158 | } |
el13sr | 4:0bd5c189f2f3 | 159 | |
el13sr | 1:387d5e6fa05f | 160 | int main() |
el13sr | 1:387d5e6fa05f | 161 | { |
el13sr | 7:65bdd2d0d6ad | 162 | PHY_PowerDown(); ///Powers down the ethernet. |
el13sr | 7:65bdd2d0d6ad | 163 | semihost_powerdown(); |
el13sr | 7:65bdd2d0d6ad | 164 | pc.baud(9600); ///setting the baud rate |
el13sr | 9:4a319e9db41c | 165 | timer.attach(&timerExpired,1); ///every one second runs timer expired |
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 | } |