Kategorien
Python

Raspberry Pi – Python – (HC-SR04) Ultraschall Abstandsmessung – fehlerhafte Ergebnisse durch Statistik in den Griff bekommen – Teil1

Ausgangszustand:

Nach folgender Anleitung Entfernung messen mit Ultraschallsensor HC-SR04 habe ich relativ schnell einen HC-SR04 Ultraschall Entfernungs Sensor zum laufen gebracht und in meinem Brunnen installiert.
Der Brunnen ist nur ca. 4,5 Meter tief und wird zusätzlich über eine Drainage (Entwässerung Einfahrt, Hof) gespeist, was bedeutet, dass der Wasserspiegel bei Regen kurzfristig ansteigt.

Die Pumpe ist im Brunnen angebracht und sollte möglichst trocken bleiben.
Eine Anzeige wie hoch das Wasser steht ist dementsprechend sinnvoll.
Der Abstand zum Wasserspiegel beträgt je nach Wetterlage bis zu 3,5 Meter.
Es zeigte sich relativ schnell, dass die Messergebnisse stark schwanken.
Da der Sensor ca. 10 Meter von der Raspberry Pi angebracht ist, habe ich einen Digital Level Converter zwischen geschaltet, um diesen sauber mit 5 Volt ansteuern zu können.
An der Schwankung der Messergebnisse änderte das nichts.

Mir ist aufgefallen, dass die Messwerte genauer sind, sobald der Brunnendeckel offen ist, wodurch

  • die Luftfeuchtigkeit sinkt
  • die Reflexion des Schalls sich verändern könnte

Suche im Internet

Ein Blick auf die Messergebnisse

Einzelwert1 = 117.4 cm
Einzelwert2 = 186.5 cm
Einzelwert3 = 118.0 cm
Einzelwert4 = 120.9 cm
Einzelwert5 = 121.3 cm
Einzelwert6 = 189.0 cm
Einzelwert7 = 118.1 cm
Einzelwert8 = 122.9 cm
Einzelwert9 = 188.1 cm

Die Grün dargestellten Werte zeigen den tatsächlichen Abstand, welchen ich auch mit dem Zollstock gemessen habe.
Zwei Drittel der Messwerte sind unbrauchbar.
Der Durchschitt über diese Werte liegt bei 142,47 cm, was immer noch über 40 cm am Ziel vorbei ist. Selten kommt es auch vor, dass es extreme Sprünge in Richtung 2 oder 2,5 Meter gibt.
Ich habe mich entschieden, jeweils 11 Werte hintereinander zu messen, diese nach Größe zu ordnen und den zweitgrößten Wert in eine Datenbank zu übernehmen.
Dies erfolgt alle 10 Minuten.
Jede volle Stunde hat eine extra Zeile in der Tabelle mit dem kleinsten gemessenen Wert und den größten gemessenen Wert innerhalb einer Stunde.

import time
import numpy as np
 
def LeseWasserstandBrunnen():
    #Liefert den zweitgroessten Wert einer Messreihe aus 11 Werten zurück
    abstand = []
    for i in range(0, 11):
        abstand.append(distanz()) #Die Funktion distanz() 
                                  #liefert einen Messwert vom HC-SR04 
        time.sleep(0.1)
 
    abstand = np.sort(abstand)
 
    return "%.2f" % float(abstand[len(abstand) -2])

Die folgenden Grafiken zeigen Oben die Übernahme der Messwerte ohne Gewichtung und Unten Messwerte, bei denen ich den zweitgrößten Werte einer Serie angenommen habe.
Blau = minimal; Grün = maximal;

Dartellung_Messwerte_1
Dartellung_Messwerte_2

Beim betrachten des unteren Diagramms fällt auf, dass die Minimalwerte pro Stunde fast durchgehend genau sind.
Da ich die weiß, dass die Ausreiser nach oben und unten Messfehler sind, kann ich das Ergebnis der Tagesdarstellung auch recht gut bewerten.

Jetzt will ich diese Stundenwerte zu einem einzigen Tageswert konsolidieren, um so einen Zeitabschnitt von einem Monat darstellen zu können.
Da sollten dann auch Schwankungen des Wasserstands gut erkennbar sein.
Die ‚Blauen‘, also die Minimalen Stundenwerte erscheinen geeignet, aber ein Durchschnitt der Werte dann doch eher nicht.

Nach ein wenig suchen habe ich bei Youtube folgendes Video gefunden:

Der Zentralwert scheint für meine Ausreiser in den Minimalwerten der richtige Ansatz zu sein.

Von Henry Koch

take a look at: http://www.henrykoch.de/privat.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.