Eines meiner vielen Projektideen ist unter anderem eine elektronische Pegelstandsmessung. Die ersten Ideen dazu kamen mir schon fast vor 10 Jahren. Dazu gibt es von mir eine kleine Blog-Serie, welche die Entwicklung bis zur Umsetzung zeigen soll.

Vermessen der Zisterne

Am vergangenen sonnigen Freitag habe ich unsere Zisterne inspeziert. Auf dem Plan standen:

  • Reinigen der Zisterne
  • Vermessen
  • Sensorleitung verlegen
  • Testaufbau mit Ultraschall Modul und Arduino

Reinigen der Zisterne

Mein Plan war eigentlich mit dem Hochdruckreiniger alles zu reinigen und sauber zu machen. Den Vorfilter gilt es auch zu reinigen. Am Boden der Zisterne hat sich leider soviel Schlamm angesammelt, dass man da mit einer Art Sauger arbeiten muss.  Ich hatte dann noch eine Tote Maus entfernt, welche sich wahrscheinlich durch die Dachrinnen ihren Weg gebahnt hatte und das wars mit dem reinigen ;).

Sensorleitung verlegen

Die Sensorleitung verlegte ich in einem Lehrrohr in dem schon die Leitung für die Pumpe läuft. Als Leitung verwendete ich eine 6-Adrige Leitung geringeren Querschnitts, da ich keine größeren Ströme erwarte. Die Leitung endet jetzt in der Garage und hat ca. eine länge von 2 bis 3 Metern. In die Garage kommt dann die Box mit dem Arduino und einem kleinen Netzteil.

Funkverbindung zur Zentrale

Geplant war eigentlich, die Strecke von der Garage zum Gateway mit den kleinen NRF24L01 Modulen zu überbrücken. Wie ich in den vergangenen Tagen herausfand, eignen sich die kleinen Module gar nicht für Übertragungen durch Mauerwerk. Gerade dickes Mauerwerk, verhindert überhaupt irgendein Signal zu bekommen. Ich habe hier auch das NRF24L01 Long Range mit externer Antenne, welches angeblich bis zu 800 Metern überbrückt - und selbst dieses Modul gibt nach einigen Metern auf. Auf dem Freifeld wollte ich das ganze noch testen. Ich habe mir jetzt zwei kleine NRF905 aus China bestellt, diese sollten die nächsten Tage eintreffen, diese Module bieten eine viel geringere Frequenz und so hoffe ich die paar Meter zum Gateway überbrücken zu können.

Prinzipsskizze: Zisternen Pegelstandsmessung

Zu sehen sind die Zisterne und das Ultraschallmodul. Wenn man das Ultraschallmodul an dem Trigger Pin, triggert, sendet das Modul einen Ultraschall Ton aus. An dem Echo-Pin kann man nun die Pulsdauer des Signals messen und mithilfe der Schallgeschwindigkeit die Entfernung berechnen. Die Pulsdauer entspricht hier der Signallaufzeit des Ultraschall-Tons. Mehr zu dem HC-SR04 in einem seperatem Beitrag.

Temperaturabhängigkeit der Schallgeschwindigkeit

Die Schallgeschindigkeit in der Luft kann Näherungsweise mit folgender Formel berechnet werden:

siehe dazu auch: Schallgeschwindigkeit im realen Gas bei Wikipedia.de

In der Zisterne sollte eigentlich eine relativ gleichbleibende Temperatur herrschen, aber vom Winter zum Sommer kann der Temperaturunterschied bestimmt einige Grad betragen. Deshalb werde ich in meine Ultraschall Library, eine kleine Temperaturkompensation mit einbauen. Schon bei 10°C Änderung der Temperatur, kann das mehrere Zentimeter unterschied ausmachen. Beispiel:

c_schall @ -20°C = 319,5 m/s
c_schall @ +20°C = 343,5 m/s

Ergibt einen Unterschied von knapp 7%. Das sind bei einem Meter: 70mm. Eine Temperaturkompensation sollte also ein muss sein.

Da der Schall an der Wasseroberfläche reflektiert wird, muss man die Pulsdauer noch durch zwei Teilen, damit man auf den einfachen Weg kommt. Das sind dann:

millimeter = pulsdauer / 3 / 2;

Testaufbau und Beispielprogramm für den Arduino

Getestet habe ich das ganze mit einem Arduino-Leonardo. Hier auf dem Fritzing ist ein Uno. Die Belegung bleibt die selbe. Wenn man ein Display anschließen möchte, muss man auf die geänderten Pin für den I2C-Bus achten. Am Arduino-Leonardo sind diese gesondert mit SDA/SCL gekennzeichnet. Beim Uno sind das die Pins:

  • A4 - SDA
  • A5 - SCL

Anschließen des HC-SR04 Moduls

  • VCC - 5V Arduino
  • Trig - Trigger Pin, 7.
  • Echo - Echo Pin, 8
  • GND - Masse
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const int triggerPin = 7;
const int echoPin = 8;

byte micro[8] = {
  0b00000,
  0b00000,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11110,
  0b10000
};

void setup() {
   
  lcd.begin(16,2);
  lcd.createChar(0, micro);             
  lcd.home ();   
         
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  
}

void loop() {

  lcd.clear();  
  long duration, inches, mm;  
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(triggerPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);

  mm = microsecondsToMillim(duration);

  lcd.setCursor(0, 0);
  lcd.print(mm);
  lcd.print(" mm");
  lcd.setCursor(0, 1);
  lcd.print(duration);
  lcd.write((uint8_t)0);
  lcd.print("s");
  delay(1000);
}

long microsecondsToMillim(long microseconds) {
  return microseconds / 3 / 2;
}

Die Wire.h und die LiquidCrystal_I2C.h brauche ich nur für das Display. Man könnte das ganze auch nur über den Serial Port machen, aber ich wollte zum testen nicht meinen Laptop mitschleppen.

Das Beispielprogramm gibt die Entfernung auf den Millimeter "genau" aus, damit man im ruhigen Zustand auch mal die Ungenauigkeit des Moduls sieht. Mehr dazu aber in dem seperatem Blogpost über das HC-SR04 Modul.

Aufbau der Testschaltung

Live Test in der Zisterne

Der Live-Test in der Zisterne fiel nicht so gut aus wie gedacht. Erstmal kann ich den Sensor nicht direkt im Schacht montieren. Sondern muss ihn wegen des großen Ausbreitungswinkels von 30° ans Ende setzen. Falls ich genau Mittig bleibe, könnte ich bis maximal 50 cm Oberhalb des Schachtanfangs den Sensor montieren. Die Sensorleitung hatte ich zum Glück lang genug gelassen, sodass ich die Leitung nicht noch verlängern musste.

Hier gehts zum zweiten Teil