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.
HCSR04_Library/HCSR04.cpp@0:34c1f05d8d2c, 2019-11-16 (annotated)
- Committer:
- jpapratov
- Date:
- Sat Nov 16 10:14:58 2019 +0000
- Revision:
- 0:34c1f05d8d2c
Test.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jpapratov | 0:34c1f05d8d2c | 1 | #include "mbed.h" |
| jpapratov | 0:34c1f05d8d2c | 2 | #include "HCSR04.h" |
| jpapratov | 0:34c1f05d8d2c | 3 | |
| jpapratov | 0:34c1f05d8d2c | 4 | HCSR04::HCSR04(PinName echoPin, PinName triggerPin) : echo(echoPin), trigger(triggerPin) { |
| jpapratov | 0:34c1f05d8d2c | 5 | init(); |
| jpapratov | 0:34c1f05d8d2c | 6 | } |
| jpapratov | 0:34c1f05d8d2c | 7 | |
| jpapratov | 0:34c1f05d8d2c | 8 | void HCSR04::init() { |
| jpapratov | 0:34c1f05d8d2c | 9 | distance = -1; // initial distance |
| jpapratov | 0:34c1f05d8d2c | 10 | minDistance = 2; |
| jpapratov | 0:34c1f05d8d2c | 11 | maxDistance = 400; |
| jpapratov | 0:34c1f05d8d2c | 12 | newDataReady = timerStarted = false; |
| jpapratov | 0:34c1f05d8d2c | 13 | } |
| jpapratov | 0:34c1f05d8d2c | 14 | |
| jpapratov | 0:34c1f05d8d2c | 15 | void HCSR04::startTimer() { |
| jpapratov | 0:34c1f05d8d2c | 16 | if (!timerStarted) { |
| jpapratov | 0:34c1f05d8d2c | 17 | timer.start(); // start the timer |
| jpapratov | 0:34c1f05d8d2c | 18 | timerStarted = true; |
| jpapratov | 0:34c1f05d8d2c | 19 | echoTimeout.attach_us(this, &HCSR04::stopTimer, 25000); // in case echo fall does not occur |
| jpapratov | 0:34c1f05d8d2c | 20 | echo.fall(this, &HCSR04::stopTimer); |
| jpapratov | 0:34c1f05d8d2c | 21 | echo.rise(NULL); |
| jpapratov | 0:34c1f05d8d2c | 22 | } |
| jpapratov | 0:34c1f05d8d2c | 23 | } |
| jpapratov | 0:34c1f05d8d2c | 24 | |
| jpapratov | 0:34c1f05d8d2c | 25 | void HCSR04::stopTimer() { |
| jpapratov | 0:34c1f05d8d2c | 26 | timer.stop(); // stop the timer |
| jpapratov | 0:34c1f05d8d2c | 27 | if (timerStarted) { |
| jpapratov | 0:34c1f05d8d2c | 28 | distance = timer.read() * 1e6 / 58; |
| jpapratov | 0:34c1f05d8d2c | 29 | if (distance < minDistance) |
| jpapratov | 0:34c1f05d8d2c | 30 | distance = minDistance; |
| jpapratov | 0:34c1f05d8d2c | 31 | if (distance > maxDistance) |
| jpapratov | 0:34c1f05d8d2c | 32 | distance = maxDistance; |
| jpapratov | 0:34c1f05d8d2c | 33 | newDataReady = true; |
| jpapratov | 0:34c1f05d8d2c | 34 | } |
| jpapratov | 0:34c1f05d8d2c | 35 | timer.reset(); |
| jpapratov | 0:34c1f05d8d2c | 36 | timerStarted = false; |
| jpapratov | 0:34c1f05d8d2c | 37 | echoTimeout.detach(); |
| jpapratov | 0:34c1f05d8d2c | 38 | echo.fall(NULL); |
| jpapratov | 0:34c1f05d8d2c | 39 | } |
| jpapratov | 0:34c1f05d8d2c | 40 | |
| jpapratov | 0:34c1f05d8d2c | 41 | void HCSR04::turnOffTrigger() { |
| jpapratov | 0:34c1f05d8d2c | 42 | trigger = 0; |
| jpapratov | 0:34c1f05d8d2c | 43 | } |
| jpapratov | 0:34c1f05d8d2c | 44 | |
| jpapratov | 0:34c1f05d8d2c | 45 | void HCSR04::startMeasurement() { |
| jpapratov | 0:34c1f05d8d2c | 46 | trigger = 1; |
| jpapratov | 0:34c1f05d8d2c | 47 | triggerTimeout.attach_us(this, &HCSR04::turnOffTrigger, 10); |
| jpapratov | 0:34c1f05d8d2c | 48 | echo.rise(this, &HCSR04::startTimer); |
| jpapratov | 0:34c1f05d8d2c | 49 | newDataReady = false; |
| jpapratov | 0:34c1f05d8d2c | 50 | } |
| jpapratov | 0:34c1f05d8d2c | 51 | |
| jpapratov | 0:34c1f05d8d2c | 52 | float HCSR04::getDistance_cm() { |
| jpapratov | 0:34c1f05d8d2c | 53 | newDataReady = false; |
| jpapratov | 0:34c1f05d8d2c | 54 | return distance; |
| jpapratov | 0:34c1f05d8d2c | 55 | } |
| jpapratov | 0:34c1f05d8d2c | 56 | |
| jpapratov | 0:34c1f05d8d2c | 57 | float HCSR04::getDistance_mm() { |
| jpapratov | 0:34c1f05d8d2c | 58 | newDataReady = false; |
| jpapratov | 0:34c1f05d8d2c | 59 | return distance * 10; |
| jpapratov | 0:34c1f05d8d2c | 60 | } |
| jpapratov | 0:34c1f05d8d2c | 61 | |
| jpapratov | 0:34c1f05d8d2c | 62 | bool HCSR04::isNewDataReady() { |
| jpapratov | 0:34c1f05d8d2c | 63 | return newDataReady; |
| jpapratov | 0:34c1f05d8d2c | 64 | } |
| jpapratov | 0:34c1f05d8d2c | 65 | |
| jpapratov | 0:34c1f05d8d2c | 66 | void HCSR04::setRanges(float minRange, float maxRange) { |
| jpapratov | 0:34c1f05d8d2c | 67 | if (minRange < maxRange) { |
| jpapratov | 0:34c1f05d8d2c | 68 | if (minRange >= 2 && minRange < 400) // bug from revs. 4 and 5 corrected |
| jpapratov | 0:34c1f05d8d2c | 69 | minDistance = minRange; |
| jpapratov | 0:34c1f05d8d2c | 70 | if (maxRange <= 400) |
| jpapratov | 0:34c1f05d8d2c | 71 | maxDistance = maxRange; |
| jpapratov | 0:34c1f05d8d2c | 72 | } |
| jpapratov | 0:34c1f05d8d2c | 73 | } |
| jpapratov | 0:34c1f05d8d2c | 74 | |
| jpapratov | 0:34c1f05d8d2c | 75 | float HCSR04::getMinRange() { |
| jpapratov | 0:34c1f05d8d2c | 76 | return minDistance; |
| jpapratov | 0:34c1f05d8d2c | 77 | } |
| jpapratov | 0:34c1f05d8d2c | 78 | |
| jpapratov | 0:34c1f05d8d2c | 79 | float HCSR04::getMaxRange() { |
| jpapratov | 0:34c1f05d8d2c | 80 | return maxDistance; |
| jpapratov | 0:34c1f05d8d2c | 81 | } |