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
}