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

Revision:
7:65bdd2d0d6ad
Parent:
6:d6afc4026a1d
Child:
8:fc978cfd5763
--- a/main.cpp	Thu Apr 09 11:32:48 2015 +0000
+++ b/main.cpp	Sat Apr 11 15:55:42 2015 +0000
@@ -1,110 +1,94 @@
-// Distance Sensor Project
-// Main File "main.cpp"
-// Designed By Sam Russell (200773195)
-// Date: 09/04/2015 || Version: 0.5
+/**
+* @file main.cpp
+* @brief Distance Sensor Project
+* @brief Main file containing all of the functions and the int main().
+* @brief Version: 0.6
+* @author Sam Russell
+* @date March 2015
+*/
 
 #include "main.h"
 
+int semihost_powerdown() {
+    uint32_t arg;
+    return __semihost(USR_POWERDOWN, &arg);
+    }
+
 void welcomeScreen()
 {
-    display.printString("--++--++--++--",0,0);     //Print string of "" at x,y locations.
+    display.printString("--++--++--++--",0,0);     ///Print string of "" at x,y locations.
     display.printString("Distance",18,1);
     display.printString("Sensor",22,2);
     display.printString("--++--++--++--",0,3);
     display.printString("Sam Russell",10,4);
     display.printString("--++--++--++--",0,5);
-    wait(2); //Delay between the introduction and the begining of the game.
-    display.clear(); //Clears the display.
+    wait(2); ///Delay between the introduction and the begining of the game.
+    display.clear(); ///Clears the display.
 }
 
 void barChart()
 {
-    if(distance<30) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        if(mode==0) {
-            buzzer.period(1/246.94);
-        }
-    } else if(distance<60) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1); //Draw 1 Bar
-        if(mode==0) {
-            buzzer.period(1/246.94);
+    int buzz=0;
+    display.drawRect(0,0,82,20,0); ///Draw initial bar graph border.
+    if (distance>240) {
+        display.drawRect(72,2,8,16,1); ///Draw 8 Bars
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/349.23);
+            buzz=1;
         }
-    } else if(distance<90) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1); //Draw 2 Bars
-        if(mode==0) {
-            buzzer.period(1/261.63);
+    }if(distance>210) {
+        display.drawRect(62,2,8,16,1); ///Draw 7 Bars
+        if(mode==0&&buzz==0) {
+            buzzer.period(1/329.63);
+            buzz=1;
         }
-    } else if(distance<120) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1); //Draw 3 Bars
-        if(mode==0) {
-            buzzer.period(1/261.63);
+    }if(distance>180) {
+        display.drawRect(52,2,8,16,1); ///Draw 6 Bars
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/329.63);
+            buzz=1;
         }
-    } else if(distance<150) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1);
-        display.drawRect(32,2,8,16,1); //Draw 4 Bars
-        if(mode==0) {
+    }  if(distance>150) {
+        display.drawRect(42,2,8,16,1); ///Draw 5 Bars
+        if(mode==0 && buzz==0) {
             buzzer.period(1/293.66);
+            buzz=1;
         }
-    } else if(distance<180) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1);
-        display.drawRect(32,2,8,16,1);
-        display.drawRect(42,2,8,16,1); //Draw 5 Bars
-        if(mode==0) {
+    } if(distance>120) {
+        display.drawRect(32,2,8,16,1); ///Draw 4 Bars
+        if(mode==0 && buzz==0) {
             buzzer.period(1/293.66);
+            buzz=1;
         }
-    } else if(distance<210) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1);
-        display.drawRect(32,2,8,16,1);
-        display.drawRect(42,2,8,16,1);
-        display.drawRect(52,2,8,16,1); //Draw 6 Bars
-        if(mode==0) {
-            buzzer.period(1/329.63);
+    }  if(distance>90) {
+        display.drawRect(22,2,8,16,1); ///Draw 3 Bars
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/261.63);
+            buzz=1;
         }
