test

Dependencies:   mbed Watchdog

Dependents:   STM32-MC_node

JSN_SR04/JSN_SR04.cpp

Committer:
ommpy
Date:
2020-07-06
Revision:
0:d383e2dee0f7
Child:
4:f6e22dd39313

File content as of revision 0:d383e2dee0f7:

#include "mbed.h"
#include "JSN_SR04.h"

JSN_SR04::JSN_SR04(PinName echoPin, PinName triggerPin) : echo(echoPin), trigger(triggerPin) {
    init();
}

void JSN_SR04::init() {
    distance = -1;										// Default distance
    minDistance = 2;										// Default min boundary
    maxDistance = 400;									// Default max boundary
    newDataReady = timerStarted = false;			// Indicators are false by default
}

void JSN_SR04::startTimer() {
	// Check if the timer started
   if (!timerStarted) {
		 // start the timer
       timer.start();
       timerStarted = true;

		 // Call the stopTimer() method after a predefined timeout (> 25 ms signal duration indicates that there is no obstacle)
       echoTimeout.attach_us(this, &JSN_SR04::stopTimer, SENSOR_TIMEOUT);

		 // Stop measurement and
       echo.fall(this, &JSN_SR04::stopTimer);
       echo.rise(NULL);
    }
}

void JSN_SR04::calculateDistance() {
	int timer_state;		// Current timer state (ticks amount)

	// Check if timer was even started
	if (timerStarted) {
		timer_state = timer.read();

		// If timeout occured (no obstacle)
		if (timer_state >= SENSOR_TIMEOUT) distance = -1;

		// If there is no timeout (an obstacle detected)
		else {
			// Calculate distance (duration of the signal * constant used in datasheet)
			distance = timer.read() * 1e6 / 58;

			// Set distance to the minimum if it's lower
			if (distance < minDistance)
				distance = minDistance;

				// Set distance to the maximum if it's higher
			if (distance > maxDistance)
				distance = maxDistance;
		}

		// Indicate that new data is ready
		newDataReady = true;
	 }
}

void JSN_SR04::stopTimer() {
	// Stop the timer
   timer.stop();

	// Call the calculation function
	calculateDistance();

	// Reset the timer
   timer.reset();
   timerStarted = false;

	// Switch off the timeout timer event
   echoTimeout.detach();
   echo.fall(NULL);
}

void JSN_SR04::turnOffTrigger() {
	// Switch off the trigger
   trigger = 0;
}

void JSN_SR04::startMeasurement() {
	// Trigger the sensor (by a signal described in the datasheet)
   trigger = 1;
   triggerTimeout.attach_us(this, &JSN_SR04::turnOffTrigger, 10);

	// Start to measure a response
   echo.rise(this, &JSN_SR04::startTimer);

	// Outdate current response
   newDataReady = false;
}

float JSN_SR04::getDistance_cm() {
	// Indicate that the data was read
   newDataReady = false;

	// Return the data
   return distance;
}

float JSN_SR04::getDistance_mm() {
	// Indicate that the data was read
   newDataReady = false;

	// Return the data
	if (distance != -1)
		return distance * 10;

	else return distance;
}

bool JSN_SR04::isNewDataReady() {
	// Return the indicator
   return newDataReady;
}

void JSN_SR04::setRanges(float minRange, float maxRange) {
	// Set new boundaries that are in range of a sensors reading ability (datasheet)
    if (minRange < maxRange) {
        if (minRange >= 2 && minRange < 400) // bug from revs. 4 and 5 corrected
            minDistance = minRange;
        if (maxRange <= 400)
            maxDistance = maxRange;
    }
}

float JSN_SR04::getMinRange() {
	// Return a lower boundary
   return minDistance;
}

float JSN_SR04::getMaxRange() {
	// Return an upper boundary
   return maxDistance;
}