| 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:
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
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 »
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
Dann geht zu « Werkzeuge » → « Boardtyp » → « Board-Manager » und sucht nach « esp8266 » und klickt auf « installieren »
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 ![]()
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.
- Szene: Benachrichtigung Tank leer
- Szene: Täglicher Tankbericht
Sie können die Telegram-App installieren, um Ihre Benachrichtigungen zu erhalten.
Einige Fotos meiner Installation











