HC-sr04 Ultraschallsensor misst Mist

Hallo,

hab einen HC-SR04 Ultraschallsensor an ein Arduino UNO angeschlossen.
Habe das Programm und die Schaltung von:
http://www.robodino.de/2011/12/ultraschall-distanz-sensor-hc-sr04.html
verwendet.
Jetzt ist aber so, das der Sensor immer 3cm ausgibt. Wenn ich ein Blatt Papier zwischen die beiden Sensoren halte dann wird der Leseabstand verbesser, allerdings ist immer bei maximal 90cm Schluss.
Ich wollte allerdings bis ca. 3 Meter messen.

Habe auch schon einen anderen HC-SR04 Sensor getestet, gleiches Ergebnis.

Hat jemand eine Idee??

Was generelles:

Ich habe so einen ähnlichen Sensor während des Studiums auf einem Lego NXT verwendet. Die sind hauptsächlich dafür da um festzustellen ob etwas vor dem Roboter ist, aber nicht um das Objekt genau zu lokalisieren (mit Koordinaten). Das Problem bei Messungen auf hoher Distanz ist der Schall kegelförmig ausgestrahlt wird. Wenn ich es richtig in Erinnerung habe waren es so um die 20-30° auf jeder Seite. Das heißt je weiter deine Mess-Distanz ist, desto breiter wird dein Messbereich.

Wir haben das am Ende so hingebracht, dass der Sensor rotierend montiert war und sich um 180° drehen konnte. Dann wurde alle 5° oder 10° eine Messung gemacht und durch die Punkte wo der Sensor angefangen und aufgehört hat ein Objekt zu erkennen konnte man die Position des Objekts auf 3 Mess-Schritte eingrenzen. Mit etwas Trigonometrie konnte man dann aus dem Sensorwinkel die Koordinaten berechnen. Hat bis auf ein paar Ausreißer ganz gut funktioniert.

Es kommt darauf an was du machen willst, aber wenn du eine genaue Punktmessung willst, ist ein Infrarot-Sensor besser. Mehr als 90cm und vor allem eine genau Distanzmessung auf kurze Entfernung sollte zwar technisch möglich sein (d.h. du hast da wirklich ein Problem), aber ich habe die Reichweite künstlich begrenzt um falsche Ergebnisse zu reduzieren. Und eine Mindest-Entfernung von ein paar cm hat das Ding glaube ich auch gehabt.

Wobei wenn ich mir deine Daten anschaue ist deiner besser als das was ich hatte. Kleiner Öffnungswinkel, kleinere Mindestdistanz. Aber das Problem, dass die Messung mit höherer Distanz immer schwieriger wird existiert immer noch.

Die geben aber an das man mit dem Sensor bis 4,2 Meter messen kann.
Ich will den Füllstand meiner Zisterne erfassen.

mx738:
Habe auch schon einen anderen HC-SR04 Sensor getestet, gleiches Ergebnis.

Hat jemand eine Idee??

Hast Du mal den Playground-Code getestet: Arduino Playground - HomePage

In dem von Dir getesteten Code sind Ping-Pin und Echo-Pin zwei verschiedene Pins am Arduino.

Beim Playground-Code wird das Ping über denselben Pin gesendet, über den das Echo zurückerwartet wird.

Gibt es vielleicht am Modul eine Jumper-Steckbrücke, mit der das Modul konfiguriert werden kann, damit entweder getrennte Pins oder derselbe Pin für Ping und Echo verwendet werden?

mx738:
Ich will den Füllstand meiner Zisterne erfassen.

Ok, das ist etwas einfacher als was ich gemacht habe. :slight_smile:

mx738:
Habe auch schon einen anderen HC-SR04 Sensor getestet, gleiches Ergebnis.

Hat jemand eine Idee??

Hallo mx738,

also ich habe mehrere dieser Sensoren mit DIESER Bibliothek getestet: Google Code Archive - Long-term storage for Google Code Project Hosting.. Die haben alle sehr zuverlässig und simpel und überraschend präzise funktioniert. Könnte es vielleicht an der Verkabelung liegen?

Gruß, kuahmelcher

Ich benutze immer den folgenden Sketch:

int TriggerPin = 12; // Digital 12 -> HC-SR04 Trigger
int EchoPin = 13;    // Digital 13 -> HC-SR04 Echo
// HC-SR04 Vcc -> 5V, GNG -> GND

