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

Dependencies:   TextLCD_improved mbed Distance_HC_SR04

Committer:
dzoni
Date:
Sun Dec 20 20:27:09 2015 +0000
Revision:
0:6fd0fbcfc7e1
Child:
2:aba8d0d53190
Prvn? verze kompletn?. Funkce pln? implementovan? v main() + timeout.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dzoni 0:6fd0fbcfc7e1 1 /*
dzoni 0:6fd0fbcfc7e1 2 * TSK_MAIN.CPP
dzoni 0:6fd0fbcfc7e1 3 */
dzoni 0:6fd0fbcfc7e1 4 #include "mbed.h"
dzoni 0:6fd0fbcfc7e1 5
dzoni 0:6fd0fbcfc7e1 6 #include "TextLCD.h"
dzoni 0:6fd0fbcfc7e1 7
dzoni 0:6fd0fbcfc7e1 8 #define TIMEOUT_DELAY_US (25000)
dzoni 0:6fd0fbcfc7e1 9 #define CALC_COEFF (1000.0f*340.0f/2)
dzoni 0:6fd0fbcfc7e1 10 #define TICKS_RANGE_MAX (15000)
dzoni 0:6fd0fbcfc7e1 11 #define TICKS_RANGE_MIN (150)
dzoni 0:6fd0fbcfc7e1 12
dzoni 0:6fd0fbcfc7e1 13 TextLCD lcd(PA_8, PA_7, PA_9, PA_1, PB_5, PA_10, TextLCD::LCD16x2);
dzoni 0:6fd0fbcfc7e1 14
dzoni 0:6fd0fbcfc7e1 15 static DigitalOut trigDist(PB_9);
dzoni 0:6fd0fbcfc7e1 16 static DigitalIn echoDist(PA_6);
dzoni 0:6fd0fbcfc7e1 17
dzoni 0:6fd0fbcfc7e1 18 static uint32_t timer_ticks;
dzoni 0:6fd0fbcfc7e1 19 static float time_float;
dzoni 0:6fd0fbcfc7e1 20 static uint32_t timer_ticks_min;
dzoni 0:6fd0fbcfc7e1 21
dzoni 0:6fd0fbcfc7e1 22 static Timer timer;
dzoni 0:6fd0fbcfc7e1 23
dzoni 0:6fd0fbcfc7e1 24 static Timeout timeout;
dzoni 0:6fd0fbcfc7e1 25
dzoni 0:6fd0fbcfc7e1 26 static volatile enum { IDLE, STARTED, COMPLETED, TIMEOUT, OUT_OF_RANGE_MIN, OUT_OF_RANGE_MAX, ERROR_SIG } state;
dzoni 0:6fd0fbcfc7e1 27
dzoni 0:6fd0fbcfc7e1 28 void tout(void) {
dzoni 0:6fd0fbcfc7e1 29 if (state == STARTED)
dzoni 0:6fd0fbcfc7e1 30 state = TIMEOUT;
dzoni 0:6fd0fbcfc7e1 31 }
dzoni 0:6fd0fbcfc7e1 32
dzoni 0:6fd0fbcfc7e1 33 int main() {
dzoni 0:6fd0fbcfc7e1 34
dzoni 0:6fd0fbcfc7e1 35 trigDist = 0;
dzoni 0:6fd0fbcfc7e1 36 state = IDLE;
dzoni 0:6fd0fbcfc7e1 37 timer_ticks_min = 999999;
dzoni 0:6fd0fbcfc7e1 38
dzoni 0:6fd0fbcfc7e1 39 wait_ms(250);
dzoni 0:6fd0fbcfc7e1 40 lcd.cls();
dzoni 0:6fd0fbcfc7e1 41
dzoni 0:6fd0fbcfc7e1 42 lcd.cls();
dzoni 0:6fd0fbcfc7e1 43 lcd.printf("Row 1");
dzoni 0:6fd0fbcfc7e1 44 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 45 lcd.printf("Row 2");
dzoni 0:6fd0fbcfc7e1 46
dzoni 0:6fd0fbcfc7e1 47 while (true) {
dzoni 0:6fd0fbcfc7e1 48 // Priprava
dzoni 0:6fd0fbcfc7e1 49 state = STARTED;
dzoni 0:6fd0fbcfc7e1 50 timeout.attach_us(&tout, TIMEOUT_DELAY_US);
dzoni 0:6fd0fbcfc7e1 51
dzoni 0:6fd0fbcfc7e1 52 // Dej puls na trig
dzoni 0:6fd0fbcfc7e1 53 trigDist = 1;
dzoni 0:6fd0fbcfc7e1 54 wait_us(500);
dzoni 0:6fd0fbcfc7e1 55 trigDist = 0;
dzoni 0:6fd0fbcfc7e1 56
dzoni 0:6fd0fbcfc7e1 57 // Zkontroluj signal
dzoni 0:6fd0fbcfc7e1 58 if (echoDist != 0) {
dzoni 0:6fd0fbcfc7e1 59 state = ERROR_SIG;
dzoni 0:6fd0fbcfc7e1 60 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 61 lcd.cls();
dzoni 0:6fd0fbcfc7e1 62 lcd.printf("Dist.: ---", timer_ticks);
dzoni 0:6fd0fbcfc7e1 63 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 64 lcd.printf("ERROR_SIG");
dzoni 0:6fd0fbcfc7e1 65 } else {
dzoni 0:6fd0fbcfc7e1 66 // Vynuluj timer
dzoni 0:6fd0fbcfc7e1 67 timer.stop();
dzoni 0:6fd0fbcfc7e1 68 timer.reset();
dzoni 0:6fd0fbcfc7e1 69
dzoni 0:6fd0fbcfc7e1 70 // Cekej na hrany na Echo
dzoni 0:6fd0fbcfc7e1 71 while (echoDist == 0 && state == STARTED)
dzoni 0:6fd0fbcfc7e1 72 ;
dzoni 0:6fd0fbcfc7e1 73
dzoni 0:6fd0fbcfc7e1 74 timer.start();
dzoni 0:6fd0fbcfc7e1 75
dzoni 0:6fd0fbcfc7e1 76 while (echoDist == 1 && state == STARTED)
dzoni 0:6fd0fbcfc7e1 77 ;
dzoni 0:6fd0fbcfc7e1 78
dzoni 0:6fd0fbcfc7e1 79 if (state == STARTED) {
dzoni 0:6fd0fbcfc7e1 80 state = COMPLETED;
dzoni 0:6fd0fbcfc7e1 81 timer.stop();
dzoni 0:6fd0fbcfc7e1 82
dzoni 0:6fd0fbcfc7e1 83 timer_ticks = timer.read_us();
dzoni 0:6fd0fbcfc7e1 84 time_float = timer.read()*CALC_COEFF;
dzoni 0:6fd0fbcfc7e1 85
dzoni 0:6fd0fbcfc7e1 86 timer_ticks_min = (timer_ticks_min < timer_ticks) ? timer_ticks_min : timer_ticks;
dzoni 0:6fd0fbcfc7e1 87
dzoni 0:6fd0fbcfc7e1 88 if (timer_ticks < TICKS_RANGE_MIN) {
dzoni 0:6fd0fbcfc7e1 89 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 90 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 91
dzoni 0:6fd0fbcfc7e1 92 state = OUT_OF_RANGE_MIN;
dzoni 0:6fd0fbcfc7e1 93
dzoni 0:6fd0fbcfc7e1 94 lcd.cls();
dzoni 0:6fd0fbcfc7e1 95 lcd.printf("Dist.: ---");
dzoni 0:6fd0fbcfc7e1 96 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 97 lcd.printf("OUT_OF_RANGE_MIN");
dzoni 0:6fd0fbcfc7e1 98 } else if (timer_ticks > TICKS_RANGE_MAX) {
dzoni 0:6fd0fbcfc7e1 99 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 100 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 101
dzoni 0:6fd0fbcfc7e1 102 state = OUT_OF_RANGE_MAX;
dzoni 0:6fd0fbcfc7e1 103
dzoni 0:6fd0fbcfc7e1 104 lcd.cls();
dzoni 0:6fd0fbcfc7e1 105 lcd.printf("Dist.: ---");
dzoni 0:6fd0fbcfc7e1 106 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 107 lcd.printf("OUT_OF_RANGE_MAX");
dzoni 0:6fd0fbcfc7e1 108 } else {
dzoni 0:6fd0fbcfc7e1 109 lcd.cls();
dzoni 0:6fd0fbcfc7e1 110 lcd.printf("Dist.: %u %u", timer_ticks, timer_ticks_min);
dzoni 0:6fd0fbcfc7e1 111 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 112 lcd.printf("Dist.: %.3f", time_float);
dzoni 0:6fd0fbcfc7e1 113 }
dzoni 0:6fd0fbcfc7e1 114 } else {
dzoni 0:6fd0fbcfc7e1 115 timer.stop();
dzoni 0:6fd0fbcfc7e1 116 timer_ticks = 0;
dzoni 0:6fd0fbcfc7e1 117 time_float = 0.0f;
dzoni 0:6fd0fbcfc7e1 118
dzoni 0:6fd0fbcfc7e1 119 lcd.cls();
dzoni 0:6fd0fbcfc7e1 120 lcd.printf("Dist.: ---", timer_ticks);
dzoni 0:6fd0fbcfc7e1 121 lcd.locate(0, 1);
dzoni 0:6fd0fbcfc7e1 122 lcd.printf("TIMEOUT");
dzoni 0:6fd0fbcfc7e1 123 }
dzoni 0:6fd0fbcfc7e1 124 }
dzoni 0:6fd0fbcfc7e1 125 timeout.detach();
dzoni 0:6fd0fbcfc7e1 126
dzoni 0:6fd0fbcfc7e1 127 wait_ms(100);
dzoni 0:6fd0fbcfc7e1 128
dzoni 0:6fd0fbcfc7e1 129 state = IDLE;
dzoni 0:6fd0fbcfc7e1 130 }
dzoni 0:6fd0fbcfc7e1 131 }
dzoni 0:6fd0fbcfc7e1 132
dzoni 0:6fd0fbcfc7e1 133
dzoni 0:6fd0fbcfc7e1 134 /*
dzoni 0:6fd0fbcfc7e1 135 // A class for flip()-ing a DigitalOut
dzoni 0:6fd0fbcfc7e1 136 class Flipper {
dzoni 0:6fd0fbcfc7e1 137 public:
dzoni 0:6fd0fbcfc7e1 138 Flipper(PinName pin) : _pin(pin) {
dzoni 0:6fd0fbcfc7e1 139 _pin = 0;
dzoni 0:6fd0fbcfc7e1 140 }
dzoni 0:6fd0fbcfc7e1 141 void flip() {
dzoni 0:6fd0fbcfc7e1 142 _pin = !_pin;
dzoni 0:6fd0fbcfc7e1 143 }
dzoni 0:6fd0fbcfc7e1 144 private:
dzoni 0:6fd0fbcfc7e1 145 DigitalOut _pin;
dzoni 0:6fd0fbcfc7e1 146 };
dzoni 0:6fd0fbcfc7e1 147
dzoni 0:6fd0fbcfc7e1 148 DigitalOut led1(LED1);
dzoni 0:6fd0fbcfc7e1 149 Flipper f(LED2);
dzoni 0:6fd0fbcfc7e1 150 Timeout t;
dzoni 0:6fd0fbcfc7e1 151
dzoni 0:6fd0fbcfc7e1 152 int main() {
dzoni 0:6fd0fbcfc7e1 153 t.attach(&f, &Flipper::flip, 2.0); // the address of the object, member function, and interval
dzoni 0:6fd0fbcfc7e1 154
dzoni 0:6fd0fbcfc7e1 155 // spin in a main loop. flipper will interrupt it to call flip
dzoni 0:6fd0fbcfc7e1 156 while(1) {
dzoni 0:6fd0fbcfc7e1 157 led1 = !led1;
dzoni 0:6fd0fbcfc7e1 158 wait(0.2);
dzoni 0:6fd0fbcfc7e1 159 }
dzoni 0:6fd0fbcfc7e1 160 }
dzoni 0:6fd0fbcfc7e1 161
dzoni 0:6fd0fbcfc7e1 162 */