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