-    } else if(distance<240) {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1);
-        display.drawRect(32,2,8,16,1);
-        display.drawRect(42,2,8,16,1);
-        display.drawRect(52,2,8,16,1);
-        display.drawRect(62,2,8,16,1); //Draw 7 Bars
-        if(mode==0) {
-            buzzer.period(1/329.63);
+    }if(distance>60) {
+        display.drawRect(12,2,8,16,1); ///Draw 2 Bars
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/261.63);
+            buzz=1;
         }
-    } else {
-        display.drawRect(0,0,82,20,0); //Draw initial bar graph border.
-        display.drawRect(2,2,8,16,1);
-        display.drawRect(12,2,8,16,1);
-        display.drawRect(22,2,8,16,1);
-        display.drawRect(32,2,8,16,1);
-        display.drawRect(42,2,8,16,1);
-        display.drawRect(52,2,8,16,1);
-        display.drawRect(62,2,8,16,1);
-        display.drawRect(72,2,8,16,1); //Draw 8 Bars
-        if(mode==0) {
-            buzzer.period(1/349.23);
+    } if(distance>30) {
+        display.drawRect(2,2,8,16,1); ///Draw 1 Bar
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/246.94);
+            buzz=1;
         }
-    }
+    } 
+    if(distance<30) {
+        if(mode==0 && buzz==0) {
+            buzzer.period(1/246.94);
+            buzz=1;
+        }
+    } 
 }
 
 void error(int code)
