HC-SR04 Temperatura/Humedad

Esa formula afecta la velocidad de sonido en diferentes ambientes.
Tu haces mediciones y durante las mediciones que cambia? La temperatura no cambia, la humedad tampoco.

Veamos.
He resumido un en Excel posibles variaciones.

Velociad de sonido: 331.4+(0.606Temperatura)+(0.0124Humedad)
Temperatura Humedad Sonido Var %
331,4 35 30 352,98 106,51
331,4 30 30 349,95 105,60
331,4 25 30 346,92 104,68
331,4 20 30 343,89 103,77
331,4 15 30 340,86 102,86
331,4 10 30 337,83 101,94
331,4 5 30 334,80 101,03
331,4 0 30 331,77 100,11
331,4 -5 30 328,74 99,20
331,4 -10 30 325,71 98,28
331,4 25 80 347,54 104,87
331,4 25 70 347,42 104,83
331,4 25 60 347,29 104,80
331,4 25 50 347,17 104,76
331,4 25 40 347,05 104,72
331,4 25 30 346,92 104,68
331,4 25 20 346,80 104,65
331,4 25 10 346,67 104,61
331,4 25 0 346,55 104,57

En los casos mas extremos hay un 5% hacia arriba o hacia abajo en las lecturas.
O sea.. tus mediciones podrian ser corregidas a lo largo de los dias cuando las condiciones ambientales cambien y la lectura del sensor este afectada por dichos cambios.

Ahora dime, donde estas midiendo con el sensor ultrasónico como para prestarle atención a esto? Acaso tienes cambios de temperatura en tu casa debido a un aire acondicionado o humidificador?

EDITO 1:
Te completo la información con esta nota.

Encontré una tema similar al tuyo donde se muestra tu problema.

Resumiendo la nota se expresa que las posibles fallas se deben a que las lecturas que ese tema se hacen usan pulseIn y que claramente no es preciso.
Sugieren usar interrupciones con algun pin dedicado a un TIMER como el 1.

Edito 2: Encontré este tutorial de cómo mejorar las lecturas del sensor

Basadas precisamente en pulsein

digitalWrite(trigPin, LOW);//setting trigger pin in LOW state
  delayMicroseconds(5);      //for 5 microseconds
 
  digitalWrite(trigPin, HIGH);  //setting trigger pin in HIGH state
  delayMicroseconds(10);       //for 10 microsecond and emits 8pulses from the transmitter and bounces back onces hit by an object
  digitalWrite(trigPin, LOW);  //after recieving the signal,setting the trigger pin to LOW state
 
  duration = pulseIn(echoPin, HIGH); //duration is a variable that starts timing once echo pin is high by using  arduino  function pulseIn()
 
  float temperature = dht.readTemperature();// temperature is the variable use to store the value of current temperature which sensors detects
 
   speedofsound = 331.3+(0.606*temperature);// Calculate speed of sound by using the given formula in m/s:
   distance = duration*(speedofsound/10000)/2; // Calculate the distance 

Supongamos que la medida sea sobre supuestos 40 cm exactos.
Aca con el excel calculé los errores que tienes

image