test

Dependencies:   mbed Watchdog

Dependents:   STM32-MC_node

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?

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