[TUTORIAL] Den verbleibenden Speicherinhalt des Regenwassertanks ermitteln

id Titel Seitenleiste_bezeichnung
Verbleibende Kapazität eines Tanks Verbleibende Kapazität eines Tanks Verbleibende Kapazität eines Tanks

Projekt: Verbleibende Kapazität eines Tanks

Hallo Community,

Ich stelle euch mein Projekt vor, das jetzt funktionsfähig ist, um die verbleibende Wassermenge in meinem Tank zu messen.

Die Idee zu diesem Projekt kam mir, weil mein Regenwassertank meine Außenbewässerung, meine Waschmaschine und meine Toilette versorgt, und es war mir unmöglich zu wissen, ob noch Wasser im Tank war, außer indem ich nach draußen ging und in den Tank schaute.

Gladys ermöglicht es mir, auf Stadtwasser umzuschalten, falls nötig, über eine Benachrichtigung, die mir anzeigt, dass der Tank fast leer ist.

Für dieses Projekt, falls es euch interessiert, werdet ihr Folgendes benötigen:

1x Wemos D1 mini (Kosten 2,63€ bei aliexpress) Vorteile: klein und mit WLAN

1 Ultraschallsensor JSN-SR04T Vorteil: wasserdicht (Kosten 5,25€ bei aliexpress)

1x Verlängerungskabel von 3,5m, notwendig für Entfernungen > 2,5m, falls ihr es im Haus oder in einer Garage per USB anschließen möchtet (Kosten 4,08€ bei aliexpress)

1 oder 2 wasserdichte Gehäuse je nach gewählter Installationsart (Kosten 2,40€ im Baumarkt)

Gesamt: 17,36€

Voraussetzungen:

  • Arduino-Software
  • MQTT-Integration in Gladys

1. Schritt: Anschließen des JSN-SR04T-Sensors an den Wemos D1 mini

Schema:

Capture d’écran 2021-03-08 à 10 24 00

GND : GND

VCC : 5V

Echo : Pin D6

Trigger: Pin D7

2. Schritt: Integration von MQTT in Gladys

Folge dem Installationsvorgang in Gladys und erstelle nach Abschluss der Konfiguration ein neues MQTT-Gerät mit den folgenden Elementen

Capture d’écran 2021-03-14 à 20 32 43

Capture d’écran 2021-03-14 à 20 30 50

Dann « speichern »

Zum Schluss könnt ihr das Band auf der Startseite erstellen, um das Ergebnis am Ende des Projekts zu sehen

Auf dem Dashboard, klickt auf « bearbeiten » → « Geräte des Raums » → « Garten »

Capture d’écran 2021-03-14 à 20 35 08

3. Schritt: Der Arduino-Code, der auf den Wemos hochgeladen werden soll (Hauscode, der verfeinert oder verbessert werden kann)

Dazu müsst ihr die Arduino-IDE von ihrer Website herunterladen und installieren (verfügbar hier)

Der WEMOS D1 mini wird von der Arduino-IDE nicht offiziell unterstützt. Ihr müsst also den Treiber CH340/CH341 herunterladen, damit er erkannt wird und ihr Code darauf hochladen könnt. (Verfügbar hier)

Schließt euren Wemos D1 mini an und installiert den Treiber, startet dann die Arduino-Software und geht zu « Einstellungen » und fügt die folgende Zeile in die URL der zusätzlichen Board-Manager hinzu

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Capture d’écran 2021-03-08 à 09 31 07

Dann geht zu « Werkzeuge » → « Boardtyp » → « Board-Manager » und sucht nach « esp8266 » und klickt auf « installieren »

Capture d’écran 2021-03-08 à 09 39 29

Zum Schluss könnt ihr euer Board in « Werkzeuge » → « Boardtyp » auswählen und "ESP8266board " und « LOLIN(Wemos) D1 R2 & mini » wählen

Und schon ist euer Wemos-Board bereit, Code zu empfangen :slight_smile:

Jetzt müsst ihr die notwendigen Bibliotheken für die Funktionsfähigkeit des Codes herunterladen.

Ihr müsst in den Tab « Werkzeuge » → « Bibliotheken verwalten » gehen

