Zisterne Füllstandsanzeige

Zisterne mit Wemos messen

Wasserstand einer Zisterne mit einem Wemos D1 mini überwachen.

Hier zeige ich euch wir Ihr mit einem Wemos den Wasserstand einer Zisterne überwachen könnt.
Ich habe es recht einfach gehalten, der Ultraschallsensor misst die Entfernung zur Wasseroberflache und rechnet das in ein Volumen um. Dieses kann dann über eine Intranetseite abgerufen werden. Man kann das ganze natürlich noch erweitern z.B. ab einem bestimmten Wasserstand ein Benachrichtigung via Mail zu erhalten.
So sieht das Ganze auf der Intranet Seite aus, die Bilder für die Balkenanzeige liegt auf meiner Homepage, kann man auch weglassen.

Leider habe ich vor dem Einbau keine Fotos mehr von den Bauteilen gemacht, aber ich denke das ist nicht so schwer zum nachbauen. Denn Ultraschallsensor habe ich in eine Abzweigdose aus dem Baumarkt eingebaut und mit Silikon abgedichtet. Den Wemos D1 mini habe ich in eine etwas größere Abzweigdose gepackt und das ganze mit einer 4 Adrigen Leitung verbunden. Der Wemos benötigt noch Spannung, die bei mir eh vorhanden ist durch die Wasserpume.

Beschaltung

Zisterne Füllstandsanzeige

Der Programmcode:

Wie Ihr den Wemos D1 mini installiert findet Ihr hier.

#include <ESP8266WiFi.h>

const char* ssid = "Wifi Name";
const char* password = "Password vom Wifi";

WiFiServer server(80);

int trigger = 0;
int echo = 2;
long dauer = 0;

long entfernung = 0;

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println();

  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  // Connect to WiFi network

  WiFi.mode(WIFI_STA);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {

  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) / 29.1;

  String cmd;
  cmd += "\"";

  WiFiClient client = server.available();
  client.println("HTTP/1.1 200 OK");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html xmlns='http://www.w3.org/1999/xhtml'>");
  client.println("<head>\n<;meta charset='UTF-8'>");
  client.println("<title>Wasserstand Regenwasserzisterne</title>");
  client.println("</head>\n<body>");
  client.println("<H2>Wasserstand Regenwasserzisterne</H2>");
  client.println("<h3>");

  if (entfernung >= 200 || entfernung <= 0)
  {
    client.println("Kein Messwert");
  }
  else
  {
    entfernung = 192 - entfernung;
    entfernung = entfernung * 84.7457;
    client.print(entfernung);
    client.println(" Liter");
  }
  if (entfernung >= 0 && entfernung <= 1833)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_0.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
  if (entfernung >= 1833 && entfernung <= 3666)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_emty.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
    if (entfernung >= 3666 && entfernung <= 5500)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_2.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
    if (entfernung >= 5500 && entfernung <= 7332)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_half.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
    if (entfernung >= 7332 && entfernung <= 9165)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_4.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
    if (entfernung >= 9165 && entfernung <= 16000)
  {
    client.print("<br><img src=");
    client.print(cmd);
    client.print("http://xxx/bat_full.jpg");
    client.print(cmd);
    client.print(" ");
    client.print("width=");
    client.print(cmd);
    client.print(80);
    client.print(cmd);
    client.println("/>");
  }
  
  client.println("</h3>");
  client.print("</body>\n</html>");
  delay(500);
}

Die Berechnung des Volumen:

Die Zisterne fast 10000 Liter. Die 192 cm ist die Enfternung vom Sensor bis zum Boden der Zisterne. Jetzt brauchen wir den Multiplikator, die 100% sind bei mir bei 118 cm erreicht, also 118×10000=84,7457.
Das ist nun der Multiplikator aus der Sketch.

UPDATE:


Ich habe einen Wasserdichten Sensor gefunden und getestet. Der JSN-SR04T, dieser Funktioniert ohne Probleme und kann in den bestehenden Sketch eingebunden werden ohne was zu verändern. Ich habe auch den DYP-ME007Y ausprobiert, diesen habe ich jedoch nicht zum laufen bekommen. Ich hatte zwei Stück und beide haben nicht funktioniert.

Folgende Bauteile wurde verwendet:

1x Wemos D1 mini http://amzn.to/2nI0KKo *
1x Ultraschallsensor HC-SR04 http://amzn.to/2ndm5Pb *
1x Wasserdichter Ultraschallsensor JSN-SR04T https://amzn.to/2F4q31r *
1x ca. 2m 4 Adrige Leitung http://amzn.to/2nqOzWs *
1x Silikon http://amzn.to/2nHPqOn *
1x Abzweigdose klein
1x Abzweigdose groß http://amzn.to/2nHWFpA *
1x ein Stück Blech um den Sensor am Decker der Zisterne zu befestigen

28 Thoughts to “Zisterne Füllstandsanzeige”

  1. Manuel T.

    Hallo,

    danke für diesen Betrag, ich war schon länger auf der Suche nach sowas. Wollte mir nicht für über 100 Euro was kaufen, diese Lösung ist gut und Preiswert.
    Danke
    Manuel

  2. Jesco

    Hi Tobias, vielen Dank für den Sketch und die Hilfestellung per email! Dadurch hat sich meine “Denkblockade” gelöst 😉 Grüße Jesco

  3. Stefan

    Hallo,

    kann man das auch an Homematic anbinden und auswerten?

    1. Arduino Projekte

      Hallo Stefan,
      das kann ich dir leider nicht sagen, weil ich damit noch nicht gearbeitet haben.
      Gruß
      Tobias

  4. Conrad

    Hallo,
    ich finde den Gedankenanstoß super. Eine Kleinigkeit stört mich allerding.
    Wenn ich den Wemos D1 mini stromlos mache und widereinschalte kommt keine WLAN Verbindung zustande und die rote LED am Sensor (JSN-SR04T) leuchtet dauerhaft.
    Wenn ich den Sensor bei Widereinschalten weg lasse finde ich den Wemos im WLAN. Wenn ich dann im eingeschalteten Zustand den Sensor anschließe leuchtet die blaue LED am Wemos dauerhaft und am Sensor blinkt die rote LED regelmäßig ganz kurz auf.
    Dann funktioniert alles. Die Werte werden angezeigt usw.
    Hat Jemand eine Erklärung dafür bzw. eine Idee wie man das Problem lösen kann.

    Viele Grüße
    Conrad

    1. Florian

      Das ist nicht normal. Wie versorgst Du mit Strom und wieviel Ampere?

  5. Stefan

    Moin,
    habe mir gerade den Code angesehen und dazu zwei Anmerkungen:
    1: Warum rechnest du mit “entfernung” weiter, wenn es einfacher mit einer neuen Variablen für den Füllstand wäre?
    2. Der Multiplikator, den du benutzt, ergibt sich ja aus der Formel zur Berechnung von Zylindern (r*r*h)=V. Demnach ist 84,7457 dann r*r. korrekt?

    1. Arduino Projekte

      Hallo Stefan,
      zum Punkt 1.
      Ich rechne mit der Enfernung weiter, da ich es nicht für nötig erachte haben eine Neue Variabe zu nehmen.
      zu Punkt 2.
      Ich rechne hier nicht den Zylinder aus. Ich weiß das meine Zistern 10000 Liter fast. Der Sensor Sitz am Deckel der Zisterne und der Weg vom Deckel zum Boden beträgt 192cm. Wenn die Zisterne 100% hat misst der Sensor 74cm und 192cm bei 0%. Nun rechnet man 192-74=118 nun 10000/118 ergibt die 84,74, das ist der Multiplikater für die jeweilige Messung.

      Gruß
      Tobias

    2. Günther

      Coole Idee! War auch auf der Suche nach einem feuchtebeständigen Sensor. Bin bei einem IR von Sharp GP2Y0A60SZLF hängen geblieben. Wasser ist leider ein zu guter IR-Absorber. Daher das ganze in einem PVC-Rohr mit Schwimmer. Dann aber ( bisher) wartungsfrei. Nutze selbst einen NodeMCU mit überirdischer Solarenergieversorgung (5V, 2,5W). Lademodul TP4056 mit LiPo Akku.

      Nutzt das hier vorgestellte Projekt Netzspannung mit Netzteil für den Mikrocontroller? Oder läuft die Pumpe mit verträglichen 3,3V?

      Zum Multiplikator:

      10 000 Liter dividiert durch die effektive maximale Wasserhöhe 11,8 dm ergibt 847,457 Quadratdezimeter. Somit r*r*pi, die Grundfläche der Zisterne. Der Sensor misst in Zentimetern.

      Somit lautet die Berechnung:

      entfernung = entfernung/10 * 847,457

      Äquivalent zum Sketch :

      entfernung = entfernung * 84,7457

  6. Jens

    Hallo und danke für die Inspiration!
    Mich würde interessieren wo ich die Bilder ablegen / einbinden muß, damit sie dann mit angezeigt werden können.

    VG Jens

    1. Hallo,
      ich habe die Bilder bei google gefunden und diese auf einer Internetseite hinterlegt.
      Es gibt auch die Möglichkeit die Bilder auf dem Wemos zu speichern, Stichwort Spiffs.
      Ich selber hab damit noch nicht gearbeitet.
      Gruß
      Tobias

  7. Uwe

    Hallo,

    Habe den gleichen Effect wie Connrad. aber nur mit einem Sensor (JSN-SR04T), mit einem (HC-SR04) ist der Start ok. Für Homematic habe ich den Programmcode angepasst und wenn Interesse besteht kann ich da Tips geben.

    Gruß Uwe

    1. Sven S.

      Hallo Uwe,
      mich würde interessieren wie du das in Homematic eingebunden hast.
      Ich habe das ganze an meine Heizöltanks angebaut und kann jetzt sauber den Stand des Sensors in cm messen.
      Nur wie lass ich das jetzt in Liter umrechnen?
      Meine Denkblockade hängt bei folgendem.
      Wenn der Sensor 74cm misst habe ich 10.000 Liter
      wenn der Sensor 192cm misst habe ich 0 Liter

      Wie ist jetzt die Mathematische Formel, um zu berechnen wie viel Liter ich bei einem Stand von z.B. 100cm habe….

    2. Thomas

      Hallo Uwe,

      ich hab mit dem JSN-SR04T das selbe Problem. Hattest du eine Lösung?

      Gruß

      Thomas

  8. Jürgen

    Hallo Uwe ,
    ich suche noch eine Einbindung des Sensors in die Homematik,
    wenn du mir da helfen könntest, Alternativ wäre ich auch mit einem Sketch für mqtt zufrieden
    Gruß Jürgen

    1. Sven S.

      Hallo Jürgen,
      ich würde den Wemos Mini D1 einfach mit EspEASY flashen, dann hast du eine schöne Weboberfläche zum programmieren des Wemos und kannst dort alle Werte eintragen. Zusätzlich kannst du dort einen MQTT Server wählen welcher dir die Daten in deineHomematik liefert.
      So habe ich es gestern bei mir getestet.
      Funktioniert wunderbar.

      1. Claudio

        Hallo, bei mir erhalte ich in ESP Easy keine Werte angezeigt. Habt ihr den JSN-SR04T direkt am Wemos D1 mini angeschlossen oder über einen Level Shifter? Danke für die HIlfe Gruss Claudio

        1. Arduino Projekte

          Hallo,
          der JSN-SR04T ist direkt am Wemos angeschlossen ohne Level Shifter.

          Gruß
          Tobias

          1. Claudio

            Danke für die schnelle Antwort. Bei mir funktioniert die Messung mit dem hier angegebenen Skript auch. Das Verhalten mit dem Booten habe ich auch: Es funktioniert nur, wenn ich den Sensor erst nach dem Booten einstecke.
            Mit ESP Easy (Version R120) geht es leider nicht. Hat jemand eine Erklärung dafür?

            Gruss Claudio

  9. Sven

    Hat mit der Stromaufnahme im Einschaltmoment zu tun. Wenn der JSN mit angeschlossen ist reicht der Strom zum starten des D1 mini nicht aus. Versuch mal ein 1A Netzteil damit ging es bei mir.

  10. Claudio

    So hat es bei mir funktioniert:
    -> Anstatt D3 und D4 die GPIO D6 und D5 nehmen, um das Einschalt/Reset Problem zu umgehen ( https://arduino.stackexchange.com/questions/46775/jsn-sr04t-2-0-with-nodemcu-not-starts-after-reset-or-reconnect-usb-power )
    -> ESP Easy Version 20180606 (oder älter) nehmen. Die neueren Versionen haben einen Fehler im Plugin, weshalb da immer 0 angezeigt wird.
    Viel Erfolg!

  11. gerry.s

    -> Anstatt D3 und D4 kann man auch GPIO D1 und D2 nehmen. Echo (D2) sollte über einen Spannungsteiler zum D1 mini geführt werden z.B. R1=1,2k u. R2=2,2k Ohm (5V->3.3V).

  12. Pat Schu

    Guten Tag,
    ich bin völlig neu in der Arduino Programmierung, da mich dieses Projekt sosehr gereizt hat, dass ich mich daran versuche.
    Nunja, wie immer als Noob, gelingt eben nicht alles sofort, deshalb hier nun ein paar Fragen zu diesem Projekt:
    Ich habe alles versucht nachzuvollziehen, was mir auch bei vielem geglückt ist. Nur eben nicht bei der Entfernung…
    Bei mir sitzt der Ultraschallsensor 44cm über der Max. Höhe des Wassers am Deckel der Zisterne. Dieser ist vom Boden der Zisterne 192cm entfernt. Also max. Höhe Wasser 148cm vom Boden. Daraus habe ich berechnet bei 5500L Zisternenvolumen, ein Multiplikator von 37,16L.
    Wie kommst du nun auf die Entfernungen für deine Anzeige aus den 6 Balken?
    if (entfernung >= 0 && entfernung <= 1833)
    Was bedeutet hier 1833???

    Ich habe bei mir alles so übernommen, jedoch erscheint immer die Anzeige "kein Messwert". Allerdings auch nur, wenn ich direkt mit USB verbunden bin. Aber das liegt wohl an dem Bug mit D3 und D4. Das werde ich noch ändern, dass es dann auch per Netzteil funktioniert.
    Falls ich irgendwelche wichtigen Infos vergessen habe, bitte ich um einen kleinen Hinweis.

    1. Arduino Projekte

      Hallo Pat Schu,

      ich weiß das meine Zistern 10000 Liter fast. Der Sensor Sitz am Deckel der Zisterne und der Weg vom Deckel zum Boden beträgt 192cm. Wenn die Zisterne 100% hat misst der Sensor 74cm und 192cm bei 0%. Nun rechnet man 192-74=118 nun 10000/118 ergibt die 84,74, das ist der Multiplikater für die jeweilige Messung.
      Bei dieser Befehlszeile
      “if (entfernung >= 0 && entfernung < = 1833)"
      die 1833 sind Liter, aus der Rechnung.
      Ich hoffe es hilft weiter.
      Gruß
      Tobias

  13. Toasteraxt

    Sehr coole Idee.
    habe selber noch OTA funktion eingebaut. Nur dann kann ich nicht mehr auf die website zugreifen.
    Irgendwelche ideen warum das nicht geht?

    Genutzt habe ich Arduino OTA

  14. Ingo Marx

    Hallo Tobias,
    tolles Projekt! Ich baue es gerade nach. Wenn die 1833 Literangaben sind, warum geht die “if”-Abfrage zur Anzeige des Zisternenfüllstandsbildes dann im Script bis 16000, wenn Deine Zisterne nur 10.000 Liter hat. Oder bin ich auf dem falschen Weg?

    1. Arduino Projekte

      Hallo Ingo,
      der Grund ist ganz einfach. In die Zisterne passt theoretisch mehr Wasser rein, aber ich messe nur bis zur Unterkante vom Einfüllrohr (Regenrohr).
      Da ich aber wissen will ob das Wasser schon über das Rohr geht messe ich ein bisschen weiter, damit ich zur not abpumpen kann.
      Gruß
      Tobias

  15. Gerald Weigelt

    Hallo, ich hab mal hier eine Adresse von Ebay für ein Wasserdichte Füllstandsanzeige: https://www.ebay.de/itm/JSN-SR04T-Wasserdichtes-Ultraschall-Modul-Entfernungsmesser-Arduino-Raspberry-Pi/182897980375?hash=item2a9591b3d7:g:Ud8AAOSwVFJbu3KJ. Natürlich gibt es noch mehrere Händler dafür.

Leave a Comment