16#ifndef MINIR4_Grove_US_H
17#define MINIR4_Grove_US_H
24#ifdef ARDUINO_ARCH_STM32F4
26static uint32_t MicrosDiff(uint32_t begin, uint32_t end) {
30static uint32_t pulseIn(uint32_t pin, uint32_t state, uint32_t timeout = 1000000 L) {
31 uint32_t begin = micros();
34 while (digitalRead(pin))
35 if (MicrosDiff(begin, micros()) >= timeout) {
40 while (!digitalRead(pin))
41 if (MicrosDiff(begin, micros()) >= timeout) {
44 uint32_t pulseBegin = micros();
47 while (digitalRead(pin))
48 if (MicrosDiff(begin, micros()) >= timeout) {
51 uint32_t pulseEnd = micros();
53 return MicrosDiff(pulseBegin, pulseEnd);
83 long RangeInCentimeters;
84 RangeInCentimeters = duration(timeout) / 29 / 2;
85 return RangeInCentimeters;
95 long RangeInMillimeters;
96 RangeInMillimeters = duration(timeout) * (10 / 2) / 29;
97 return RangeInMillimeters;
108 RangeInInches = duration(timeout) / 74 / 2;
109 return RangeInInches;
114 long duration(uint32_t timeout = 1000000L) {
115 pinMode(_pin, OUTPUT);
116 digitalWrite(_pin, LOW);
117 delayMicroseconds(2);
118 digitalWrite(_pin, HIGH);
119 delayMicroseconds(5);
120 digitalWrite(_pin, LOW);
121 pinMode(_pin, INPUT);
123 duration = pulseIn(_pin, HIGH, timeout);
A class for interfacing with Grove Ultrasonic Ranger.
long MeasureInCentimeters(uint32_t timeout=1000000L)
Measures the distance in centimeters.
long MeasureInMillimeters(uint32_t timeout=1000000L)
Measures the distance in millimeters.
long MeasureInInches(uint32_t timeout=1000000L)
Measures the distance in inches.