Wir werden Folgendes benötigen:

  • ESP8266Wifi
  • PubSubClient

Ihr könnt nun den folgenden Code kopieren/einfügen, wobei ihr daran denken müsst, eure Informationen im MQTT-, WIFI- und vor allem den Wert der Tiefe eures Tanks in « float c = 2000 » zu ändern.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

/* WIFI */

#define wifi_ssid "*********" // Ihr WLAN-SSID
#define wifi_password "**************" // Ihr WLAN-Passwort

/* MQTT */

#define mqtt_server "192.168.0.8"
#define mqtt_user "gladys"            // Benutzername
#define mqtt_password "************" // MQTT-Passwort
#define gladys_topic "gladys/master/device/mqtt:jardin:capteur-ultrason/feature/mqtt: jardin:capteur-ultrason:quantite/state"
#define mqtt_cuve "mqtt:jardin:capteur-ultrason"     //Topic Sensor Tank

/* Puffer, der die empfangenen MQTT-Nachrichten decodiert */

char message_buff[100];

long lastMsg = 0;   // Zeitstempel der letzten auf MQTT veröffentlichten Nachricht
long lastRecu = 0;
bool debug = false;  // Zeigt auf der Konsole an, wenn True

/* Konstanten für die Pins */

const byte TRIGGER_PIN = 7; // TRIGGER-Pin
const byte ECHO_PIN = 6;    // ECHO-Pin

/* Konstanten für den Timeout */

const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m bei 340m/s

/* Schallgeschwindigkeit in der Luft in mm/us */

const float SOUND_SPEED = 340.0 / 1000;

//Erstellung der Objekte

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {

  /* Initialisiert den seriellen Port */

  Serial.begin(9600);     // Optional für Debugging

  /* Initialisiert die Pins */

  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // Der TRIGGER-Pin muss im Ruhezustand auf LOW sein
  pinMode(ECHO_PIN, INPUT);

  setup_wifi();           // Verbindung zum WLAN herstellen
  client.setServer(mqtt_server, 1883);    // Konfiguration der Verbindung zum MQTT-Server
}

//Verbindung zum WLAN-Netzwerk
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Verbindung zu ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

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

  Serial.println("");
  Serial.println("WLAN-Verbindung hergestellt ");
  Serial.print("=> IP-Adresse : ");
  Serial.print(WiFi.localIP());
}

//Wiederverbindung
void reconnect() {
  //Schleife bis eine Wiederverbindung erreicht wird
  while (!client.connected()) {
    Serial.print("Verbindung zum MQTT-Server...");
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("FEHLER, Fehler: ");
      Serial.print(client.state());
      Serial.println(" Warten Sie 5 Sekunden bevor Sie es erneut versuchen");
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();

  /*Senden Sie eine Nachricht pro Minute*/

  if (now - lastMsg > 1000 * 60) {
    lastMsg = now;

    /* 1. Startet eine Entfernungsmessung, indem ein HIGH-Impuls von 10µs auf den TRIGGER-Pin gesendet wird */

    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);

    /* 2. Misst die Zeit zwischen dem Senden des Ultraschallimpulses und seinem Echo (falls vorhanden) */

    long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);

    /* 3. Berechnet die Entfernung aus der gemessenen Zeit */

    int distance_mm = measure / 2.0 * SOUND_SPEED;
    float c = 2000 - distance_mm; // SEHR WICHTIG Ersetzen Sie 2000 durch die Höhe Ihres Tanks
    c = c / 2000;
    c = c * 100;

    //Es ist nicht nötig, weiterzumachen, wenn der Sensor nichts zurückgibt
    if ( isnan(c)) {
      Serial.println("Lesefehler! Überprüfen Sie Ihren HRC-04-Sensor");
      return;
    }

    if ( debug ) {
      Serial.print("Tank: ");
      Serial.print(c);
    }
    client.publish(gladys_topic, String(c).c_str(), true);   //Veröffentlicht den % des Tanks im Topic in gladys
  }
}

Sobald der Code hochgeladen wurde, können Sie die Kabel mit dem obigen Schema anschließen und einen Test mit der Arduino-IDE und dem seriellen Monitor durchführen, um das Ergebnis zu sehen. Wenn alles richtig funktioniert, können Sie Ihre Hardware in wasserdichten Boxen installieren, um Ihren Sensor und Ihren Wemos zu schützen.

