
test
JSN_SR04/JSN_SR04.cpp@0:d383e2dee0f7, 2020-07-06 (annotated)
- Committer:
- ommpy
- Date:
- Mon Jul 06 17:18:59 2020 +0530
- Revision:
- 0:d383e2dee0f7
- Child:
- 4:f6e22dd39313
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ommpy | 0:d383e2dee0f7 | 1 | #include "mbed.h" |
ommpy | 0:d383e2dee0f7 | 2 | #include "JSN_SR04.h" |
ommpy | 0:d383e2dee0f7 | 3 | |
ommpy | 0:d383e2dee0f7 | 4 | JSN_SR04::JSN_SR04(PinName echoPin, PinName triggerPin) : echo(echoPin), trigger(triggerPin) { |
ommpy | 0:d383e2dee0f7 | 5 | init(); |
ommpy | 0:d383e2dee0f7 | 6 | } |
ommpy | 0:d383e2dee0f7 | 7 | |
ommpy | 0:d383e2dee0f7 | 8 | void JSN_SR04::init() { |
ommpy | 0:d383e2dee0f7 | 9 | distance = -1; // Default distance |
ommpy | 0:d383e2dee0f7 | 10 | minDistance = 2; // Default min boundary |
ommpy | 0:d383e2dee0f7 | 11 | maxDistance = 400; // Default max boundary |
ommpy | 0:d383e2dee0f7 | 12 | newDataReady = timerStarted = false; // Indicators are false by default |
ommpy | 0:d383e2dee0f7 | 13 | } |
ommpy | 0:d383e2dee0f7 | 14 | |
ommpy | 0:d383e2dee0f7 | 15 | void JSN_SR04::startTimer() { |
ommpy | 0:d383e2dee0f7 | 16 | // Check if the timer started |
ommpy | 0:d383e2dee0f7 | 17 | if (!timerStarted) { |
ommpy | 0:d383e2dee0f7 | 18 | // start the timer |
ommpy | 0:d383e2dee0f7 | 19 | timer.start(); |
ommpy | 0:d383e2dee0f7 | 20 | timerStarted = true; |
ommpy | 0:d383e2dee0f7 | 21 | |
ommpy | 0:d383e2dee0f7 | 22 | // Call the stopTimer() method after a predefined timeout (> 25 ms signal duration indicates that there is no obstacle) |
ommpy | 0:d383e2dee0f7 | 23 | echoTimeout.attach_us(this, &JSN_SR04::stopTimer, SENSOR_TIMEOUT); |
ommpy | 0:d383e2dee0f7 | 24 | |
ommpy | 0:d383e2dee0f7 | 25 | // Stop measurement and |
ommpy | 0:d383e2dee0f7 | 26 | echo.fall(this, &JSN_SR04::stopTimer); |
ommpy | 0:d383e2dee0f7 | 27 | echo.rise(NULL); |
ommpy | 0:d383e2dee0f7 | 28 | } |
ommpy | 0:d383e2dee0f7 | 29 | } |
ommpy | 0:d383e2dee0f7 | 30 | |
ommpy | 0:d383e2dee0f7 | 31 | void JSN_SR04::calculateDistance() { |
ommpy | 0:d383e2dee0f7 | 32 | int timer_state; // Current timer state (ticks amount) |
ommpy | 0:d383e2dee0f7 | 33 | |
ommpy | 0:d383e2dee0f7 | 34 | // Check if timer was even started |
ommpy | 0:d383e2dee0f7 | 35 | if (timerStarted) { |
ommpy | 0:d383e2dee0f7 | 36 | timer_state = timer.read(); |
ommpy | 0:d383e2dee0f7 | 37 | |
ommpy | 0:d383e2dee0f7 | 38 | // If timeout occured (no obstacle) |
ommpy | 0:d383e2dee0f7 | 39 | if (timer_state >= SENSOR_TIMEOUT) distance = -1; |
ommpy | 0:d383e2dee0f7 | 40 | |
ommpy | 0:d383e2dee0f7 | 41 | // If there is no timeout (an obstacle detected) |
ommpy | 0:d383e2dee0f7 | 42 | else { |
ommpy | 0:d383e2dee0f7 | 43 | // Calculate distance (duration of the signal * constant used in datasheet) |
ommpy | 0:d383e2dee0f7 | 44 | distance = timer.read() * 1e6 / 58; |
ommpy | 0:d383e2dee0f7 | 45 | |
ommpy | 0:d383e2dee0f7 | 46 | // Set distance to the minimum if it's lower |
ommpy | 0:d383e2dee0f7 | 47 | if (distance < minDistance) |
ommpy | 0:d383e2dee0f7 | 48 | distance = minDistance; |
ommpy | 0:d383e2dee0f7 | 49 | |
ommpy | 0:d383e2dee0f7 | 50 | // Set distance to the maximum if it's higher |
ommpy | 0:d383e2dee0f7 | 51 | if (distance > maxDistance) |
ommpy | 0:d383e2dee0f7 | 52 | distance = maxDistance; |
ommpy | 0:d383e2dee0f7 | 53 | } |
ommpy | 0:d383e2dee0f7 | 54 | |
ommpy | 0:d383e2dee0f7 | 55 | // Indicate that new data is ready |
ommpy | 0:d383e2dee0f7 | 56 | newDataReady = true; |
ommpy | 0:d383e2dee0f7 | 57 | } |
ommpy | 0:d383e2dee0f7 | 58 | } |
ommpy | 0:d383e2dee0f7 | 59 | |
ommpy | 0:d383e2dee0f7 | 60 | void JSN_SR04::stopTimer() { |
ommpy | 0:d383e2dee0f7 | 61 | // Stop the timer |
ommpy | 0:d383e2dee0f7 | 62 | timer.stop(); |
ommpy | 0:d383e2dee0f7 | 63 | |
ommpy | 0:d383e2dee0f7 | 64 | // Call the calculation function |
ommpy | 0:d383e2dee0f7 | 65 | calculateDistance(); |
ommpy | 0:d383e2dee0f7 | 66 | |
ommpy | 0:d383e2dee0f7 | 67 | // Reset the timer |
ommpy | 0:d383e2dee0f7 | 68 | timer.reset(); |
ommpy | 0:d383e2dee0f7 | 69 | timerStarted = false; |
ommpy | 0:d383e2dee0f7 | 70 | |
ommpy | 0:d383e2dee0f7 | 71 | // Switch off the timeout timer event |
ommpy | 0:d383e2dee0f7 | 72 | echoTimeout.detach(); |
ommpy | 0:d383e2dee0f7 | 73 | echo.fall(NULL); |
ommpy | 0:d383e2dee0f7 | 74 | } |
ommpy | 0:d383e2dee0f7 | 75 | |
ommpy | 0:d383e2dee0f7 | 76 | void JSN_SR04::turnOffTrigger() { |
ommpy | 0:d383e2dee0f7 | 77 | // Switch off the trigger |
ommpy | 0:d383e2dee0f7 | 78 | trigger = 0; |
ommpy | 0:d383e2dee0f7 | 79 | } |
ommpy | 0:d383e2dee0f7 | 80 | |
ommpy | 0:d383e2dee0f7 | 81 | void JSN_SR04::startMeasurement() { |
ommpy | 0:d383e2dee0f7 | 82 | // Trigger the sensor (by a signal described in the datasheet) |
ommpy | 0:d383e2dee0f7 | 83 | trigger = 1; |
ommpy | 0:d383e2dee0f7 | 84 | triggerTimeout.attach_us(this, &JSN_SR04::turnOffTrigger, 10); |
ommpy | 0:d383e2dee0f7 | 85 | |
ommpy | 0:d383e2dee0f7 | 86 | // Start to measure a response |
ommpy | 0:d383e2dee0f7 | 87 | echo.rise(this, &JSN_SR04::startTimer); |
ommpy | 0:d383e2dee0f7 | 88 | |
ommpy | 0:d383e2dee0f7 | 89 | // Outdate current response |
ommpy | 0:d383e2dee0f7 | 90 | newDataReady = false; |
ommpy | 0:d383e2dee0f7 | 91 | } |
ommpy | 0:d383e2dee0f7 | 92 | |
ommpy | 0:d383e2dee0f7 | 93 | float JSN_SR04::getDistance_cm() { |
ommpy | 0:d383e2dee0f7 | 94 | // Indicate that the data was read |
ommpy | 0:d383e2dee0f7 | 95 | newDataReady = false; |
ommpy | 0:d383e2dee0f7 | 96 | |
ommpy | 0:d383e2dee0f7 | 97 | // Return the data |
ommpy | 0:d383e2dee0f7 | 98 | return distance; |
ommpy | 0:d383e2dee0f7 | 99 | } |
ommpy | 0:d383e2dee0f7 | 100 | |
ommpy | 0:d383e2dee0f7 | 101 | float JSN_SR04::getDistance_mm() { |
ommpy | 0:d383e2dee0f7 | 102 | // Indicate that the data was read |
ommpy | 0:d383e2dee0f7 | 103 | newDataReady = false; |
ommpy | 0:d383e2dee0f7 | 104 | |
ommpy | 0:d383e2dee0f7 | 105 | // Return the data |
ommpy | 0:d383e2dee0f7 | 106 | if (distance != -1) |
ommpy | 0:d383e2dee0f7 | 107 | return distance * 10; |
ommpy | 0:d383e2dee0f7 | 108 | |
ommpy | 0:d383e2dee0f7 | 109 | else return distance; |
ommpy | 0:d383e2dee0f7 | 110 | } |
ommpy | 0:d383e2dee0f7 | 111 | |
ommpy | 0:d383e2dee0f7 | 112 | bool JSN_SR04::isNewDataReady() { |
ommpy | 0:d383e2dee0f7 | 113 | // Return the indicator |
ommpy | 0:d383e2dee0f7 | 114 | return newDataReady; |
ommpy | 0:d383e2dee0f7 | 115 | } |
ommpy | 0:d383e2dee0f7 | 116 | |
ommpy | 0:d383e2dee0f7 | 117 | void JSN_SR04::setRanges(float minRange, float maxRange) { |
ommpy | 0:d383e2dee0f7 | 118 | // Set new boundaries that are in range of a sensors reading ability (datasheet) |
ommpy | 0:d383e2dee0f7 | 119 | if (minRange < maxRange) { |
ommpy | 0:d383e2dee0f7 | 120 | if (minRange >= 2 && minRange < 400) // bug from revs. 4 and 5 corrected |
ommpy | 0:d383e2dee0f7 | 121 | minDistance = minRange; |
ommpy | 0:d383e2dee0f7 | 122 | if (maxRange <= 400) |
ommpy | 0:d383e2dee0f7 | 123 | maxDistance = maxRange; |
ommpy | 0:d383e2dee0f7 | 124 | } |
ommpy | 0:d383e2dee0f7 | 125 | } |
ommpy | 0:d383e2dee0f7 | 126 | |
ommpy | 0:d383e2dee0f7 | 127 | float JSN_SR04::getMinRange() { |
ommpy | 0:d383e2dee0f7 | 128 | // Return a lower boundary |
ommpy | 0:d383e2dee0f7 | 129 | return minDistance; |
ommpy | 0:d383e2dee0f7 | 130 | } |
ommpy | 0:d383e2dee0f7 | 131 | |
ommpy | 0:d383e2dee0f7 | 132 | float JSN_SR04::getMaxRange() { |
ommpy | 0:d383e2dee0f7 | 133 | // Return an upper boundary |
ommpy | 0:d383e2dee0f7 | 134 | return maxDistance; |
ommpy | 0:d383e2dee0f7 | 135 | } |