@@ -320,8 +320,10 @@ bool HCSR04SensorManager::collectSensorResult(uint8_t sensorId) {
320320 }
321321 sensor->rawDistance = dist;
322322 sensor->median ->addValue (dist);
323- sensorValues[sensorId] =
324- sensor->distance = correctSensorOffset (medianMeasure (sensor, dist), sensor->offset );
323+ uint16_t distance = medianMeasure (sensor, dist);
324+ if (MAX_SAMPLE_DISTANCE_DEVIATION > range (sensor->distances , MEDIAN_DISTANCE_MEASURES))
325+ sensorValues[sensorId] =
326+ sensor->distance = correctSensorOffset (distance, sensor->offset );
325327
326328 log_v (" Raw sensor[%d] distance read %03u / %03u (%03u, %03u, %03u) -> *%03ucm*, duration: %zu us - echo pin state: %d" ,
327329 sensorId, sensor->rawDistance , dist, sensor->distances [0 ], sensor->distances [1 ],
@@ -472,3 +474,18 @@ uint16_t HCSR04SensorManager::median(uint16_t a, uint16_t b, uint16_t c) {
472474 }
473475 return c;
474476}
477+
478+
479+ uint16_t HCSR04SensorManager::range (uint16_t values[], uint16_t size) {
480+ uint16_t minval = values[0 ];
481+ uint16_t maxval = values[0 ];
482+ for (uint16_t i = 1 ; i<size; ++i) {
483+ if (values[i]<minval) {
484+ minval = values[i];
485+ }
486+ if (values[i] > maxval) {
487+ maxval = values[i];
488+ }
489+ }
490+ return maxval - minval;
491+ }
0 commit comments