Die Dinger liefern immer dann ne Null, wenn sie kein Echo bekommen- oder aber das Timeout von pulseIn()
Kein Echo bekommen sie z.B. dann schon mal, wenn das Hindernis in nem Winkel >45 Grad zum Sensor steht- dann wird der Schall nämlich eher weg-reflektiert.
Auch kleinere Gegenstände werfen nicht immer ein Echo zurück- Schallwellen sind relativ lang...jeder Mist reflektiert die nicht (bzw. nicht ausreichend)- gerade von den China-Nachbauten der HC-SR04 darf man keine Wunder erwarten.
Hier hilft nur einzeln ausprobieren- manche arbeiten richtig gut, andere dagegen erbärmlich schlecht.
Ganz doof ist es auch, solche Sensoren akustisch zu koppeln, dann kann es gut sein, dass der eine den anderen hört.
Heisskleber könnte funktionieren, muss aber nicht.
Einige Störungen kann man unterdrücken, indem man mit dem einlesen des Echos eine gewisse Mindestzeit wartet (dann kommt man natürlich mit der Entfernungsmessung nicht auf Null runter, aber oft braucht man das ja auch gar nicht). Wie lange, kann man berechnen.
Du wirst, gerade mit den einfachen SR04 immer wieder mal Fehlmessungen bekommen.
Der Weg damit zurecht zu kommen ist, die Signale zu plausibilisieren, also zu überprüfen, ob das sein kann, was der Sensor ausgiebt.
Wenn du z.B. alle 100ms misst, und die Signalfolge "... ,80cm, 75cm, 70cm, 0cm, 60cm, ..." bekommst, dann kannst du logisch erkennen, dass die Messung mit 0cm nicht stimmen kann.
Du müßtest festlegen, wie schnell sich die Entfernungen in deinem System maximal ändern können und entsprechend Grenzen für die Signalgültigkeit festlegen. Ggf ist die Reaktionsgeschwindigkeit ein Maß.
wenn z.B. ein schneller Ball geflogen kommt, mag die Annäherungsgeschwindigkeit sehr hoch sein, aber selbst wenn deine Elektronik rechtzeitig reagiert, kann der Mensch im System das nicht.
Wo begrenze ich denn dann am besten die Zeit? Stehe etwas auf dem Schlauch gerade.
Die_Mauer02:
Wo begrenze ich denn dann am besten die Zeit? Stehe etwas auf dem Schlauch gerade.
Welche Zeit?
Denk erst mal nicht in Code, sondern einfach in Logik:
Dein Objekt bewegt sich mit einer maximalen Geschwindigkeit. Also kann sich die Entfernung zwischen 2 Abtastungen nur um x cm ändern. Wenn also der neue Messwert um mehr als x cm vom alten abweicht, müßte er ungültig sein.
Das könnte als code so aussehen:
const int maxdelta = 20; // maximale Änderung der Entfernung zwischen zwei Abtastungen [cm]
if (neuwert - altwert < maxdelta) { // Messwerte mit zu grosser Abweichung werden ignoriert
Auswertung();
}
Wenn also der neue Messwert um mehr als x cm vom alten abweicht, müsste er ungültig sein
Der neue oder der alte?
Um Ausreißer zu erkennen, braucht man mindestens 3 Messungen ...
In der Praxis kann man schneller messen als Warn-Piepser ausgeben,
das ist also kein Problem, sondern nur mühsam.