// -----------------------------------------------------------------------------
|
|
// HC-SR04 Ultrasonic sensor
|
|
// Copyright (C) 2018 by Xose Pérez <xose dot perez at gmail dot com>
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#if SENSOR_SUPPORT && HCSR04_SUPPORT
|
|
|
|
#pragma once
|
|
|
|
#include "Arduino.h"
|
|
#include "BaseSensor.h"
|
|
|
|
class HCSR04Sensor : public BaseSensor {
|
|
|
|
public:
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Public
|
|
// ---------------------------------------------------------------------
|
|
|
|
HCSR04Sensor(): BaseSensor() {
|
|
_count = 1;
|
|
_sensor_id = SENSOR_HCSR04_ID;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
void setEcho(unsigned char echo) {
|
|
_echo = echo;
|
|
}
|
|
|
|
void setTrigger(unsigned char trigger) {
|
|
_trigger = trigger;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
unsigned char getEcho() {
|
|
return _echo;
|
|
}
|
|
|
|
unsigned char getTrigger() {
|
|
return _trigger;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Sensor API
|
|
// ---------------------------------------------------------------------
|
|
|
|
// Initialization method, must be idempotent
|
|
void begin() {
|
|
pinMode(_echo, INPUT);
|
|
pinMode(_trigger, OUTPUT);
|
|
digitalWrite(_trigger, LOW);
|
|
_ready = true;
|
|
}
|
|
|
|
// Descriptive name of the sensor
|
|
String description() {
|
|
char buffer[24];
|
|
snprintf(buffer, sizeof(buffer), "HCSR04 @ GPIO(%u, %u)", _trigger, _echo);
|
|
return String(buffer);
|
|
}
|
|
|
|
// Descriptive name of the slot # index
|
|
String slot(unsigned char index) {
|
|
return description();
|
|
};
|
|
|
|
// Address of the sensor (it could be the GPIO or I2C address)
|
|
String address(unsigned char index) {
|
|
return String(_trigger);
|
|
}
|
|
|
|
// Type for slot # index
|
|
unsigned char type(unsigned char index) {
|
|
if (index == 0) return MAGNITUDE_DISTANCE;
|
|
return MAGNITUDE_NONE;
|
|
}
|
|
|
|
// Current value for slot # index
|
|
double value(unsigned char index) {
|
|
|
|
if (index == 0) {
|
|
|
|
// Trigger pulse
|
|
digitalWrite(_trigger, HIGH);
|
|
delayMicroseconds(10);
|
|
digitalWrite(_trigger, LOW);
|
|
|
|
// Wait for echo pulse low-high-low
|
|
while ( digitalRead(_echo) == 0 ) yield();
|
|
unsigned long start = micros();
|
|
while ( digitalRead(_echo) == 1 ) yield();
|
|
unsigned long travel_time = micros() - start;
|
|
|
|
// Assuming a speed of sound of 340m/s
|
|
// Dividing by 2 since it is a round trip
|
|
return 340.0 * (double) travel_time / 1000000.0 / 2;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
protected:
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Protected
|
|
// ---------------------------------------------------------------------
|
|
|
|
unsigned char _trigger;
|
|
unsigned char _echo;
|
|
|
|
};
|
|
|
|
#endif // SENSOR_SUPPORT && HCSR04_SUPPORT
|