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:
Wed Apr 08 20:21:54 2015 +0000
Revision:
3:4e8fb4fb54df
Parent:
2:ebcfecb68cca
Child:
4:0bd5c189f2f3
Logging and Serial Floating Points Fixed

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 3:4e8fb4fb54df 4 // Date: 07/04/2015 || Version: 0.3a
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 3:4e8fb4fb54df 37 void writeDataToFile(char* data, int 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 3:4e8fb4fb54df 43 fprintf(fp,"%s %d\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 3:4e8fb4fb54df 108 pc.printf("%s , %d 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 }