SMART CLEO Ultrasonic

Committer:
SMART_CLEO
Date:
Thu Sep 28 03:44:12 2017 +0000
Revision:
0:e7c4d23dbc05
SMART_CLEO

Who changed what in which revision?

UserRevisionLine numberNew 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 }