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:
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?

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