Sie können verschiedene Szenen erstellen und sich z. B. benachrichtigen lassen, wenn der Tank fast leer ist oder Ihnen einmal täglich die verbleibende Kapazität senden.

Capture d’écran 2021-03-14 à 20 37 20

  1. Szene: Benachrichtigung Tank leer

Capture d’écran 2021-03-14 à 20 38 52

Capture d’écran 2021-03-14 à 20 39 18

  1. Szene: Täglicher Tankbericht

Capture d’écran 2021-03-14 à 20 41 04

Capture d’écran 2021-03-14 à 20 41 33

Capture d’écran 2021-03-14 à 20 41 56

Sie können die Telegram-App installieren, um Ihre Benachrichtigungen zu erhalten.

Einige Fotos meiner Installation

Genial für dieses Tutorial, danke, dass du es hier gepostet hast :slight_smile:

Wofür dient diese Zeile in deinem Code?

Ich glaube, das ist ein Relikt aus dem Skript, das du als Inspiration genutzt hast :slight_smile:

Hallo, du hast ein Bild in deinem Tutorial, das nicht angezeigt wird, das zweite Bild im Wemos-Schema.

Tolles Tutorial :+1:, gut gemacht!

Ja, genau. Ich habe ihn gelöscht. :zwinker:

Mein Fehler, es handelte sich um dasselbe Bild :grin:

Ansonsten würde ich dir empfehlen, die Bilder auf dem Forum zu hosten (du kannst sie direkt in den Tutoriel hochladen), anstatt dich auf Github zu verlassen. Wenn du dein Repo löschst, werden die Bilder in diesem Tutoriel nicht mehr angezeigt ^^

Hallo, ich habe gerade diese Installation durchgeführt, aber sobald ich ein Kabelverlängerung anschließe, bleibt mein Signal auf Minimum?

Hallo @tonio-79

Funktioniert es ohne die Verlängerung?

Wenn du „Minimum“ sagst, ändern sich die Werte oder bleiben sie bei 0?

Hallo,
Ohne die Verlängerung funktioniert es, sobald ich sie anbringe, bleibt der Wert auf dem Minimum (0,19 m).

Hast du eine Verlängerung von 2 m verwendet oder mehrere davon kombiniert?

Das Problem scheint materiell zu sein und nicht im Code zu liegen.

Hallo, ich habe es mit einer oder mehreren Verlängerungen von 3,5 m (die, die im Anfang verlinkt sind) versucht.
Ich hatte vier davon, also habe ich sie ausgetauscht, um zu überprüfen, ob eine davon defekt ist.

Also, ich verstehe das nicht.

Weißt du, wie man ein Arduino-Programm erstellt, um das Ergebnis dann live mit dem seriellen Monitor anzusehen?

Hallo,

Wie bestimmst du die Höhe deines Tanks und die verbleibende Literzahl?

:wink:

Hallo!
Höhe des Tanks: Ein Faden mit einem Gewicht und dann misst man
Das Volumen erfordert die Kenntnis des Radius (r), also des halben Durchmessers, dann die Formel: π x r x r.
Danach multiplizierst du mit der Höhe.
Alles in Metern, wenn du die Antwort in Kubikmetern haben willst, in Dezimetern, wenn du die Antwort in Litern haben willst…

Danke für die Infos.
Aber ich finde den Ort im Skript nicht, an dem man diese Parameter angeben soll!
:wink:

Das gibt dir einen Füllstand in Prozent…
Jetzt musst du nur noch den Rest berechnen :wink:

:+1: Danke :+1:

Hallo @Doudy

Funktioniert es bei dir? Entschuldige, ich war in letzter Zeit zu sehr präsent.

Danke @GBoulvin, dass du in meiner Abwesenheit geholfen hast.

Bis bald

Noch nicht getestet
:wink:

Hallo,
Ich bin gerade dabei, die Materialien zu bestellen.

  1. Was ist eine Verlängerungsschnur und wofür dient sie?
  2. Wie erfolgt die Verbindung oder die Stromversorgung?
    Danke
    :wink: