![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: main.cpp
- 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 +}