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

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