void setup() 
{
  Serial.begin(9600);
}

void loop()
{
  // establish variables for duration of the ping, 
  // and the distance result in inches and centimeters:
  long duration, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(TriggerPin, OUTPUT);
  digitalWrite(TriggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TriggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TriggerPin, LOW);

  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(EchoPin, INPUT);
  duration = pulseIn(EchoPin, HIGH);

  // convert the time into a distance
  cm = microsecondsToCentimeters(duration);
  if (cm <= 500)
  {
    Serial.print(cm);
    Serial.println("cm");
  }
  else Serial.println("Ungueltige Messung ! Entfernung groesser als 5 Meter !!!");
  delay(100);
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

Ich hatte mit einem solchen Sensor auch Probleme.
Die Gründe für die Probleme waren, daß ich die beiden Ultraschallkapseln mechanisch durch durchstecken in 2 Löcher verbunden haben. So wird der Ultraschall direckt vom Sender zum Empfänger geleitet und Du hast so kurze Antwortzeiten. Die beiden Ultraschallkapseln dürfen nichts berühren. Die Löcher für die Montage müssen groß genug sein.
Das 2. Problem sind Echos innerhalb des geschlossenen Raums. Diesem Problem kann man durch lange Pausen zwischen den Messungen entgegentreten. Auch darf die Zisterne innen keine vorstehende Teile haben die zu Falschmessungen führen.

Ein weiteres Problem ist die feuchte Umgebung innerhalb der Zisterne. Diese Umweltbedingungen sind Gift für die Elektronik des Sensors. Auf die Dauer werden Teile oxidieren und so den Sensor zerstören.

Viele Grüße Uwe

Hallo!

Hat jemand mal eine einfache, aber dichte Verpackung gefunden?

Wenn man z.B. ein paar Säckchen Trockenkügelchen mit ein packt und als Folie vor dem Mikro / Lautsprecher zumindest Frischhaltefolie oder etwas anderes sehr hauchdünnes nutzt, könnte es sein, dass der Schall kaum gedämpft wird. Frischhaltefolie müsste man so wickeln, dass sie glatt Lage auf Lage hat, wo sie dichten soll. Ich probiere es morgen mit dem EV3-Sensor aus. Den HC-SR04 habe ich auch, aber zu lange nix mehr mit Arduino gemacht. Das kommt dann am WE dran.

(Alternative: Kautschukfreies Kondomili? Könnte alterungsbeständig und dünnwandig genug für den Zweck sein.)

Kapazitive Füllstandsmessung, (idealerweise Algen-Belags-Inert ;):
Ansonsten habe ich mich mit den Bibliotheken für "Touch Sense" beschäftigt, sowohl für Atmel als auch Cypress (PSoC). Sieht vielversprechend aus.
Damit man am Ende das Kabel nicht versiegeln muss, könnte man es als Schleife legen.
Ich habe aber gute Erfahrungen damit gemacht, ein Kabel so abzuisolieren, dass die Isolierung vorsteht, also, ich schiebe mit dem Seitenschneider die Isolierung etwas das Kabel hoch, zwicke dann innen den Draht ab, dann rutscht die Isolierung über das Drahtende drüber und guckt raus.
Da wird dann mit Heißluft geheizt, ruhig so 230°C, und mit einer flachen glatten Zange zugequetscht/geschweißt. Das Prinzip ist nun, dass durch das Wasser die Drähte elektrisch näher rücken, also die Kapazität steigt, aber auch die (kapazitive) Ableitung gegen Erde.
Wenn man einfache Drähte nehmen kann, könnte man es sich erlauben, mit mehreren Adern, die in unterschiedlichen Tiefen in der Zisterne enden, zu arbeiten, so dass man eine Art selbstkalibrierendes System bekommt. Sonst stelle ich mir das schwierig vor, mal eben schnell Wasser woanders hin pumpen, damit man den ollen Sensor eichen kann. Vielleicht 2 Gruppen Drähte, getrennt durch ordentlich Abstand, damit ja kein Schmotz die kapazitive Strecke überbrücken kann, wo gar kein Wasser ist. Kabelende mit Gewichten am Boden parallel schwebend halten. Oben keine durchgehende Aufhängung, lieber je von der Seite kommen. Meist hängen die Kondenswassertropfen an waagrechten Strukturen unterm Schachtdeckel.

Immer habe ich aber den Bedarf, etwas perfekt gegen Dampfdruck einzupacken, schwierig.
Daher mal eine robustere alte Idee als Alternative:

Perlmethode
bleibt vielleicht als Einzige langzeitstabile übrig:
Ein Luftschlauch geht vom trockenen Keller / Anschlusskasten / Gartenhäuschen in die Zisterne bis knapp über dem Boden.
Antrieb ist eine kleine Membranpumpe, die soviel Luft-Druck erzeugen kann, dass sie knapp über dem Boden bei voller Zisterne einperlen kann. Dann misst man entweder das Volumen von 0 Druck (Wassersäule im Schlauch gleich Wasserspiegel) bis zum Einperlen, oder den ÜberDruck, bei dem gerade die ersten Bläschen blubbern.
Dazu könnte man wie bei den oszillometrischen Blutdruckmessgeräten die feinen Druckschwankungen erfassen, die entstehen, wenn nach ein bisschen Laufen der Membranpumpe die ersten Blasen aus der Ausperlöffnung blubbern. Habe gerade zufälligerweise so ein Blutdruckmessgerät nach Riss in der Membran ums Handgelenk geschlachtet. Sehr praktische Ansammlung von Teilen. Schade, dass man den Controller meist nicht geknackt bekommt, um ihn mit eigener Firmware zu versehen, sonst müsste man nur noch programmieren.
So muss man halt doch ein bisschen Löten, bis man ein Arduino oder PSoC an Druck-Sensor und Pumpe bekommt.
Damit der Druck langsam steigt, mag eine PWM auf die Pumpe sinnvoll sein.
Dann kann man auf Einperlen mit kleiner Blubber-Rate regeln, dann sollte der Fehler klein sein durch Druckverlust im Schlauch etc..

Problem könnte sein, dass durch den langen Schlauch die Blubberschwankungen sehr gedämpft werden.
Vielleicht geht aber auch eine sanfte Drehzahlregelung der Pumpe (Hall-Sensor ankleben), so dass der Volumenstrom im Schlauch so klein ist, dass der Fehler durch den Strömungswiderstand der Luft im Schlauch vernachlässigbar wird. Man muss dann halt immer so lange pumpen, wie es bräuchte, wenn die Zisterne voll wäre.

Offensichtlich braucht das Ding mehr Strom als elektronische Sensoren, aber Messen muss man ja vielleicht nicht die ganze Zeit, sondern nur auf Abruf oder ein mal am Tag, dann tut auch ein Satz Akkus 1/2-1a. Mit drahtloser Übermittlung?

Gerade fällt mir noch eine Art Schwimm-Bake ein, die könnte man triangulieren. Mir fällt nur grade nicht ein, wie man das nicht optisch und damit etwas verschmutzungsresistenter machen könnte.

Gruß!

Andi

Hallo,

der Abstrahlwinkel des sensors ist mit 15° angegeben. Von wo aus wird dieser gemessen. Ich möchte nur sicher sein das der Schall nicht von den Wänden reflektiert wird und falsche Messergebnisse liefert.

Nehmen wir an das Wasser wäre warm in der Zisterne und würde verdunsten würde die Messung dann beeinflusst?

Grüße

Der Messbereich ist wie eine Keule. Das am nächsten liegende Objekt wird gemessen. Wasserdampf aus Verdunstung wird nicht erkannt. Eine Spinnwebe eventuell, wenn die Spinne drin sitzt.

ands:
Hallo!

Hat jemand mal eine einfache, aber dichte Verpackung gefunden?

Wenn man z.B. ein paar Säckchen Trockenkügelchen mit ein packt und als Folie vor dem Mikro / Lautsprecher zumindest Frischhaltefolie oder etwas anderes sehr hauchdünnes nutzt, könnte es sein, dass der Schall kaum gedämpft wird. Frischhaltefolie müsste man so wickeln, dass sie glatt Lage auf Lage hat, wo sie dichten soll. Ich probiere es morgen mit dem EV3-Sensor aus. Den HC-SR04 habe ich auch, aber zu lange nix mehr mit Arduino gemacht. Das kommt dann am WE dran.

Es gibt wasserfeste Ultraschall-Sensoren. Sie sind nur nicht ganz so extrem billig wie die HC-SR04.

Die haben aber in der Regel eine Mindestmessentfernung von 25 cm.

Gruß Tommy