Development and testing of ultrasonic distance measurement library for device HC-SR04.

Dependencies:   TextLCD_improved mbed Distance_HC_SR04

main.cpp

Committer:
dzoni
Date:
2015-12-20
Revision:
0:6fd0fbcfc7e1
Child:
2:aba8d0d53190

File content as of revision 0:6fd0fbcfc7e1:

/*
 * TSK_MAIN.CPP
 */
#include "mbed.h"

#include "TextLCD.h"

#define TIMEOUT_DELAY_US    (25000)
#define CALC_COEFF          (1000.0f*340.0f/2)
#define TICKS_RANGE_MAX     (15000)
#define TICKS_RANGE_MIN     (150)

TextLCD lcd(PA_8, PA_7, PA_9, PA_1, PB_5, PA_10, TextLCD::LCD16x2);

static DigitalOut trigDist(PB_9);
static DigitalIn echoDist(PA_6);

static uint32_t timer_ticks;
static float time_float;
static uint32_t timer_ticks_min;

static Timer timer;

static Timeout timeout;

static volatile enum { IDLE, STARTED, COMPLETED, TIMEOUT, OUT_OF_RANGE_MIN, OUT_OF_RANGE_MAX, ERROR_SIG } state;

void tout(void) {
    if (state == STARTED) 
        state = TIMEOUT;
}

int main() {
    
    trigDist = 0;
    state = IDLE;
    timer_ticks_min = 999999;

    wait_ms(250);
    lcd.cls();

    lcd.cls();
    lcd.printf("Row 1");
    lcd.locate(0, 1);    
    lcd.printf("Row 2");

    while (true) {    
        // Priprava
        state = STARTED;
        timeout.attach_us(&tout, TIMEOUT_DELAY_US);

        // Dej puls na trig
        trigDist = 1;
        wait_us(500);
        trigDist = 0;
    
        // Zkontroluj signal
        if (echoDist != 0) {
            state = ERROR_SIG;
            timer_ticks = 0;
            lcd.cls();
            lcd.printf("Dist.: ---", timer_ticks);
            lcd.locate(0, 1);    
            lcd.printf("ERROR_SIG");
        } else {
            // Vynuluj timer
            timer.stop();
            timer.reset();
                
            // Cekej na hrany na Echo
            while (echoDist == 0 && state == STARTED)
                ;
                
            timer.start();

            while (echoDist == 1 && state == STARTED)
                ;
                           
            if (state == STARTED) {
                state = COMPLETED;
                timer.stop();

                timer_ticks = timer.read_us();
                time_float = timer.read()*CALC_COEFF;

                timer_ticks_min = (timer_ticks_min < timer_ticks) ? timer_ticks_min : timer_ticks;
                
                if (timer_ticks < TICKS_RANGE_MIN) {
                    timer_ticks = 0;
                    time_float = 0.0f;

                    state = OUT_OF_RANGE_MIN;

                    lcd.cls();
                    lcd.printf("Dist.: ---");
                    lcd.locate(0, 1);    
                    lcd.printf("OUT_OF_RANGE_MIN");
                } else if (timer_ticks > TICKS_RANGE_MAX) {
                    timer_ticks = 0;
                    time_float = 0.0f;

                    state = OUT_OF_RANGE_MAX;

                    lcd.cls();
                    lcd.printf("Dist.: ---");
                    lcd.locate(0, 1);    
                    lcd.printf("OUT_OF_RANGE_MAX");
                } else {
                    lcd.cls();
                    lcd.printf("Dist.: %u %u", timer_ticks, timer_ticks_min);
                    lcd.locate(0, 1);    
                    lcd.printf("Dist.: %.3f", time_float);
                }
            } else {
                timer.stop();
                timer_ticks = 0;
                time_float = 0.0f;

                lcd.cls();
                lcd.printf("Dist.: ---", timer_ticks);
                lcd.locate(0, 1);    
                lcd.printf("TIMEOUT");
            }
        }
        timeout.detach();

        wait_ms(100);

        state = IDLE;
    }
}


/*
// A class for flip()-ing a DigitalOut 
class Flipper {
public:
    Flipper(PinName pin) : _pin(pin) {
        _pin = 0;
    }
    void flip() {
        _pin = !_pin;
    }
private:
    DigitalOut _pin;
};
 
DigitalOut led1(LED1);
Flipper f(LED2);
Timeout t;
 
int main() {
    t.attach(&f, &Flipper::flip, 2.0); // the address of the object, member function, and interval
 
    // spin in a main loop. flipper will interrupt it to call flip
    while(1) {
        led1 = !led1;
        wait(0.2);
    }
}

 */