-//ERROR CODE
+///ERROR CODE
 {
     while(1) {
         leds = 0;
@@ -116,40 +100,40 @@
 
 void setTime()
 {
-// print time for debugging
+/// print time for debugging
     pc.printf("set_time - %s",rxString);
-// atoi() converts a string to an integer
+/// atoi() converts a string to an integer
     int time = atoi(rxString);
-// update the time
+/// update the time
     set_time(time);
 }
 
 void serialISR()
 {
-// when a serial interrupt occurs, read rx string into buffer
+/// when a serial interrupt occurs, read rx string into buffer
     pc.gets(rxString,16);
-// set flag
+/// set flag
     setTimeFlag = 1;
 }
 
 void writeDataToFile(char* data, int dataDistance)
 {
-    logLED = 1; // turn on LEDs for feedback
-    pc.printf("Data Logged\n"); //DEBUG MESSAGE
-    FILE *fp = fopen("/local/log.csv", "a"); // open 'log.txt' for appending
-// if the file doesn't exist it is created, if it exists, data is appended to the end
-    fprintf(fp,"%s %d\n",data,dataDistance); // print string to file
-    fclose(fp); // close file
+    logLED = 1; /// turn on LEDs for feedback
+    pc.printf("Data Logged\n"); ///DEBUG MESSAGE
+    FILE *fp = fopen("/local/log.csv", "a"); /// open 'log.txt' for appending
+/// if the file doesn't exist it is created, if it exists, data is appended to the end
+    fprintf(fp,"%s %d\n",data,dataDistance); /// print string to file
+    fclose(fp); /// close file
 }
 
-//When timer expires set flag to equal 1.
+///When timer expires set flag to equal 1.
 void timerExpired()
 {
     timerflag = 1;
 }
 
 float avgDist()
-//After 10 readings calculate the average and define that as the total distance.
+///After 10 readings calculate the average and define that as the total distance.
 {
     float d1 = SRF02.getDistanceCm();
     float d2 = SRF02.getDistanceCm();
@@ -168,70 +152,72 @@
 void buttonPressed()
 {
     wait(0.2);
-    mode++; //count up mode when button is pressed.
+    mode++; ///count up mode when button is pressed.
 }
 
 int main()
 {
-    PHY_PowerDown(); //Powers down the ethernet.
-    pc.baud(9600); //setting the baud rate
-    timer.attach(&timerExpired,1);
-    display.init(); // Initialise the display.
-    display.clear(); // Clears the starting pattern from the screen.
-    welcomeScreen(); // Displays the welcome screen.
-    pc.attach(&serialISR); // attach serial ISR
-    char buffer[30]; // buffer used to store time string
-    set_time(0); // initialise time to 1st January 1970
+    PHY_PowerDown(); ///Powers down the ethernet.
+    semihost_powerdown();
+    pc.baud(9600); ///setting the baud rate
+    timer.attach(&timerExpired,1); ///every one second runs timer expired?
+    display.init(); /// Initialise the display.
+    display.clear(); /// Clears the starting pattern from the screen.
+    welcomeScreen(); /// Displays the welcome screen.
+    pc.attach(&serialISR); /// attach serial ISR
+    char buffer[30]; /// buffer used to store time string
+    set_time(0); /// initialise time to 1st January 1970
 
-    Button.rise(&buttonPressed); //change mode when button is pressed.
+    Button.rise(&buttonPressed); ///change mode when button is pressed.
 
     while(1) {
         if(timerflag) {
             timerflag = 0;
             ///Read sensor distance in cm and print to the serial port.
-            distance = avgDist(); //Set the distance variable to the averaged value from the sensor.
-            time_t seconds = time(NULL); // get current time
-            // format time into a string (time and date)
+            distance = avgDist(); ///Set the distance variable to the averaged value from the sensor.
+            time_t seconds = time(NULL); /// get current time
+            /// format time into a string (time and date)
             strftime(buffer, 30 , "%R %d/%m/%y", localtime(&seconds));
-            // print over serial
-            pc.printf("%s , %d cm\n",buffer,distance); //print the temperature value and the date/time to the serial.
-            display.clear(); //Clear the display, updating bar graph.
+            /// print over serial
+            pc.printf("%s , %d cm\n",buffer,distance); ///print the temperature value and the date/time to the serial.
+            display.clear(); ///Clear the display, updating bar graph.
             if(mode==0) {
-                display.printString("Normal Mode",8,5); //Print mode name to screen.
+                display.printString("Normal Mode",8,5); ///Print mode name to screen.
                 buzzer =0.5;
-                leds = 3; //mbed LED indication of mode.
+                leds = 3; ///mbed LED indication of mode.
             } else if(mode==1) {
-                display.printString("Quiet Mode",10,5); //Print mode name to screen.
+                display.printString("Quiet Mode",10,5); ///Print mode name to screen.
                 buzzer =0;
-                leds = 1; //mbed LED indication of mode.
+                leds = 1; ///mbed LED indication of mode.
             } else if(mode==2) {
-                display.printString("Power Saving",8,5); //Print mode name to screen.
+                display.printString("Power Saving",8,5); ///Print mode name to screen.
                 backlight = 0;
                 Sleep();
-                leds = 0; //mbed LED indication of mode.
+                leds = 0; ///mbed LED indication of mode.
             } else if(mode==3) {
-                //when mode becomes an integer value of 3, reset mode.
+                ///when mode becomes an integer value of 3, reset mode.
                 backlight =1;
                 mode=0;
             }
-            char buffer2[50]; // buffer2 is used to store the distance string.
-            sprintf (buffer2, "%d cm", distance); //Composes a printf compatable string and stores the distance in the buffer2.
-            display.printString(buffer2,25,3); //prints the string stored in buffer2
-            float L = Switch.read(); //check switch value
+            char buffer2[50]; /// buffer2 is used to store the distance string.
+            sprintf (buffer2, "%d cm", distance); ///Composes a printf compatable string and stores the distance in the buffer2.
+            display.printString(buffer2,25,3); ///prints the string stored in buffer2
+            float L = Switch.read(); ///check switch value
             if(L>0.9) {
-                //When switch is on, save the data to file and turn indicator on.
+                ///When switch is on, save the data to file and turn indicator on.
                 writeDataToFile(buffer,distance);
-                pc.printf("Logging Data\n"); //DEBUG MESSAGE
+                pc.printf("Logging Data\n"); ///DEBUG MESSAGE
             } else {
-                //When switch is off, don't save the data to file and turn indictor off.
+                ///When switch is off, don't save the data to file and turn indictor off.
                 logLED = 0;
                 pc.printf("Not Logging Data\n");
             }
-            barChart(); //draw bar chart indicator.
+            barChart(); ///draw bar chart indicator.
         }
-        if (setTimeFlag) { // if updated time has been sent
-            setTimeFlag = 0; // clear flag
-            setTime(); // update time
+        if (setTimeFlag) { /// if updated time has been sent
+            setTimeFlag = 0; /// clear flag
+            setTime(); /// update time
         }
+        sleep();
     }
 }