// ----------------------------------------------------------------------------- // HC-SR04 Ultrasonic sensor // Copyright (C) 2018 by Xose PĂ©rez // ----------------------------------------------------------------------------- #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