This program allows user to measure distance with SRF02 distance sensor and display the result on a Nokia LCD Display

Dependencies:   N5110 PowerControl SRF02 mbed

Revision:
0:b6b1dc0389cb
Child:
1:c720fcb68396
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Apr 09 10:22:49 2015 +0000
@@ -0,0 +1,246 @@
+#include "mbed.h"
+#include "PowerControl/PowerControl.h"
+#include "PowerControl/EthernetPowerControl.h"
+#include "SRF02.h"
+#include "N5110.h"
+
+BusOut leds(LED4,LED3,LED2,LED1); // Onboard LEDs
+SRF02 sensor(p28,p27); // sda, scl
+Serial serial(USBTX,USBRX); // tx, rx
+Ticker timer1; // timer1
+Ticker timer2; // timer2
+Ticker timer3; // timer3
+Ticker timer4; // timer4
+Ticker timer5; // timer5
+InterruptIn unit(p16); // input interrupt button
+InterruptIn display(p17); // input interrupt button
+DigitalOut led1(p24); // on/off LED
+DigitalOut led2(p23); // warning LED
+PwmOut buzzer(p21); // warning buzzer
+LocalFileSystem local("local"); // create local filesystem
+
+void serialISR(); // ISR that is called when serial data is received
+void setTime(); // function to set the UNIX time
+char rxString[16]; // buffer to store received string
+void error(int code); // determines error
+void uPressed(); // function to action of unit button
+void dPressed(); // function to action of display button
+void timer1Expired(); // function to action when timer1 triggers
+void timer2Expired(); // function to action when timer2 triggers
+void timer3Expired(); // function to action when timer3 triggers
+void timer4Expired(); // function to action when timer4 triggers
+void timer5Expired(); // function to action when timer5 triggers
+void warning(); // warning function
+void writeDataToFile(char* buffer, float distance); // function to write data to file
+float measureDistance(); // function to get distance
+
+int timer1Flag = 0; // set timer1Flag
+int timer2Flag = 0; // set timer2Flag
+int timer3Flag = 0; // set timer3Flag
+int timer4Flag = 0; // set timer4Flag
+int timer5Flag = 0; // set timer5Flag
+int uFlag = 0; // set unitFlag
+int dFlag = 0; // set displayFlag
+int setTimeFlag = 0; // flag for ISR
+
+int main()
+{
+    PHY_PowerDown();
+    serial.baud(9600); // set baud rate
+    unit.rise(&uPressed); // call ISR on rising edge (button pressed)
+    display.rise(&dPressed); // call ISR on rising edge (button pressed)
+    timer1.attach(&timer1Expired,2); // 2s timer
+    timer2.attach(&timer2Expired,1.5); // 2s timer
+    timer3.attach(&timer3Expired,1); // 2s timer
+    timer4.attach(&timer4Expired,0.5); // 2s timer
+    timer5.attach(&timer5Expired,0.1); // 2s timer
+    serial.attach(&serialISR); // attach serial ISR
+    char buffer[30]; // buffer used to store time string
+    set_time(0); // initialise time to 1st January 1970
+    led1 = 1;
+    while(1)  {
+        led2 = 0;
+        buzzer = 0;
+        buzzer.period(0.001);
+        float distance = measureDistance();
+        time_t seconds = time(NULL); // get current time
+// format time into a string (time and date)
+        strftime(buffer, 30 , "%D  %r", localtime(&seconds));
+        //if (dFlag) {
+            //writeDataToFile(buffer, distance); // write current value to disk
+            //}
+        if (distance<30) {
+            if (timer5Flag) {
+                timer5Flag = 0;
+                timer4Flag = 0;
+                timer3Flag = 0;
+                timer2Flag = 0;
+                timer1Flag = 0;
+                if (uFlag) {
+                    float mdistance = distance/100;
+                    serial.printf("%s, %.2f m\n",buffer, mdistance);
+                } else {
+                    serial.printf("%s, %.0f cm\n",buffer, distance);
+                }
+                serial.printf("Rate = 0.1\n");
+                warning();
+            }
+        } else if (distance<60) {
+            if (timer4Flag) {
+                timer5Flag = 0;
+                timer4Flag = 0;
+                timer3Flag = 0;
+                timer2Flag = 0;
+                timer1Flag = 0;
+                if (uFlag) {
+                    float mdistance = distance/100;
+                    serial.printf("%s, %.2f m\n",buffer, mdistance);
+                } else {
+                    serial.printf("%s, %.0f cm\n",buffer, distance);
+                }
+                warning();
+                serial.printf("Rate = 0.5\n");
+            }
+        } else if (distance<90) {
+            if (timer3Flag) {
+                timer5Flag = 0;
+                timer4Flag = 0;
+                timer3Flag = 0;
+                timer2Flag = 0;
+                timer1Flag = 0;
+                if (uFlag) {
+                    float mdistance = distance/100;
+                    serial.printf("%s, %.2f m\n",buffer, mdistance);
+                } else {
+                    serial.printf("%s, %.0f cm\n",buffer, distance);
+                }
+                warning();
+                serial.printf("Rate = 1\n");
+            }
+        } else if (distance<120) {
+            if (timer2Flag) {
+                timer5Flag = 0;
+                timer4Flag = 0;
+                timer3Flag = 0;
+                timer2Flag = 0;
+                timer1Flag = 0;
+                if (uFlag) {
+                    float mdistance = distance/100;
+                    serial.printf("%s, %.2f m\n",buffer, mdistance);
+                } else {
+                    serial.printf("%s, %.0f cm\n",buffer, distance);
+                }
+                warning();
+                serial.printf("Rate = 1.5\n");
+            }
+        } else {
+            if (timer1Flag) {
+                timer5Flag = 0;
+                timer4Flag = 0;
+                timer3Flag = 0;
+                timer2Flag = 0;
+                timer1Flag = 0;
+                if (uFlag) {
+                    float mdistance = distance/100;
+                    serial.printf("%s, %.2f m\n",buffer, mdistance);
+                } else {
+                    serial.printf("%s, %.0f cm\n",buffer, distance);
+                }
+                warning();
+                serial.printf("Rate = 2\n");
+            }
+        }
+        if (setTimeFlag) { // if updated time has been sent
+            setTimeFlag = 0; // clear flag
+            setTime(); // update time
+        }
+        Sleep();
+    }
+}
+
+
+void timer1Expired()
+{
+    timer1Flag = 1;
+}
+
+void timer2Expired()
+{
+    timer2Flag = 1;
+}
+
+void timer3Expired()
+{
+    timer3Flag = 1;
+}
+
+void timer4Expired()
+{
+    timer4Flag = 1;
+}
+
+void timer5Expired()
+{
+    timer5Flag = 1;
+}
+
+float measureDistance()
+{
+    float d1 = sensor.getDistanceCm();
+    float d2 = sensor.getDistanceCm();
+    float d3 = sensor.getDistanceCm();
+    float d4 = sensor.getDistanceCm();
+    float d5 = sensor.getDistanceCm();
+    float d6 = sensor.getDistanceCm();
+    float d7 = sensor.getDistanceCm();
+    float d8 = sensor.getDistanceCm();
+    float d9 = sensor.getDistanceCm();
+    float d10 = sensor.getDistanceCm();
+    float dt = (d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)/10;
+    return dt;
+}
+
+void setTime()
+{
+// print time for debugging
+    serial.printf("set_time - %s",rxString);
+// atoi() converts a string to an integer
+    int time = atoi(rxString);
+// update the time
+    set_time(time);
+}
+void serialISR()
+{
+// when a serial interrupt occurs, read rx string into buffer
+    serial.gets(rxString,30);
+// set flag
+    setTimeFlag = 1;
+}
+
+void uPressed()   // toggle direction in ISR
+{
+    uFlag = !uFlag;
+}
+
+void dPressed()   // toggle direction in ISR
+{
+    dFlag = !dFlag;
+    wait (0.2);
+}
+
+void warning()
+{
+    led2 = !led2;
+    buzzer = 0.5;
+}
+
+void writeDataToFile(char* buffer, float distance)
+{
+    leds = 15; // turn on LEDs for feedback
+    FILE *fp = fopen("/local/log.csv", "a"); // open 'log.csv' for appending
+// if the file doesn't exist it is created, if it exists, data is appended to the end
+    fprintf(fp,"%s, %.2f\n",buffer, distance); // print string to file
+    serial.printf("Data Logged\n\r");
+    fclose(fp); // close file
+    leds = 0; // turn off LEDs to signify file access has finished
+}