Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of HCSR04 by
HCSR04.cpp@7:e53b2476821e, 2017-11-25 (annotated)
- Committer:
- tgw
- Date:
- Sat Nov 25 02:02:51 2017 +0000
- Revision:
- 7:e53b2476821e
- Parent:
- 6:cf3e4e307d15
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tbjazic | 0:8871082486ac | 1 | #include "mbed.h" |
tbjazic | 0:8871082486ac | 2 | #include "HCSR04.h" |
tbjazic | 0:8871082486ac | 3 | |
tbjazic | 0:8871082486ac | 4 | HCSR04::HCSR04(PinName echoPin, PinName triggerPin) : echo(echoPin), trigger(triggerPin) { |
tbjazic | 0:8871082486ac | 5 | init(); |
tbjazic | 0:8871082486ac | 6 | } |
tbjazic | 0:8871082486ac | 7 | |
tbjazic | 0:8871082486ac | 8 | void HCSR04::init() { |
tbjazic | 3:9a7899cf5e3a | 9 | distance = -1; // initial distance |
tbjazic | 4:aae70f15357f | 10 | minDistance = 2; |
tbjazic | 3:9a7899cf5e3a | 11 | maxDistance = 400; |
tbjazic | 6:cf3e4e307d15 | 12 | newDataReady = timerStarted = false; |
tbjazic | 0:8871082486ac | 13 | } |
tbjazic | 0:8871082486ac | 14 | |
tbjazic | 0:8871082486ac | 15 | void HCSR04::startTimer() { |
tbjazic | 6:cf3e4e307d15 | 16 | if (!timerStarted) { |
tbjazic | 6:cf3e4e307d15 | 17 | timer.start(); // start the timer |
tbjazic | 6:cf3e4e307d15 | 18 | timerStarted = true; |
tgw | 7:e53b2476821e | 19 | //echoTimeout.attach_us(this, &HCSR04::stopTimer, 25000); // in case echo fall does not occur |
tgw | 7:e53b2476821e | 20 | echoTimeout.attach_us(callback(this, &HCSR04::stopTimer), 25000); // in case echo fall does not occur |
tgw | 7:e53b2476821e | 21 | echo.fall(callback(this, &HCSR04::stopTimer)); |
tbjazic | 6:cf3e4e307d15 | 22 | echo.rise(NULL); |
tbjazic | 6:cf3e4e307d15 | 23 | } |
tbjazic | 0:8871082486ac | 24 | } |
tbjazic | 0:8871082486ac | 25 | |
tbjazic | 0:8871082486ac | 26 | void HCSR04::stopTimer() { |
tbjazic | 0:8871082486ac | 27 | timer.stop(); // stop the timer |
tbjazic | 6:cf3e4e307d15 | 28 | if (timerStarted) { |
tbjazic | 6:cf3e4e307d15 | 29 | distance = timer.read() * 1e6 / 58; |
tbjazic | 6:cf3e4e307d15 | 30 | if (distance < minDistance) |
tbjazic | 6:cf3e4e307d15 | 31 | distance = minDistance; |
tbjazic | 6:cf3e4e307d15 | 32 | if (distance > maxDistance) |
tbjazic | 6:cf3e4e307d15 | 33 | distance = maxDistance; |
tbjazic | 6:cf3e4e307d15 | 34 | newDataReady = true; |
tbjazic | 6:cf3e4e307d15 | 35 | } |
tbjazic | 6:cf3e4e307d15 | 36 | timer.reset(); |
tbjazic | 6:cf3e4e307d15 | 37 | timerStarted = false; |
tbjazic | 6:cf3e4e307d15 | 38 | echoTimeout.detach(); |
tbjazic | 6:cf3e4e307d15 | 39 | echo.fall(NULL); |
tbjazic | 6:cf3e4e307d15 | 40 | } |
tbjazic | 6:cf3e4e307d15 | 41 | |
tbjazic | 6:cf3e4e307d15 | 42 | void HCSR04::turnOffTrigger() { |
tbjazic | 6:cf3e4e307d15 | 43 | trigger = 0; |
tbjazic | 0:8871082486ac | 44 | } |
tbjazic | 0:8871082486ac | 45 | |
tbjazic | 0:8871082486ac | 46 | void HCSR04::startMeasurement() { |
tbjazic | 0:8871082486ac | 47 | trigger = 1; |
tgw | 7:e53b2476821e | 48 | triggerTimeout.attach_us(callback(this, &HCSR04::turnOffTrigger), 10); |
tgw | 7:e53b2476821e | 49 | echo.rise(callback(this, &HCSR04::startTimer)); |
tbjazic | 6:cf3e4e307d15 | 50 | newDataReady = false; |
tbjazic | 0:8871082486ac | 51 | } |
tbjazic | 0:8871082486ac | 52 | |
tbjazic | 0:8871082486ac | 53 | float HCSR04::getDistance_cm() { |
tbjazic | 6:cf3e4e307d15 | 54 | newDataReady = false; |
tbjazic | 0:8871082486ac | 55 | return distance; |
tbjazic | 4:aae70f15357f | 56 | } |
tbjazic | 4:aae70f15357f | 57 | |
tbjazic | 4:aae70f15357f | 58 | float HCSR04::getDistance_mm() { |
tbjazic | 6:cf3e4e307d15 | 59 | newDataReady = false; |
tbjazic | 4:aae70f15357f | 60 | return distance * 10; |
tbjazic | 4:aae70f15357f | 61 | } |
tbjazic | 4:aae70f15357f | 62 | |
tbjazic | 6:cf3e4e307d15 | 63 | bool HCSR04::isNewDataReady() { |
tbjazic | 6:cf3e4e307d15 | 64 | return newDataReady; |
tbjazic | 6:cf3e4e307d15 | 65 | } |
tbjazic | 6:cf3e4e307d15 | 66 | |
tbjazic | 4:aae70f15357f | 67 | void HCSR04::setRanges(float minRange, float maxRange) { |
tbjazic | 4:aae70f15357f | 68 | if (minRange < maxRange) { |
tbjazic | 6:cf3e4e307d15 | 69 | if (minRange >= 2 && minRange < 400) // bug from revs. 4 and 5 corrected |
tbjazic | 4:aae70f15357f | 70 | minDistance = minRange; |
tbjazic | 4:aae70f15357f | 71 | if (maxRange <= 400) |
tbjazic | 4:aae70f15357f | 72 | maxDistance = maxRange; |
tbjazic | 4:aae70f15357f | 73 | } |
tbjazic | 4:aae70f15357f | 74 | } |
tbjazic | 4:aae70f15357f | 75 | |
tbjazic | 4:aae70f15357f | 76 | float HCSR04::getMinRange() { |
tbjazic | 4:aae70f15357f | 77 | return minDistance; |
tbjazic | 4:aae70f15357f | 78 | } |
tbjazic | 4:aae70f15357f | 79 | |
tbjazic | 4:aae70f15357f | 80 | float HCSR04::getMaxRange() { |
tbjazic | 4:aae70f15357f | 81 | return maxDistance; |
tbjazic | 0:8871082486ac | 82 | } |