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

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?

UserRevisionLine numberNew 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 }