I'm experimenting with an HC-SR04 sonar sensor. Basically I'm measuring the distance to a cardboard box twice a second with these lines of code running on an ESP32:

unsigned long sonarMeasure() {
    digitalWrite(TRIGGER, HIGH);
    digitalWrite(TRIGGER, LOW);
    return pulseIn(ECHO, HIGH);

double distance = duration * 0.03455;

The results are a bit strange. I know, that I can't expect millimeter accuracy. But why are there rather discrete jumps of about 4 mm? And when looking closer, there is another frequent jump of <1mm:

measured distances

(As far as I can tell, the jumps increase at larger distances.)

Is this an issue of how I read the sensor on the ESP32, or is it something happening internally on the HC-SR04?

I'd love to understand the reason for this effect to be able to improve the accuracy of my measurements.

  • And how exactly are you calculating the distance?
    – gre_gor
    Feb 16, 2018 at 17:54
  • @gre_gor: double distance = duration * 0.03455 (I'll add it to my question.)
    – Falko
    Feb 16, 2018 at 20:07

1 Answer 1


I think it's from the HC-SR04... it uses echos and it seems your bad readings are some kind of echo reflections.

What you should do is either remove the bad readings, or take the average/most common value of the last x readings.

Or throw away values too far off some default (like the last average) and average the rest.

  • Sure, I could implement some kind of filter. But actually I want to use it on a moving platform, so I can't repeat any measurement.
    – Falko
    Feb 16, 2018 at 20:11
  • 2
    No, the spacing is much to small to be multiple reflections. For that to occur, you'd be seeing multiples of the base reading, rather than a distribution around a basic value. Feb 16, 2018 at 21:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.