Hallo liebe Forenleser,
ich möchte zur Füllstandsmessung einer Zisterne einen Ultraschallsensor
einsetzen. Die Daten des Sensors möchte ich mit Hilfe eines Arduino Uno
auswerten.
Derzeit nutze ich als Sensor ein HC-SR04 Ultraschallmodul für den
Arduino. Die Ergebnisse mit dem Modul sind gut.
Da das Wasser in der Zisterne bis an den Sensor steigt, benötige ich
eine wasserdichte Lösung. Dazu habe ich das Ultraschallmodul DYP-ME007Y
gekauft.
Leider könnte ich mit diesem Sensor bisher (noch im Tockentest auf dem
Schreibtisch) keine Messwerte aufnehmen. Laut Händler ist die
Ansteuerung des DYP-ME007Y genau wie beim HC-SR04.
Hier im Forum habe ich bereits den Hinweis zur Kürzung der Zuleitung
gefunden. Das hat nicht geholfen. Ich habe auch schon einen 2. Sensor
gleichen Typs ausprobiert. Mit dem funktioniert es auch nicht.
Ich habe folgenden Programmcode schon ausprobiert:
1 | int pingPin = 13;
|
2 | int inPin = 12;
|
3 |
|
4 | void setup() {
|
5 | Serial.begin(9600);
|
6 | }
|
7 |
|
8 | void loop()
|
9 | {
|
10 | // establish variables for duration of the ping,
|
11 | // and the distance result in inches and centimeters:
|
12 | long duration, inches, cm;
|
13 |
|
14 | // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
|
15 | // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
|
16 | pinMode(pingPin, OUTPUT);
|
17 | digitalWrite(pingPin, LOW);
|
18 | delayMicroseconds(10);
|
19 | digitalWrite(pingPin, HIGH);
|
20 | delayMicroseconds(50);
|
21 | digitalWrite(pingPin, LOW);
|
22 |
|
23 | // The same pin is used to read the signal from the PING))): a HIGH
|
24 | // pulse whose duration is the time (in microseconds) from the sending
|
25 | // of the ping to the reception of its echo off of an object.
|
26 | pinMode(inPin, INPUT);
|
27 | duration = pulseIn(inPin, HIGH);
|
28 |
|
29 | // convert the time into a distance
|
30 | inches = microsecondsToInches(duration);
|
31 | cm = microsecondsToCentimeters(duration);
|
32 |
|
33 | Serial.println(cm, DEC);
|
34 |
|
35 | delay(1000);
|
36 | }
|
Und
1 | int trigger=13; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
|
2 | int echo=12; // Echo-Pim des Ultraschallsensors an Pim6 des Arduino-Boards
|
3 | long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
|
4 | long entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
|
5 | void setup()
|
6 | {
|
7 | Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
|
8 | pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
|
9 | pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
|
10 | }
|
11 | void loop()
|
12 | {
|
13 | digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
|
14 | delay(5); //Dauer: 5 Millisekunden
|
15 | digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
|
16 | delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
|
17 | digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
|
18 | dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Millisekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
|
19 | entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
|
20 | if (entfernung >= 500 || entfernung <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
|
21 | {
|
22 | Serial.println("Kein Messwert"); //dann soll der serial monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
|
23 | }
|
24 | else // Ansonsten…
|
25 | {
|
26 | Serial.print(entfernung); //…soll der Wert der Entfernung an den serial monitor hier ausgegeben werden.
|
27 | Serial.println(" cm"); // Hinter dem Wert der Entfernung soll auch am Serial Monitor die Einheit "cm" angegeben werden.
|
28 | }
|
29 | delay(1000); //Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.
|
30 | }
|
Wenn ich die Ausgabe im seriellen Monitor betrachte ändert sich die Zahl
überhaupt nicht, wenn ich den Sensor gegenüber der Zimmerwand bewege
(Bewegungsbereich: 0m bis 2m). Der HC-SR04 liefert mit beiden Codes
realistische Ergebnisse.
Kann mir jemand von Euch bei diesem Problem weiterhelfen? Das wäre
super. Oder hat jemand von Euch schon einmal ein Datenblatt zu dem
Sensormodul gefunden? Ich kann leider auch keine Dokumentation zu dem
Sensor finden.
Wenn jemand einen besseren wasserdichten Ultraschallsensor kennt, der
leicht mit einem Arduino anzusteuern geht (also mit integrierter/
zusätzlicher Auswerteelektronik), wäre ich für einen Tipp sehr dankbar.
In jedem Fall wünsche ich allen einen schönen 4. Advent!
Viele Grüße
Felix