Entfernungsmessung mit HC-SR04 | Probleme draußen

Servus Community,

ich bin erst seit wenigen Tagen dabei und wollte die Entfernung mit einem Ultraschallsensor messen. Wenn die Entfernung unterschritten wird, soll eine Messung stattfinden (bspw. Fußgänger oder Fahrzeuge).
In der Wohnung funktioniert das super! Draußen habe ich extreme Schwankungen was die Entfernung angeht. Das führt dazu, dass die Messung gestartet wird obwohl gar nichts passiert ist.

In folgendem Screenshot habe ich draußen auf eine Wand gezielt und bekomme folgende Ergebnisse in cm siehe Anhang. Es pendelt um 370cm und dann ein plötzlicher Einbruch auf 113cm. Wie gesagt es ist nichts passiert.

Hat jemand Erfahrung mit dem Einsatz von US und kann helfen? Zu große Entfernungen könnte man bspw. mit dem Timout am PulseIn rausfiltern aber zu kleine Messungen. Hm.

Beste Grüße aus Berlin!

Edit:

#define trigPin 10
#define echoPin 11
float t1 = 0; 
float t2 = 0;
float deltat = 0;
int counter = 0; 
float l = 2;
float v = 0;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  float duration, distance;
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) * 0.0344;
  
Serial.println (distance);

if (distance < 300 && counter == 0){
        Serial.println("KFZ erkannt - Messung startet!");
        t1 = micros();
        counter = counter + 1;
        delay(100);

if (distance >=100 && counter > 0) {

        Serial.println("Messung beendet!");
        t2 = micros();
        deltat = (t2 - t1) / 1000000 ;
        Serial.println(deltat);
        v = l / deltat;
        Serial.print(v);
        Serial.println("m/s"); 
        v = v * 3,6;
        Serial.print(v);
        Serial.println("km/h");   

        counter = 0;                  
        delay(100);
  }
  delay(100);
}

problem1.JPG

Stephan_Berlin:
...Das führt dazu, dass die Messung gestartet wird obwohl gar nichts passiert ist.

Da wir deinen Sketch nicht kennen, wissen wir leider auch nicht, was du falsch machst.

Im übrigen, wenn der Sketch richtig ist, wird di Messung ständig (mit def. Pausen) durchgeführt.
Die musst du nicht erst starten.

Also um helfen zu können, zeige uns deinen Sketch.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Okay hab das mal ergänzt. Der Code ist noch total schlam*** geschrieben. Ich würde auch gerne später ein paar Variablen über C# + Oberfläche schreiben können etc.
An und für sich funktioniert das Ganze für die Messung in der Wohnung. Nur draußen scheint mir irgendwas in ungenauen Abständen einen Strich durch die Rechnung zu machen.

Das Problem tritt ja nicht in den 2 If-Anwendungen auf sondern bereits oben bei der Ausgabe der Distanz. Evtl. hab ich nen Sensor mit nem Schuss?

Stephan_Berlin:
Okay hab das mal ergänzt. Der Code ist noch total schlam*** geschrieben. Ich würde auch gerne später ein paar Variablen über C# + Oberfläche schreiben können etc.
An und für sich funktioniert das Ganze für die Messung in der Wohnung. Nur draußen scheint mir irgendwas in ungenauen Abständen einen Strich durch die Rechnung zu machen.

Das Problem tritt ja nicht in den 2 If-Anwendungen auf sondern bereits oben bei der Ausgabe der Distanz. Evtl. hab ich nen Sensor mit nem Schuss?

Das Problem kann an vielen Dingen liegen.

  1. unsaubere Betriebsspannung
  2. Störungen durch äußere Einflüsse
  3. Schlechte Verbindungen der einzelnen Baugruppen.
    usw.

Was du allerdings mit C# willst, würde mich interessieren.
Evtl. meinst du C++ ?
Und was du mit Oberfläche meinst auch.

HotSystems:
Das Problem kann an vielen Dingen liegen.

  1. unsaubere Betriebsspannung
  2. Störungen durch äußere Einflüsse
  3. Schlechte Verbindungen der einzelnen Baugruppen.
    usw.

Was du allerdings mit C# willst, würde mich interessieren.
Evtl. meinst du C++ ?
Und was du mit Oberfläche meinst auch.

  1. Schließe ich fast aus, da es in den eigenen 4 Wänden funktioniert.
  2. Kommt am ehesten in Frage. Aber welche Störungen könnten das sein und wie kann man diesen entgegenwirken? Kann es sein, dass der Schall im freien Wild durch die Gegend bounced und zu unerwarteten Zeiten wieder auf den Sensor trifft? Eher unwahrscheinlich aber ...
  3. Verbindungen werde ich nochmal prüfen und "fixieren". War gestern auch sehr windig draußen.

Ich würde gerne die Geschwindigkeit von Fahrzeugen bzw. einem bestimmten Fahrzeug messen. Dafür brauche ich bspw. dessen Länge. Wenn ein anderes Fahrzeug gemessen werden soll, muss diese veränderlich sein. Am liebsten wäre mir dafür eine schicke Windows Forms Oberfläche über die ich die Variablen konfigurieren kann, Messergebnisse speichern kann etc. pp. Ich finde C# schöner als C++ und Oberflächen mit C++ lieber nicht :wink:

Stephan_Berlin:
Ich würde gerne die Geschwindigkeit von Fahrzeugen bzw. einem bestimmten Fahrzeug messen. Dafür brauche ich bspw. dessen Länge. Wenn ein anderes Fahrzeug gemessen werden soll, muss diese veränderlich sein. Am liebsten wäre mir dafür eine schicke Windows Forms Oberfläche über die ich die Variablen konfigurieren kann, Messergebnisse speichern kann etc. pp. Ich finde C# schöner als C++ und Oberflächen mit C++ lieber nicht :wink:

Ich befürchte fast, dass du da mit Ultraschall nichts wirst. Zumindest die billigen Dinger sind dafür nicht geeignet.
Allerdings habe ich nur schlechte Erfahrungen damit gemacht. Wind und Regen haben die Messung beeinflusst.

Was deine Oberfläche betrifft, ist da ja ein eigenes Thema und nicht direkt mit Arduino lösbar.
Da musst du die Info erst seriell in den PC übertragen und dann visualisieren. Da kannst du natürlich ein Sprache deiner Wahl nehmen.

HotSystems:
Ich befürchte fast, dass du da mit Ultraschall nichts wirst. Zumindest die billigen Dinger sind dafür nicht geeignet.
Allerdings habe ich nur schlechte Erfahrungen damit gemacht. Wind und Regen haben die Messung beeinflusst.

Hm. Das wollte ich jetzt eigentlich nicht hören :confused: Nehmen wir mal an der Abstand zu der reflektierenden Wand sind 3m. Das bedeutet, dass das Signal ca. 17,6 ms bräuchte um am Sensor wieder anzukommen. Weiterhin strahlt der US in einem Winkel von 15°. Damit der Schall jetzt nicht mehr am Sensor ankommt, müsste schon eine krasse Windstärke herrschen. Beachtet man die 15°, müsste sich der Schall in den 17,6 ms mehr als 0,8m zur Seite bewegen um nicht mehr registriert werden zu können. Wenn ich das jetzt richtig überschlage, wäre eine Windstärke von 163 km/h notwendig um das zu erreichen.

3m Entfernung (*2 für Hin und zurück)
--> t = 6m / 340m/s = 0,01765s
0,8m Verschiebung erhält man über den Tangens von 3m Entfernung und 15°
--> v = 0,8m / 0,01765s = 163 km/h

Oder bin ich bei den Überlegungen auf dem Holzweg?

Du redest Dir da was schön, was so nicht funktioniert, obwohl Du Dir bereits ganz viel Mühe gegeben und auch ganz viel Code geschrieben hast. Ich kenn das. Der Realität in's Auge zu schauen ist einfach oftmals bitter.

Gruß Chris

Chris72622:
Du redest Dir da was schön, was so nicht funktioniert, obwohl Du Dir bereits ganz viel Mühe gegeben und auch ganz viel Code geschrieben hast. Ich kenn das. Der Realität in's Auge zu schauen ist einfach oftmals bitter.

Gruß Chris

Wenn es nicht funktionieren sollte, würde mich trotzdem interessieren, wo der Haken an meiner Überlegung/Theorie ist :wink: Vielleicht muss ich auch eher über analoge Sensoren gehen, dann kann man denke ich besser Signale filtern.

Vielen Dank schon mal für euer Input und ein frohes Osterfest :slight_smile:

Stephan_Berlin:
Vielleicht muss ich auch eher über analoge Sensoren gehen, dann kann man denke ich besser Signale filtern.

Ja, dieses digitale Utraschall ist schon ein Teufelszeug :slight_smile:

SCNR

Gregor

Stephan_Berlin:
Wenn es nicht funktionieren sollte, würde mich trotzdem interessieren, wo der Haken an meiner Überlegung/Theorie ist :wink: Vielleicht muss ich auch eher über analoge Sensoren gehen, dann kann man denke ich besser Signale filtern.

Vielen Dank schon mal für euer Input und ein frohes Osterfest :slight_smile:

Ich bin kein Physiker, der es begründen kann, allerdings habe ich mit den Teilen (billigen) auch schon ähnliche Erfahrung machen müssen. Für den Aussenbetrieb sind die nicht geeignet.

Evtl. funktionieren die "wasserdichten" da etwas besser.
Die kann man ja auch in Autos einbauen.
Den setze ich in einer Wasserzisterne zum kontrollieren des Wasserstandes ein.
US-Sensor wasserdicht

In welcher Höhe befindet sich denn dein Sensor?

Draußen könnte sich u.U. etwas in 1,13m Entfernung unten im Kegel befinden,
das Schall reflektieren kann, aber nicht so stark, dass es immer ein Signal auslöst?

In Innenräumen und auf Straßen hat man es doch mit sehr glatten Oberflächen zu tun,
die kaum reflektieren, draußen ist das anders.

Den wasserdichten hab ich auch im Einsatz. Dummerweise braucht der 250mm Mindestabstand.

ElEspanol:
Den wasserdichten hab ich auch im Einsatz. Dummerweise braucht der 250mm Mindestabstand.

Ja, stimmt.
Was ich auch berücksichtige und in der Zisterne keine Rolle spielt.
Bei der Messung, die der TO machen möchte, sollte es auch funktionieren.

Allerdings würde ich für Geschwindigkeitsmessungen einen Radar-Sensor einsetzen.
Radar-Sensor

Vielen Dank für die Antworten :slight_smile:
Ich bin leider auf US in meinem Projekt beschränkt - daran gibt es auch nichts zu rütteln. Sollte es am Ende nicht gehen, ist das trotzdem ein brauchbares Ergebnis. Wie dem auch sein, mir ist folgendes noch eingefallen, was ich noch nicht probiert habe.

Wie lange oder wie häufig hintereinander kommen diese Schwankungen? Das muss ich noch prüfen. Ich erhalte ja ca. 20 Messungen pro Sekunde (+-) und wenn es immer nur einen ausfallende Wert gibt, dessen Dauer so kurz ist, dass es niemals ein Fahrzeug hätte sein können, dann kann ich das ja rausfiltern!

Sollte das auch nicht klappen, werde ich mir einen teureren Sensor schnappen. Entweder den wasserabweisenden oder den Nachfolger vom HC-SR04. Leider findet man kaum/keine Berichte vom Einsatz der Sensoren draußen (wahrscheinlich aus obigen Gründen).

Mach viele Messungen und nimm einen RunningMedian

Stephan_Berlin:
Ich bin leider auf US in meinem Projekt beschränkt - daran gibt es auch nichts zu rütteln.
Sollte es am Ende nicht gehen, ist das trotzdem ein brauchbares Ergebnis.

Das ist für mich ein überzeugender Hinweis auf eine Aufgabe/Arbeit die du lösen sollst, nicht wir/ich.

Da du auf meine Frage sowieso nicht antwortest klinke ich mich hier aus doppeltem Grund aus.

Viel Erfolg.

Ich möchte ja auch keine Lösung sondern lediglich ein paar Tipps und Infos und genau dafür ist ein Forum mit geballtem Wissen doch gut, oder nicht? Ich finde auch nicht, dass ich hier so rüberkomme, als ob ich nichts dafür machen würde.

Um eine schwankende Stromversorgung auszuschließen, würde ich das Ganze nochmal via Batterie-Pack bzw. Netzteil probieren (bisher USB via Laptop). Ich hab allerdings nur ein 9V/200mA Netzteil hier. Kann ich davon ausgehen, das am 5V Pin auch wirklich nur 5V rauskommen? Multimeter habe ich gerade nicht zur Hand.

Der US-Sensor ist nicht so empfindlich auf Spannungsschwankungen. Die 9V musst du an Vin anschließen

Danke ElEspanol. Vielleicht schnapp ich mir auch nen Batteriepack mit nem "Power-Stecker" oder eine Power-Bank.

Hab gestern übrigens einen Erfolg zu verbuchen gehabt. Ich konnte bei mir vor der Tür die Geschwindigkeit von Fahrzeugen messen (30er Zone). Ich bin von 3m Länge eines KFZ ausgegangen. Es bräuchte dann ca. 200 ms bei 50 km/h um vollständig zu passieren. Kürzere Unterbrechungen werden ignoriert und gefiltert! Das klappt sehr gut bei einem Abstand von 2m (KFZ - Sensor). In dem Abstand bekomme ich ca 20 Messungen in 220 ms. Demnach hab ich auch keine große Verzögerung bis das KFZ erkannt wird.

Was ein wenig komisch ist, ist folgendes:

1m Abstand = 127 ms für 20 Messungen
2m Abstand = 224 ms für 20 Messungen
3m Abstand = 3583 ms für 20 Messungen

Das bedeutet, bei der 3m Abstand kann ich nicht mehr verlässlich und schnell genug etwas erkennen. Warum der Anstieg da so krass ist habe ich noch nicht rausgefunden. Mit dem jetzigen Stand bin ich recht zuversichtlich, dass ich mit ein paar Anpassungen etc. ich noch verlässlichere Messungen durchführen kann. Eventuell muss ich mich für mehr Präzision mit den unterschiedlichen Arduino Typen auseinandersetzen. Mache ich noch mehr If-Else, Case, While etc. Anweisungen, steigt der Abstand zwischen 2 Messungen. Größerer Arduino mehr Rechenpower?

Ich habe auf jeden Fall Spaß an dem Ganzen gefunden =)