![](/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-05-10
- Revision:
- 5:c18bd289bc88
- Parent:
- 4:880995b4a063
File content as of revision 5:c18bd289bc88:
#include "mbed.h" #include "PowerControl/PowerControl.h" #include "PowerControl/EthernetPowerControl.h" #include "SRF02.h" #include "N5110.h" #include "main.h" int main() { PHY_PowerDown(); lcd.init(); // initialise display lcd.printString("Ultrasonic", 13,1); // print string on row 1 lcd.printString("Sensor", 25,2); // print string on row 2 lcd.printString("Adrian Wong", 9,4); // print string on row 4 lcd.drawRect(1,1,81,45,0); // transparent, just outline lcd.drawRect(5,26,28,2,1); // filled black rectangle lcd.drawRect(51,26,28,2,1); // filled black rectangle lcd.printString("X", 40,3); // print string on row 3 lcd.drawCircle(37,27,1,1); // x,y,radius,black fill lcd.drawCircle(47,27,1,1); // x,y,radius,black fill wait(1); lcd.clear(); // Clear all pixels off display 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,1); // 1s timer timer2.attach(&timer2Expired,0.8); // 0.8s timer timer3.attach(&timer3Expired,0.6); // 0.6s timer timer4.attach(&timer4Expired,0.3); // 0.3s timer timer5.attach(&timer5Expired,0.1); // 0.1s timer serial.attach(&serialISR); // attach serial ISR char buffer[30]; // buffer used to store information char buffer1[14]; // buffer used to store distance for LCD char buffer2[14]; // buffer used to store time for LCD char buffer3[14]; // buffer used to store month/date for LCD led1 = 1; while(1) { lcd.normalMode(); // normal colour mode lcd.setBrightness(0.5); // put LED backlight on 50% led2 = 0; // resets led2 buzzer = 0; // resets buzzer buzzer.period(0.001); // sets buzzer pwm period float distance = measureDistance(); // get the distance time_t seconds = time(NULL); // get current time // format time into a string (time and date) strftime(buffer, 30 , "%b %d, %X", localtime(&seconds)); // set buffer to store time and date strftime(buffer2, 14 , "%X", localtime(&seconds)); // set buffer2 to store time strftime(buffer3, 14 , "%b %d", localtime(&seconds)); // set buffer3 to store date and month writeDataToFile(buffer, distance); // write current value to disk lcd.clear(); // clear display lcd.init(); // initialise display if (distance<30) { if (timer5Flag) { timer5Flag = 0; // resets timer flag timer4Flag = 0; // resets timer flag timer3Flag = 0; // resets timer flag timer2Flag = 0; // resets timer flag timer1Flag = 0; // resets timer flag if (uFlag) { float mdistance = distance/100; // get distance in metres serial.printf("%s, %.2f m\n",buffer, mdistance); // print time then distance in metres float length = sprintf(buffer1,"D = %.2f m",mdistance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,84,48,1); // filled black rectangle } } else { serial.printf("%s, %.0f cm\n",buffer, distance); // print time then distance in centimetres float length = sprintf(buffer1,"D = %.2f cm",distance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,84,48,1); // filled black rectangle } } serial.printf("Rate = 0.1\n"); warning(); } } else if (distance<60) { if (timer4Flag) { timer5Flag = 0; // resets timer flag timer4Flag = 0; // resets timer flag timer3Flag = 0; // resets timer flag timer2Flag = 0; // resets timer flag timer1Flag = 0; // resets timer flag if (uFlag) { float mdistance = distance/100; // get distance in metres serial.printf("%s, %.2f m\n",buffer, mdistance); // print time then distance in metres float length = sprintf(buffer1,"D = %.2f m",mdistance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,64,48,1); // filled black rectangle } } else { serial.printf("%s, %.0f cm\n",buffer, distance); // print time then distance in centimetres float length = sprintf(buffer1,"D = %.2f cm",distance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,64,48,1); // filled black rectangle } } serial.printf("Rate = 0.3\n"); warning(); } } else if (distance<90) { if (timer3Flag) { timer5Flag = 0; // resets timer flag timer4Flag = 0; // resets timer flag timer3Flag = 0; // resets timer flag timer2Flag = 0; // resets timer flag timer1Flag = 0; // resets timer flag if (uFlag) { float mdistance = distance/100; // get distance in metres serial.printf("%s, %.2f m\n",buffer, mdistance); // print time then distance in metres float length = sprintf(buffer1,"D = %.2f m",mdistance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,44,48,1); // filled black rectangle } } else { serial.printf("%s, %.0f cm\n",buffer, distance); // print time then distance in centimetres float length = sprintf(buffer1,"D = %.2f cm",distance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,44,48,1); // filled black rectangle } } serial.printf("Rate = 0.6\n"); warning(); } } else if (distance<120) { if (timer2Flag) { timer5Flag = 0; // resets timer flag timer4Flag = 0; // resets timer flag timer3Flag = 0; // resets timer flag timer2Flag = 0; // resets timer flag timer1Flag = 0; // resets timer flag if (uFlag) { float mdistance = distance/100; // get distance in metres serial.printf("%s, %.2f m\n",buffer, mdistance); // print time then distance in metres float length = sprintf(buffer1,"D = %.2f m",mdistance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,24,48,1); // filled black rectangle } } else { serial.printf("%s, %.0f cm\n",buffer, distance); // print time then distance in centimetres float length = sprintf(buffer1,"D = %.2f cm",distance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,24,48,1); // filled black rectangle } } serial.printf("Rate = 0.8\n"); warning(); } } else { if (timer1Flag) { timer5Flag = 0; // resets timer flag timer4Flag = 0; // resets timer flag timer3Flag = 0; // resets timer flag timer2Flag = 0; // resets timer flag timer1Flag = 0; // resets timer flag if (uFlag) { float mdistance = distance/100; // get distance in metres serial.printf("%s, %.2f m\n",buffer, mdistance); // print time then distance in metres float length = sprintf(buffer1,"D = %.2f m",mdistance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,4,48,1); // filled black rectangle } } else { serial.printf("%s, %.0f cm\n",buffer, distance); // print time then distance in centimetres float length = sprintf(buffer1,"D = %.2f cm",distance); // print distance on lcd float length1 = sprintf(buffer2,"%s",buffer2); // print time float length2 = sprintf(buffer3,"%s",buffer3); // print date and month if (dFlag) { if (length <= 14) { if (length1 <= 14) { if (length2 <= 14) { lcd.printString(buffer1,3,1); // print on row 1 lcd.printString(buffer2,18,4); // print on row 4 lcd.printString(buffer3,24,3); // print on row 3 } } } } else { lcd.drawRect(1,1,4,48,1); // filled black rectangle } } serial.printf("Rate = 1\n"); warning(); } } 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; wait (0.2); } void dPressed() // toggle direction in ISR { dFlag = !dFlag; wait (0.2); } void warning() { float vol = pot.read()/5; led2 = !led2; buzzer = vol+0.8; } void writeDataToFile(char* buffer, float distance) { leds = 1; // 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 }