Schon 2017 hatte ich einen Ultraschallmesser gebaut. Damals mit einem Atmel-Controller - "Ultraschall Garagenstopp (2017)". Für unsere Zisterne habe ich mein nächstes Projekt vor - die Füllhöhe auslesen mit Ultraschall. Wegen der nötigen Wifi-Anbindung habe ich diesmal den ESP8266 gewählt.
Der Ultraschallsensor HCSR04(P) ist ein häufig genutzter, preiswerter und einfach anzuwendender Fertigbaustein mit 4 Anschlüssen. Neben Versorgungsspannung und Masse besitzt er noch einen Triggereingang und einen Ausgang. Nach einem Triggerimpuls wird ein Schallpaket ausgesendet. Zeitgleich geht der Ausgang auf High-Pegel. Wird der Schall an einem Hindernis reflektiert kehrt er zum Sensor als Echo zurück, wird erkannt und dann der Ausgang sofort auf Low geschaltet. Die Zeit des High-Impulses am Ausgang entspricht der Zeit, die der Schall zum Hindernis und zurück braucht. Der Sensor hat einen Schallkegel von etwa 15 °. Bei 3m Entfernung ist die beschallte Fläche etwa 1,5 x 1,5m rund 2m2. Innerhalb dieses Kegels muss sich der Gegenstand befinden, der erkannt werden soll. Je näher, je kleiner die Fläche.
Zu Messprinzip. Die Schallgeschwindigkeit in Luft beträgt 343,5 m/s bzw. 34,35 cm/ms (bei 20 °C). Angenommen, das Ziel sei 40 cm entfernt, dann ist der Weg hin und zurück 80 cm. 80 / 34,35 = 2,33 ms. Die Entfernung beträgt nur die Hälfte, also ohne den Rückweg = 1,164 ms.
Wie kann man den Sensor ansteuern? Das geschieht über den Triggereingang, der Ausgangspin liefert anschließend die Laufzeit des Schalls. Über die Länge des Triggerpulses und die Gesamtzeit gibt ein Zeitdiagramm Auskunft:
Zeitdiagramm des Sensors
0µs | HIGH-Flanke am Triggereingang bereitet die Messung vor |
+ 10µs | LOW-Flanke am Triggereingang startet die Messung |
+ ca.250 µs | Verzögerungszeit vor Schallimpuls |
+ 0µs | Schallimpuls startet, Ausgang wird auf HIGH geschaltet |
+ 200µs | Schallimpuls endet, warten auf Echo |
+ max.17,49 ms | Echo erkannt, (3m = 17,49ms); Ausgang geht auf LOW |
Insgesamt sind das im Maximalfall rund 20 ms pro Messung. Damit sind 50 Messungen pro Sekunde bis 3 m Entfernung möglich (maximale Messentfernung). Eine Besonderheit - wenn der Ausgang für 200 ms auf HIGH-Pegel verharrt kam kein Echo an. Wenn man diese Information ebenfalls haben möchte, begrenzt das die Messfrequenz auf höchstens 5 pro Sekunde.
Die Schaltung:
D6 triggert den Sensor HC-SR04P (das "P" ist relevant, denn es bedeutet "für 3,3V - geeignet" und der ESP8266 arbeitet mit 3,3V. Normale HC-SR04 - Sensoren ohne "P" benötigen 5V und sind nicht verwendbar).
Im Oszi-Bild weiter unten erkennt man, dass der HC-SR04P fast 600µs gegenüber den 250µs des Datenblatts des normalen HC-SR04 benötigt. Das beschränkt die Messfrequenz dieses Typs etwas.
D7 holt die Antwort ab. Die Länge des Antwortsignals entspricht der Zeit in µs, die der Schall braucht, um vom Sender zum Ziel und zurück zu kommen. In diesem Fall etwa 21*2 = 42cm.
Hier der Code (TXT-Datei ist verlinkt):
Das Oszi zeigt violett den Trigger-Impuls. Die Antwort ist gelb. In jeder Sekunde legt der Schall 343m zurück (bei 20°C). Das sind pro µs 0,03432cm. Bei 42cm sind das 1195µs. Wie das Oszi-Bild zeigt, kommt das etwa hin (1222µs). Die Entfernung zum Ziel ist die Hälfte.
auch der ESP8266 gibt Entsprechendes aus. 1cm hin oder her: