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