Neben den elektrotechnischen Fehlerquellen kann ich mir auch noch eine messtechnische vorstellen:
Es gibt 2 Messmethoden
Methode 1:
Die Dauer des Echopulses wird gemessen (Methode, die das Datenblatt vorschlägt).
Methode 2:
Zeit, die vergeht, bis der Sensor nach Triggerung einen Echo-Puls sendet, wird gemessen.

Ich sebst besitze keinen dieser Sensoren, also kann ich das nicht testen.
Ich hab mal einen Arduino-Testprogramm vorbereitet, das beide Methoden verwendet.
Das Ergebnis könnte aufschlussreich sein.

Code:
// Ultraschall-Test
// testet die Genauigkeit eines hc-sr04 Ultraschallsensors
// mit 2 Messmethoden:
//   1. measureAirTime
//      Zeit, die vergeht, bis der Sensor nach Triggerung
//      einen Echo-Puls sendet, wird gemessen.
//   2. measurePulseTime
//      Die Dauer des Echo-Pulses wird gemessen.
//
// Datenblatt:
// https://docs.google.com/document/d/1Y-yZnNhMYy7rwhAgyL_pfa39RsB-x2qR4vP8saG73rE/edit?pli=1
//
// Sisor, 23.08.2014

#define PIN_TRIG 8 // Hier Anschluss-Pins definieren
#define PIN_ECHO 9

void trigger() {
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10); // 10 µs Triggerzeit (siehe Datenblatt)
  digitalWrite(PIN_TRIG, LOW);
}

long measureAirTime() {
  unsigned long now;
  now = micros();
  trigger();
  while(digitalRead(PIN_ECHO) == LOW);
  return micros() - now;
}

long measurePulseTime() {
  // muss sofort nach measureAirTime() 
  // ausgeführt werden!!!
  unsigned long now;
  now = micros();
  while(digitalRead(PIN_ECHO) == HIGH);
  return micros() - now;
}

void printResult(unsigned long airMicros, unsigned long pulseMicros) {
  Serial.print("measured air time  : " );
  Serial.print(airMicros );
  Serial.println(" us");
  
  Serial.print("measured pulse time: " );
  Serial.print(pulseMicros );
  Serial.println(" us");
  
  Serial.println("---");
}

void setup() {
  pinMode(PIN_TRIG, OUTPUT);
  digitalWrite(PIN_TRIG, LOW);
  pinMode(PIN_ECHO, INPUT);
  Serial.begin(57600);
}

void loop() {
  unsigned long airMicros, pulseMicros;
  
  // Messung durchführen
  airMicros   = measureAirTime();
  pulseMicros = measurePulseTime();
  
  // Ausgabe über Serial-Monitor
  printResult(airMicros, pulseMicros);
  
  delay(100);
}