Hope you guys are doing well into COVID-19.
We are using Ultrasonic Sensor HC SR04 with ESP32-WROVER-I module to measure object distance. We have ported with ESP32 IDF 3.2 Stable Release and it works fine into normal condition.
But when we run test continuously at every 2[*]0 msec interval to measure distance then sometimes we are getting distance value as 10 or 15 or something like lower values even there is no any object placed.
Code: Select all
#define ULTRASONIC_OUTPUT_GPIO GPIO02
#define ULTRASONIC_INPUT_GPIO GPIO36
#define PORT_ENTER_CRITICAL portENTER_CRITICAL(&mux)
#define PORT_EXIT_CRITICAL portEXIT_CRITICAL(&mux)
#define timeout_expired(start, len) ((esp_timer_get_time() - (start)) >= (len))
#define PING_TIMEOUT 6000
#define ROUNDTRIP 58
#define ULTRASONIC_POLL_DELAY 5
float cm = 0;
PORT_ENTER_CRITICAL;
gw_gpio_level_set(ULTRASONIC_OUTPUT_GPIO, LOW);
ets_delay_us(2);
gw_gpio_level_set(ULTRASONIC_OUTPUT_GPIO, HIGH);
ets_delay_us(10);
gw_gpio_level_set(ULTRASONIC_OUTPUT_GPIO, LOW);
// Wait for echo
int64_t start = esp_timer_get_time();
while (!gpio_get_level(ULTRASONIC_INPUT_GPIO)) {
if (timeout_expired(start, PING_TIMEOUT)) {
PORT_EXIT_CRITICAL;
return cm;
}
}
// got echo, measuring
int64_t echo_start = esp_timer_get_time();
int64_t time = echo_start;
int64_t meas_timeout = echo_start + 500 * ROUNDTRIP;
while (gpio_get_level(ULTRASONIC_INPUT_GPIO)) {
time = esp_timer_get_time();
if (timeout_expired(echo_start, meas_timeout)) {
PORT_EXIT_CRITICAL;
return cm;
}
}
PORT_EXIT_CRITICAL;
cm = (time - echo_start) / ROUNDTRIP;
DEBUG_LOGI(UART, REST_TAG, "Distance %f cm", cm);
Let me know if need anything else from my end