//
// Global Constants
//
constexpr byte TRIG_PIN {7};
constexpr byte ECHO_PIN {8};
constexpr byte LED_PINS[]{13,4};
constexpr byte HYSTERESIS {1}; // in Inch!
constexpr unsigned long ACTIVITY_INTERVAL = 10000;
//
// Helper class for time operations
//
class Timer {
public:
void start() { timeStamp = millis(); }
bool operator()(const unsigned long duration) const { return (millis() - timeStamp >= duration) ? true : false; }
private:
unsigned long timeStamp {0};
};
//
// Global variables/objects
//
Timer wait;
//
// Functions
//
int microsecondsToInches(unsigned long microseconds) {
return microseconds / 148;
}
int microsecondsToCentimeters(unsigned long microseconds) {
return microseconds / 58;
}
unsigned long checkDuration(byte tPin, byte ePin) {
digitalWrite(tPin, LOW);
delayMicroseconds(2);
digitalWrite(tPin, HIGH);
delayMicroseconds(10);
digitalWrite(tPin, LOW);
return pulseIn(ePin, HIGH);
}
void distanceIndicator(byte leds[], int distInches) {
switch(distInches) {
case 0 ... 109:
digitalWrite(leds[0],LOW);
digitalWrite(leds[1],HIGH);
break;
case 110 ... 199:
digitalWrite(leds[0],HIGH);
digitalWrite(leds[1],LOW);
break;
default:
digitalWrite(leds[0],LOW);
digitalWrite(leds[1],LOW);
}
}
template <size_t N> void indicatorsOff(const byte (&led_pins)[N]) {
for (auto &ledPin : LED_PINS) { digitalWrite(ledPin,LOW); }
}
//
// Main program
//
void setup() {
Serial.begin(15200);
pinMode(TRIG_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT);
for (auto &ledPin : LED_PINS) { pinMode(ledPin, OUTPUT); }
}
void loop() {
static int prevInches {0};
static bool isSwitchedOff {false};
unsigned long duration {checkDuration(TRIG_PIN, ECHO_PIN)};
int inches {microsecondsToInches(duration)};
// unsigned int cm {microsecondsToCentimeters(duration)};
if(abs(prevInches - inches) > HYSTERESIS){
prevInches = inches;
distanceIndicator(LED_PINS, inches);
wait.start();
isSwitchedOff = false;
Serial.print(inches);
Serial.println("inch, ");
}
// Switch off LEDs if no movement is detected for a specified period of time.
if (true == wait(ACTIVITY_INTERVAL) && false == isSwitchedOff) {
indicatorsOff(LED_PINS);
isSwitchedOff = true;
Serial.println("Switch off");
}
}
Click on the distance sensor
and use the slider bar
to change the measured distance.