![](/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
main.cpp
- Committer:
- el13a2w
- Date:
- 2015-04-09
- Revision:
- 0:b6b1dc0389cb
- Child:
- 1:c720fcb68396
File content as of revision 0:b6b1dc0389cb:
#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 }