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@2:ebcfecb68cca, 2015-04-08 (annotated)
- Committer:
- el13sr
- Date:
- Wed Apr 08 20:10:26 2015 +0000
- Revision:
- 2:ebcfecb68cca
- Parent:
- 1:387d5e6fa05f
- Child:
- 3:4e8fb4fb54df
Print Distance & Print Chart
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 | 1:387d5e6fa05f | 4 | // Date: 07/04/2015 || Version: 0.1b |
el13sr | 0:7d01de89a1ff | 5 | |
el13sr | 1:387d5e6fa05f | 6 | #include "main.h" |
el13sr | 0:7d01de89a1ff | 7 | |
el13sr | 0:7d01de89a1ff | 8 | void error(int code) |
el13sr | 0:7d01de89a1ff | 9 | //ERROR CODE |
el13sr | 0:7d01de89a1ff | 10 | { |
el13sr | 0:7d01de89a1ff | 11 | while(1) { |
el13sr | 0:7d01de89a1ff | 12 | leds = 0; |
el13sr | 0:7d01de89a1ff | 13 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 14 | leds = code; |
el13sr | 0:7d01de89a1ff | 15 | wait(0.25); |
el13sr | 0:7d01de89a1ff | 16 | } |
el13sr | 0:7d01de89a1ff | 17 | } |
el13sr | 0:7d01de89a1ff | 18 | |
el13sr | 1:387d5e6fa05f | 19 | void setTime() |
el13sr | 1:387d5e6fa05f | 20 | { |
el13sr | 1:387d5e6fa05f | 21 | // print time for debugging |
el13sr | 1:387d5e6fa05f | 22 | pc.printf("set_time - %s",rxString); |
el13sr | 1:387d5e6fa05f | 23 | // atoi() converts a string to an integer |
el13sr | 1:387d5e6fa05f | 24 | int time = atoi(rxString); |
el13sr | 1:387d5e6fa05f | 25 | // update the time |
el13sr | 1:387d5e6fa05f | 26 | set_time(time); |
el13sr | 1:387d5e6fa05f | 27 | } |
el13sr | 1:387d5e6fa05f | 28 | |
el13sr | 1:387d5e6fa05f | 29 | void serialISR() |
el13sr | 1:387d5e6fa05f | 30 | { |
el13sr | 1:387d5e6fa05f | 31 | // when a serial interrupt occurs, read rx string into buffer |
el13sr | 1:387d5e6fa05f | 32 | pc.gets(rxString,16); |
el13sr | 1:387d5e6fa05f | 33 | // set flag |
el13sr | 1:387d5e6fa05f | 34 | setTimeFlag = 1; |
el13sr | 1:387d5e6fa05f | 35 | } |
el13sr | 1:387d5e6fa05f | 36 | |
el13sr | 1:387d5e6fa05f | 37 | void writeDataToFile(char* data, float dataDistance) |
el13sr | 1:387d5e6fa05f | 38 | { |
el13sr | 2:ebcfecb68cca | 39 | logLED = 1; // turn on LEDs for feedback |
el13sr | 2:ebcfecb68cca | 40 | pc.printf("Data Logged\n"); //DEBUG MESSAGE |
el13sr | 2:ebcfecb68cca | 41 | FILE *fp = fopen("/local/log.csv", "a"); // open 'log.txt' for appending |
el13sr | 1:387d5e6fa05f | 42 | // if the file doesn't exist it is created, if it exists, data is appended to the end |
el13sr | 2:ebcfecb68cca | 43 | fprintf(fp,"%s %.2f\n",data,dataDistance); // print string to file |
el13sr | 2:ebcfecb68cca | 44 | fclose(fp); // close file |
el13sr | 1:387d5e6fa05f | 45 | } |
el13sr | 1:387d5e6fa05f | 46 | |
el13sr | 1:387d5e6fa05f | 47 | //When timer expires set flag to equal 1. |
el13sr | 1:387d5e6fa05f | 48 | void timerExpired() |
el13sr | 1:387d5e6fa05f | 49 | { |
el13sr | 1:387d5e6fa05f | 50 | timerflag = 1; |
el13sr | 1:387d5e6fa05f | 51 | } |
el13sr | 1:387d5e6fa05f | 52 | |
el13sr | 0:7d01de89a1ff | 53 | float avgDist() |
el13sr | 0:7d01de89a1ff | 54 | //Read the distance from the sensor every 10ms. |
el13sr | 0:7d01de89a1ff | 55 | //After 10 readings calculate the average and define that as the total distance. |
el13sr | 0:7d01de89a1ff | 56 | { |
el13sr | 0:7d01de89a1ff | 57 | float d1 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 58 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 59 | float d2 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 60 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 61 | float d3 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 62 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 63 | float d4 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 64 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 65 | float d5 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 66 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 67 | float d6 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 68 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 69 | float d7 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 70 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 71 | float d8 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 72 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 73 | float d9 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 74 | wait(0.01); |
el13sr | 0:7d01de89a1ff | 75 | float d10 = SRF02.getDistanceCm(); |
el13sr | 0:7d01de89a1ff | 76 | float distance = (d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)/10; |
el13sr | 0:7d01de89a1ff | 77 | return distance; |
el13sr | 0:7d01de89a1ff | 78 | } |
el13sr | 0:7d01de89a1ff | 79 | |
el13sr | 1:387d5e6fa05f | 80 | int main() |
el13sr | 1:387d5e6fa05f | 81 | { |
el13sr | 1:387d5e6fa05f | 82 | pc.baud(9600); //setting the baud rate |
el13sr | 2:ebcfecb68cca | 83 | Buzzer.period(0.001); |
el13sr | 1:387d5e6fa05f | 84 | timer.attach(&timerExpired,1); |
el13sr | 1:387d5e6fa05f | 85 | display.init(); // Initialise the display. |
el13sr | 1:387d5e6fa05f | 86 | display.clear(); // Clears the starting pattern from the screen. |
el13sr | 1:387d5e6fa05f | 87 | display.printString("--++--++--++--",0,0); //Print string of "" at x,y locations. |
el13sr | 1:387d5e6fa05f | 88 | display.printString("Distance",18,1); |
el13sr | 1:387d5e6fa05f | 89 | display.printString("Sensor",22,2); |
el13sr | 1:387d5e6fa05f | 90 | display.printString("--++--++--++--",0,3); |
el13sr | 1:387d5e6fa05f | 91 | display.printString("Sam Russell",10,4); |
el13sr | 1:387d5e6fa05f | 92 | display.printString("--++--++--++--",0,5); |
el13sr | 1:387d5e6fa05f | 93 | wait(2); //Delay between the introduction and the begining of the game. |
el13sr | 1:387d5e6fa05f | 94 | display.clear(); //Clears the display. |
el13sr | 1:387d5e6fa05f | 95 | pc.attach(&serialISR); // attach serial ISR |
el13sr | 1:387d5e6fa05f | 96 | char buffer[30]; // buffer used to store time string |
el13sr | 1:387d5e6fa05f | 97 | set_time(0); // initialise time to 1st January 1970 |
el13sr | 2:ebcfecb68cca | 98 | |
el13sr | 1:387d5e6fa05f | 99 | while(1) { |
el13sr | 1:387d5e6fa05f | 100 | if(timerflag) { |
el13sr | 1:387d5e6fa05f | 101 | timerflag = 0; |
el13sr | 1:387d5e6fa05f | 102 | ///Read sensor distance in cm and print to the serial port. |
el13sr | 1:387d5e6fa05f | 103 | distance = avgDist(); //Set the distance variable to the averaged value from the sensor. |
el13sr | 1:387d5e6fa05f | 104 | time_t seconds = time(NULL); // get current time |
el13sr | 1:387d5e6fa05f | 105 | // format time into a string (time and date) |
el13sr | 1:387d5e6fa05f | 106 | strftime(buffer, 30 , "%R %d/%m/%y", localtime(&seconds)); |
el13sr | 1:387d5e6fa05f | 107 | // print over serial |
el13sr | 1:387d5e6fa05f | 108 | pc.printf("%s , %.2f cm\n",buffer,distance); //print the temperature value and the date/time to the serial. |
el13sr | 2:ebcfecb68cca | 109 | display.clear(); //Clear the display, updating bar graph. |
el13sr | 2:ebcfecb68cca | 110 | char buffer2[50]; // buffer2 is used to store the distance string. |
el13sr | 2:ebcfecb68cca | 111 | sprintf (buffer2, "%d cm", distance); //Composes a printf compatable string and stores the distance in the buffer2. |
el13sr | 2:ebcfecb68cca | 112 | display.printString(buffer2,25,3); //prints the string stored in buffer2 |
el13sr | 1:387d5e6fa05f | 113 | float L = Switch.read(); |
el13sr | 1:387d5e6fa05f | 114 | if(L>0.9) { |
el13sr | 1:387d5e6fa05f | 115 | //When switch is on, save the data to file and turn indicator on. |
el13sr | 1:387d5e6fa05f | 116 | writeDataToFile(buffer,distance); |
el13sr | 1:387d5e6fa05f | 117 | pc.printf("Logging Data\n"); //DEBUG MESSAGE |
el13sr | 2:ebcfecb68cca | 118 | } else { |
el13sr | 2:ebcfecb68cca | 119 | //When switch is off, don't save the data to file and turn indictor off. |
el13sr | 2:ebcfecb68cca | 120 | logLED = 0; |
el13sr | 2:ebcfecb68cca | 121 | pc.printf("Not Logging Data\n"); |
el13sr | 1:387d5e6fa05f | 122 | } |
el13sr | 2:ebcfecb68cca | 123 | if(distance<30) { |
el13sr | 2:ebcfecb68cca | 124 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 125 | } else if(distance<60) { |
el13sr | 2:ebcfecb68cca | 126 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 127 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 128 | } else if(distance<90) { |
el13sr | 2:ebcfecb68cca | 129 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 130 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 131 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 132 | } else if(distance<120) { |
el13sr | 2:ebcfecb68cca | 133 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 134 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 135 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 136 | display.drawRect(22,2,8,16,1); |
el13sr | 1:387d5e6fa05f | 137 | } else if(distance<150) { |
el13sr | 2:ebcfecb68cca | 138 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 139 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 140 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 141 | display.drawRect(22,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 142 | display.drawRect(32,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 143 | } else if(distance<180) { |
el13sr | 2:ebcfecb68cca | 144 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 145 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 146 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 147 | display.drawRect(22,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 148 | display.drawRect(32,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 149 | display.drawRect(42,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 150 | } else if(distance<210) { |
el13sr | 2:ebcfecb68cca | 151 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 152 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 153 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 154 | display.drawRect(22,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 155 | display.drawRect(32,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 156 | display.drawRect(42,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 157 | display.drawRect(52,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 158 | } else if(distance<240) { |
el13sr | 2:ebcfecb68cca | 159 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 160 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 161 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 162 | display.drawRect(22,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 163 | display.drawRect(32,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 164 | display.drawRect(42,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 165 | display.drawRect(52,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 166 | display.drawRect(62,2,8,16,1); |
el13sr | 1:387d5e6fa05f | 167 | } else { |
el13sr | 2:ebcfecb68cca | 168 | display.drawRect(0,0,82,20,0); //Draw initial bar graph border. |
el13sr | 2:ebcfecb68cca | 169 | display.drawRect(2,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 170 | display.drawRect(12,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 171 | display.drawRect(22,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 172 | display.drawRect(32,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 173 | display.drawRect(42,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 174 | display.drawRect(52,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 175 | display.drawRect(62,2,8,16,1); |
el13sr | 2:ebcfecb68cca | 176 | display.drawRect(72,2,8,16,1); |
el13sr | 1:387d5e6fa05f | 177 | } |
el13sr | 1:387d5e6fa05f | 178 | } |
el13sr | 1:387d5e6fa05f | 179 | if (setTimeFlag) { // if updated time has been sent |
el13sr | 2:ebcfecb68cca | 180 | setTimeFlag = 0; // clear flag |
el13sr | 2:ebcfecb68cca | 181 | setTime(); // update time |
el13sr | 1:387d5e6fa05f | 182 | } |
el13sr | 1:387d5e6fa05f | 183 | } |
el13sr | 1:387d5e6fa05f | 184 | } |