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 18 16:14:58 2015 +0000
Revision:
8:fc978cfd5763
Parent:
7:65bdd2d0d6ad
Child:
9:4a319e9db41c
Moved display initialization into the welcome screen function.

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 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 7:65bdd2d0d6ad 37 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 38 buzzer.period(1/349.23);
el13sr 7:65bdd2d0d6ad 39 buzz=1;
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 7:65bdd2d0d6ad 44 buzzer.period(1/329.63);
el13sr 7:65bdd2d0d6ad 45 buzz=1;
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 7:65bdd2d0d6ad 49 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 50 buzzer.period(1/329.63);
el13sr 7:65bdd2d0d6ad 51 buzz=1;
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 7:65bdd2d0d6ad 55 if(mode==0 && buzz==0) {
el13sr 6:d6afc4026a1d 56 buzzer.period(1/293.66);
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 7:65bdd2d0d6ad 61 if(mode==0 && buzz==0) {
el13sr 6:d6afc4026a1d 62 buzzer.period(1/293.66);
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 7:65bdd2d0d6ad 67 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 68 buzzer.period(1/261.63);
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 7:65bdd2d0d6ad 73 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 74 buzzer.period(1/261.63);
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 7:65bdd2d0d6ad 79 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 80 buzzer.period(1/246.94);
el13sr 7:65bdd2d0d6ad 81 buzz=1;
el13sr 6:d6afc4026a1d 82 }
el13sr 7:65bdd2d0d6ad 83 }
el13sr 7:65bdd2d0d6ad 84 if(distance<30) {
el13sr 7:65bdd2d0d6ad 85 if(mode==0 && buzz==0) {
el13sr 7:65bdd2d0d6ad 86 buzzer.period(1/246.94);
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 7:65bdd2d0d6ad 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 }