DIY Ultraschall Füllstandsmessung

Abb.: Ultraschall Füllstandsmessung

Die Idee des Füllstandsensors ist im Segeln-Forum durch mehrere Segler entstanden. Andreas hat eine Prototypen aufgebaut und an verschiedenen Objekten getestet. Durch Verwendung käuflicher Fertigmodule ist ein einfacher Nachbau gegeben. Der Ultraschall-Sensor erfasst Flüssigkeitsstände in einem Tank und sendet NMEA0183-Telegramme per WLAN an das Bordnetzwerk. Diese können dann z.B. in AVnav oder OpenCPN visualisiert werden. Aufgrund der Eigenschaften des Sensors muss kein Loch in den Tank gebohrt werden, daher bietet sich dieser Sensor als Nachrüstlösung bei bestehenden Tanks ohne Füllstandsanzeige an. Durch die WLAN-Anbindung müssen keine weiteren Datenkabel verlegt werde. Eine 12V Versorgung in der Nähe des Tanks, an die der Mikrocontroller angeschlossen werden kann, ist ausreichend. Das Modul Wemos D1 mini  ist ein Mikrocontroller auf Basis des ESP 8266 mit eingebautem WLAN-Modul. An dem Mikrocontroller wird der Ultraschallsensor  über eine serielle Schnittstelle angeschlossen. Der Ultraschallsensor wird außen an den Tankboden angeklebt. Damit kann dann der Flüssigkeitsspiegel im Tank erfasst werden.

Achtung: Der Sensor muss am Tankboden angebracht werden und einen Kontakt zur Flüssigkeit haben.  Dadurch wird der Schall in die Flüssigkeit übertragen. Er muss also von unten nach oben „pingen“ um den Flüssigkeitsspiegel zu erfassen. Von oben nach unten „pingen“ über den Luftweg funktioniert nicht. Es hat sich herausgestellt, dass ein andrücken des Ultraschallsensors an den Tank nicht ausreicht, um den Schall in die Flüssigkeit zu übertragen. Man benötigt Kontaktgel oder klebt den Sensor am Tankboden an. Zu Testzwecken kann als Ersatz für Kontaktgel Handcreme oder Fett verwendet werden.

Kenndaten der Ultraschall Füllstandmessung

  • Versorgungsspannung 7…24V DC
  • Stromverbrauch ca. 40 mA bei 12V
  • Messbereich 50…2000 mm Flüssigkeitssäule
  • Messung alle 2 s
  • Datenübertragung WiFi 2.4GHz, 802.11bgn
  • UDP, Port 8888, Broadcast
  • Datenformat: NMEA0183, XDR
  • Konfiguration: Webseite bei Erststart

Ultraschallsensor DS1603L

Abb.: DS1603L Ultraschall Füllstandsensor mit serieller Datenausgabe

Den Ultraschallsensor DS1603 gibt es in verschiedenen Ausführungen. Wir verwenden die Version mit einem seriellen RS232 Ausgang, die mit einem L am Ende gekennzeichnet ist. Es gibt aber auch andere Sensoren (DS1603DA-3R) mit einer RS485-Schnittstelle und Modbus als Übertragungsprotokoll. Der Sensor DS1603L der auch zum DA1603DA-3U kompatibel ist, hat laut Datenblatt folgende Eigenschaften:

Kenndaten

  • Betriebsspannung: 3.3-12V DC
  • Stromverbrauch: < 35 mA
  • Blinder Bereich: <= 50 mm
  • Messbereich: 50…2000 mm
  • Ausgang: UART RS232 seriell 9600 8N1 (nur TX)
  • Auflösung: 1 mm
  • Antwortzeit mit Flüssigkeit: 2s
  • Antwortzeit ohne Flüssigkeit: 10s
  • Messgenauigkeit: ± (3 + H x 0.5 %) mm
  • nicht wasserdicht
  • ESD-Festigkeit: ± 4/± 8 kV.

Datenausgabe

  • 9600 Bd, 8 Datenbits, ein Stopbit, kein Paritätsbit (8N1).
  • 4 Byte Daten:
    • Byte1 Header: fester Wert 0xFF
    • Byte2 Data_H: hohes Byte der Höhe.
    • Byte2 Data_L: niedriges Byte der Höhe.
    • Byte4 Prüfsumme

Prüfsumme: Prüfsumme = (Header + Data_H + Data_L) & 0x00FF

Berechnung der Füllhöhe: Höhe [mm] = Data_H * 256 + Data_L

Bedeutung der blauen Status-LED

LED-Zustand Bedeutung
Dauerhaft an Kein Schallpegel gefunden
Blinkt Messbereit, Schallpegel gefunden

Der Ultraschallsensor versucht am Anfang den Sendepegel des Schallsignals einzustellen, so dass eine Messung möglich ist. Dazu benötigt der Sensor 10 s. In der Zeit ist die LED dauerhaft an. Sobald ein gültiges Echosignal detektiert wurde, beginnt die blaue LED im Rhythmus von 2 s zu blinken. Bei jedem Blinken werden 4 Byte an Daten über die TX-Leitung gesendet. Die RX-Leitung bleibt unbenutzt, da man dem Sensor keine Kommandos senden kann. Der Sensor fängt selbständig ohne ein spezielles Startkommando mit dem Senden an. Sollte eine Messung nicht möglich sein, so bleibt die LED dauerhaft an und die Prüfsumme ist fehlerhaft. Es werden jedoch weiterhin 4 Byte an Daten ausgesendet. Oft ist dann die Ursache fehlendes Kontaktgel zur Schallübertragung oder eine unzureichende Schallübertragung.

Kabelbelegung

Kabelfarbe Bedeutung
Rot 3.3-12V DC
Schwarz GND
Gelb TX *
Weiß RX *

* Spannungspegel von Versorgungsspannung abhängig (4V Signale bei 5V Versorgungsspannung)

Kennlinie

Abb. Sensorkenlinie 0…90 mm bei 5V Versorgungsspannung

Je nach Versorgungsspannung beginnt der Ultraschallsensor schon bei 30 mm Flüssigkeitshöhe mit der Messung. Bei 25 mm tritt aber gelegentlich ein fehlerhafter Messwert auf, der mit 60 mm Flüssigkeitshöhe angegeben ist. Man darf also den Messwerten unterhalb von 40…50 mm nicht vertrauen. Unterhalb von 20 mm werden keine gültigen Messsignale übertragen und die Prüfsumme ist fehlerhaft. Die Status-LED ist dauerhaft an. Die Spezifikation weist auch einen toten Bereich von 0…50 mm aus.

Messgenauigkeit und Linearität

Abb. Linearität des DS1603 im gültigen Messbereich 30…90 mm

Die Messgenauigkeit ist hinreichend genau für eine Füllstandsmessung. Der Offsetfehler beträngt bei meinem Modell ca. 4 mm. Die Steigung ist nicht exakt bei 1.0. Mit einer Offset- und Steigungskorrektur könnten die Messwerte verbessert werden.

Insgesamt ist aber bei einer Tank-Füllstandsmessung zu bedenken, dass es einen toten Bereich von 0…50 mm gibt. Der Tank muss eine gewisse Bauhöhe haben, um halbwegs genau den Füllstand errechnen zu können. Der Tank sollte eine Mindesthöhe von 250 mm aufweisen und Quadratisch sein. Mit dem Ultraschall-Messverfahren wird die Flüssigkeitssäule über dem Sensor gemessen. Der Tankfüllstand wird in Prozent der maximalen Füllhöhe angegeben. Weicht die Tankgeometrie von der Quaderform ab, so entspricht der Ausgabewert nicht dem Füllstand in Prozent.

Datenübertragung

Über das WLAN-Modul wird der Wemos mit dem Bordnetzwerk verbunden. Dazu wird bei erstmaligem Start und jedes Mal wenn kein bekanntes WLAN-Netz vorhanden ist, eine Einrichtungsseite aufgerufen. Ist der Mikrocontroller mit dem Netzwerk verbunden und hat der Sensor einen Flüssigkeitsspiegel im Tank erkannt, werden entsprechende NMEA0183-Datensätze über UDP als Broadcast-Aussendungen in das Bordnetzwerk gesendet. Broadcast bedeutet, dass die Datensätze an alle Netzteilnehmer gleichzeitig versendet werden und keine spezielle IP-Adresse für die Kommunikation notwendig ist. Die Konfigurationsseite schließt sich automatisch, wenn sich der Sensor in das Bord-WLAN einbuchen konnte oder automatisch nach 10 Minuten.

Parameter Wert
SSID UltrasonicSenor
Passwort 12345678
Übertagungtyp WiFi 2.4 GHz, 802.11bgn
Datentyp NMEA0183
Telegramm XDR: $IIXDR,V,15,P,FUEL*56 (Messwert in Prozent der Tankhöhe)
Übertragungsart UPD, Broadcast
Port 8888

Abb. Übertragungsparameter

Abb. Konfigurationsseite

Schaltungsaufbau

Der Schaltungsaufbau gestaltet sich recht einfach. Es werden nur wenige Komponenten und Kabelverbindungen benötigt.

Abb. Schaltung Ultraschall-Sensor

Für den Ultraschall-Sensor benötigt man folgende Teile:

Position Anzahl Bezichnung Quelle Bemerkung
1 1 Wemos D1 mini Makershop.de
2 1 Wemos 7-24V 1A DC Power Shield Makershop.de
3 1 Widerstand 1k, 1/4W Pollin.de
4 1 Widerstand 2k2, 1/4W Pollin.de
5 1 Schaltlitze Pollin.de optional
6 1 Schrumpfschlauch Pollin.de optional
7 1 Gehäuse Pollin.de

Der Ultraschallsensor wird an die jeweiligen Pins vom Wemos D1 mini angelötet und danach auf das Power Shield aufgesteckt.  Alles zusammen wird dann in einem wasserdichten Gehäuse untergebracht.

Anpassung der Firmware

In der Grundeinstellung benutzt die Firmware als Tankgeometrie einen Tank mit 400 mm Höhe. In Zeile 109 kann im Quellcode der Datei main.cpp die Tankhöhe angepasst werden.

109 int Prozent = (h / 400.00) * 100;

Die gesamte Quellcode der Firmware ist bei GitHub zu finden:

https://github.com/norbert-walter/NMEA0183-Level-Sensor-DS1603L

Wer den Quellcode selber kompilieren möchte kann das mit PlatformIO machen. PlatformIO ist eine Erweiterung für die Programmierumgebung Visual Studio Code von Microsoft und unterstützt eine Reihe von Mikrocontrollern aus dem DIY-Bereich. Wie man PlatformIO unter Visual Studio Code installiert ist hier beschrieben:

https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/plattformio

oder

https://iotgrizzly.de/ide-platformio/

Ist PlatformIO eingerichtet, so kann recht einfach das GitHub-Repository kopiert werden. Dazu klickt man auf den Button Clone Repository und trägt in der Adresszeile die Webadresse des Repositorys ein unter dem das Projekt bei Github gespeichert ist (https://github.com/norbert-walter/NMEA0183-Level-Sensor-DS1603L).

Danach wählt man ein Verzeichnis aus in dem das Projekt gespeichert wird. Dabei muss  man die Frage mit ja beantworten, dass man der Quelle vertraut und die Software wirklich herunterladen möchte. Im Anschluss ist das Projekt im Workspace zu sehen. Dann schleißen wir Visual Studio Code und öffnen es erneut, damit der Workspace korrekt mit PlatformIO geladen wird. Dann sollten wir noch die korrekte COM-Schnittstelle einstellen über den unser Wemos D1  mini angeschlossen ist. Das machen wir, indem wir die Datei platformio.ini anpassen und speichern. Anderenfalls lässt sich sonst die Firmware nicht flashen.

Jetzt haben wir eine fertige Entwicklungsumgebung für unser Projekt und können die Firmware selber kompilieren und auch flashen.

Wer sich die ganze Mühe der Einrichtung von Visual Studio Code und PlatformIO ersparen möchte, kann gleich die fertig kompilierte Binärdatei mit dem NodeMCU Flasher auf den Wemos D1 mini übertragen.

Flashen der Firmware als Binary

Das Flashen der Firmware als Binary erfolgt über ein Micro-USB-Kabel, das mit dem Wemos D1 mini und dem PC verbunden wird.

Flash-Anleitung

  1. USB-Programmierkabel mit Laptop oder PC verbinden
  2. Programmiersoftware NodeMCU Flasher auf Laptop oder PC starten und Firmware laden
  3. Programmiervorgang starten
  4. Nach erfolgreicher Programmierung USB-Programmierkabel trennen
  5. 12V einschalten und WiFi-Verbindungsparameter über AccessPoint einstellen

NodeMCU Flasher

Als Programmiersoftware für den Wemos D1 mini kann das einfach zu benutzende Windows Tool NodeMCU Flasher verwendet werden. Die EXE-Datei kann ohne spezielle Installation direkt gestartet werden. Als erstes werden unter Advanced folgende Einstellungen vorgenommen. Wer einen Wemos D1 mni Pro benutzt, der muss den Flash size auf 16MB setzen.

Danach wird unter Config die aktuelle Firmwaredatei firmware.bin ausgewählt.

Zum Flashen geht man auf Operation und wählt die entsprechende COM-Schnittstelle aus an der der Wemos D1 mini angeschlossen ist. Danach drückt man auf Flash und wartet ab, bis die Firmware geladen ist.

Während des Flashens wird der Fortschritt der Übertragung angezeigt.

Wenn die Firmware erfolgreich geladen wurde, ist folgender Bildschirm zu sehen.

Nach der Übertragung kann das Programmiertool geschlossen und der Adapter abgezogen werden.

Integration in SignaK

Damit der Füllstandswert an SignalK übergeben werden kann benötigen wir das Plugin xdr-parser-plugin. Es übersetzt die universellen XDR-Telegramme, die eine Erweiterung der NMEA0183 Telegramme sind. Das Plugin kann über den in SignalK integrierten Appstore installiert werden. Nach der Installation ist ein Neustart des SignalK-Servers notwendig. Danach müssen wir noch das xdr-parser-plugin unter Server -> Plugin Config konfigurieren. Weitergehende Details wie man das xdr-parser-plugin konfigurieren muss, sind hier zu finden: https://github.com/GaryWSmith/xdr-parser-plugin

Abb. Plugin Config

Danach legen wir eine neue Datenverbindung unter Server -> Data Connection für den Tanksensor an und starten SignalK neu.

Abb. Data Connection

Danach sind die Daten im Dashboard und Data Browser zu sehen.

Abb. Dashboard

Abb. Data Browser

Kalibrierfunktion

Mit einem weiteren SignalK Plugin @signalk/calibration kann eine Kalibrierfunktion dem Füllstandssensor hinzugefügt werden. Dabei wird mit Hilfe einer Kalibriertabelle ein Zusammenhang zwischen Eingangs- und Ausgangswerten hergestellt. Das Plugin rechnet dann automatisch die eingehenden Werte um, so dass sie richtig angezeigt werden. Damit ist es möglich, auch ohne anpassen und kompilieren der Firmware die korrekten Füllstandswerte anzeigen zu können. Man füllt dann literweise den Tank ohne aktiviertes Kalibrier-Plugin und schreibt sich in einer Tabelle die angezeigten Werte vom Data Browser auf. Danach überträgt man die Werte in das Kalibrier-Plugin. Nach einem Neustart des SignaK-Serves werden alle Messwerte umgerechnet ausgegeben. Wichtig ist die richtige Source für die Datenquelle anzugeben. Die findet man in der letzten Spalte des Data Browsers. Unter Path muss der selbe SignalK-Path angegeben sein wie man ihn in der ersten Spalte des Data Browsers sieht. Andere Datenpfade sind nicht erlaubt und führen dazu, dass keine Umrechnung der Messwerte erfolgt.

Abb. Calibration

Wer möchte kann die Daten dann im Instrument Panel anzeigen lassen.

Abb. Instrument Panel mit Füllstandsanzeige

Bilder