Und wieder habe ich Probleme mit der Füllstandsmessung in meiner Regenwasser Zisterne. Diesmal liegt es am Kabel vom Abstandssensor in der Zisterne bis zur eigentlichen Elektronik, die im Pumpenhaus ist.

Also wieder ein Projekt dazwischen geschoben…

Zuerst habe ich mir überlegt, die ganze Elektronik, also Sensor und ESP8266 in die Zisterne zu packen. Dazu brauche ich natürlich ein möglichst Wasserdichtes Gehäuse. Ich habe mir etwas entsprechendes schnell in 3D entworfen und ausgedruckt. Auch sind die zuletzt von mir montierten Gewindestangen beim reinigen des Schmutzkorbes irgendwie immer im Weg. Darum habe ich mir eine Rohrschelle besorgt, so dass ich mein Gehäuse mit einer Schraube direkt an einem der Rohre befestigen kann.

Hier auch wie immer die STL-Dateien für das Gehäuse.

Auch habe ich die Verbindung zwischen Platine und Sensor nun mit einem Stecker gelöst. Sollte der Sensor also wieder einmal rosten, kann ich ihn einfach durch einen neuen ersetzen.

Die eigentliche Steuerplatine mit dem ESP8266 habe ich im Gehäuse dann einfach darüber gelegt. Auf dem Bild ist rechts auch der neue Stromanschluss zu sehen. Diesmal als Steckverbindung und mit ordentlich Schrumpfschlauch schön wasserfest gemacht.

ESP8266 Elektronik mit Abstandssensor im Gehäuse
Elektronik im Gehäuse

Dann das Gehäuse mit einer M8 Schraube an der Rohrschelle befestigt und den Deckel mit M3 Gewindeschrauben auf das Gehäuse geschraubt. Nicht zu fest anziehen, sonst bricht der Kunststoff…

Gehäuse an Rohrschelle mit zugeschraubtem Deckel
Zugeschraubtes Gehäuse an Rohrschelle

Dann habe ich das ganze wie geplant an einem der KG Rohre in der Zisterne, kurz über der maximalen Wasserhöhe montiert und den vorher verlegten Stromstecker angeschlossen.

Abstandssensor montiert an Rohrschelle in Zisterne
Sensor in Zisterne

Das eigentliche Netzteil ist im Pumpenhaus geblieben. Zur Sicherheit habe ich dort noch einen 1 Ampere Sicherungsautomaten zwischen geschaltet. Nur für den Fall, das es bei der Elektronik doch einen Wasserschaden gibt, will ich nicht das mein Steckernetzteil “abbrennt”.

1A Sicherung im Pumpenhaus

Bei der Überarbeitung der Wasserstandsmessung habe ich auch die Software auf dem ESP8266 aktualisiert:
– Umstellung auf ESP8266WebServer
– Daten werden nicht mehr zum Homeserver gepusht, sondern dieser kann sich die Daten über eine URL abholen (pull)
– Kleine Internetseite zu Diagnosezwecken gemacht
– Messroutine ist geblieben

// Zisterne3.0.ino
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const int pingPin = 14; // Trigg
const int start_signal = 12; // Echo
const long middles = 5; // Mittelwerte

ESP8266WebServer server(80); // Webserver
WiFiClient client;

              
void setup() {
  Serial.begin(115200);

  IPAddress ip(192, 168, X, Y);
  IPAddress gateway(192, 168, X, Z); 
  IPAddress subnet(255, 255, 255, 0); 
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("SSID", "PWD");

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

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());  

  server.on("/", handle_normal);
  server.on("/hs", handle_hs);
  server.on("/hs/1", handle_hs);
  server.onNotFound(handle_NotFound);  
  server.begin();
  Serial.println("http server startet");
}


void loop() {
  server.handleClient();
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

void handle_normal() {
  Serial.println("handle /");
  long distance = measureMiddle();
  String msg = String("<!DOCTYPE html><html>") + 
    "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" + 
    "<link rel=\"icon\" href=\"data:,\">" + 
    "<body><h1>Zisterne F&uuml;llstand Server</h1>" + 
    "<p>Example for simple output: /hs/1</p>" + 
    "<br><p>Current distance: " + String(distance) + "</p>" + 
    "</body></html>\r\n" ;
  server.send(200, "text/html", msg); 
}

void handle_hs() {
  Serial.println("handle /hs");
  long distance = measureMiddle();
  String msg = String("D=" + String(distance) + "\r\n");
  server.send(200, "text/html", msg); 
} 

long measureMiddle() {
    Serial.println("measuering");
    long distance, i; 
    distance = 0;
    for (i = 0 ; i <= middles ; i++) {
      distance = distance + doMeasure();
    } 
    distance = distance / middles;  

    Serial.println(distance);

    return (distance);    
}

long doMeasure() {
  long duration;

  pinMode(pingPin,OUTPUT);
  pinMode(start_signal,OUTPUT);
  digitalWrite(start_signal,HIGH);
  delayMicroseconds(20);
  digitalWrite(start_signal,LOW);
  digitalWrite(pingPin,LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin,HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin,LOW);
  pinMode(pingPin,INPUT);  
  duration = pulseIn(pingPin,HIGH);
  delay(80);
  return (microsecondsToCentimeters(duration));
}
 
long microsecondsToCentimeters (long microseconds) {
  return microseconds  / 29 / 2;
}

Dadurch ist der Code auch deutlich aufgeräumter und übersichtlicher geworden.

Die Logik im Homeserver um die Webseite regelmäßig zu laden ist sehr einfach.

Logik für regelmäßigen Aufruf der Internetseite vom Gira Homeserver
Logik für regelmäßígen Aufruf der Internetseite

Ich nutze einfach den Telegrammgenerator um alle 60 Sekunden die Webseite abzurufen. Ich habe das generisch umgesetzt, da ich plane alle ESP8266 Sensoren auf diese Technik umzubauen.
Unterhalb des Telegrammgenerators ist die Umrechnung von der Füllhöhe auf eine Prozentanzeige zu sehen.