Willkommen im Loxone Community Forum. Um alle Funktionen nutzen und sehen zu können, registriere dich bitte zuerst. Dies gilt auch für das herunterladen von Dateien.
Dieser Bereich ist für fertige Lösungen gedacht. Nutze bitte für Diskussionen die anderen Bereiche.
Füllstandmessung mit Ultraschall + UDP an Miniserver
also ich habe jetzt auch vor, mich mit dem Arduino zu beschäftigen.
Habe schon ein paar Seiten gefunden, wo alles gut erklärt wird.
Ansonsten dachte ich mir, an ein Netzteil wie von einem Handyladegerät. also nur ein kleines.
Das alles dann in ein Wasserdichtes Gehäuse und dann ab in die Zisterne.
Für meine Pumpe benötige ich ja auch noch Strom
Ich habe den Code jetzt auf dem ESP8266 mit dem wasserdichten Sensor DYP-ME007Y per Wlan zum laufen bekommen. Die Messergebnisse sind sehr konstant, Abweichung 0.5 cm auf 1,80 m. Bei dem DYP-ME007Y gibt es verschiedene Varianten, meiner war nicht per Trig und Echo auslesbar, deshalb musste ich den Code komplett anpassen. Bitte um etwas Nachsicht, ist mein erstes zusammenkopiertes Projekt
Ich habe einen Arduino mit der Füllstandsmessung schon seit mitte letztem Jahr im Einsatz. Funktioniert super! Danke hierfür schonmal. Seit Herbst habe ich ein paar PIR Bewegungsmeldersensoren an den Arduino angeschlossen. Habe dann den void loob Wiederholungszyklus auf 1sec. verringert um für die BM tauglich zu machen. Jetzt wird allerdings ja auch jede sec. eine Ultraschallmessung durchgeführt und an den MS gesenden. Habe versucht einen Counter einzubauen, so dass der Teil mit der Distanzmessung nur alle 10sec. durchgeführt wird. Bekam das aber nicht zum laufen und jetzt möchte ich mich dem nochmal annehmen. Aber seht selbst.
// min max auswerten, wenn in der Range wird gesendet
if (distanz >= maxReichweite || distanz <= minReichweite) {
Serial.println("Messung fehlerhaft!");
} else
{
Serial.print(distanz), Serial.println(" cm");
dtostrf(distanz, 4, 0, chardistanz); //Distanz fuer UDP Versand umwandeln (1 steht fue r Nachkommastellen)
sendUDP(chardistanz); //Messung an MS senden
verzo =0;
} }
if (verzo <10);
verzo +1;
Serial.println("verzo");
delay(1000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden
}
Oli
So einfach geht das auch nicht, so lange mit delay gearbeitet wird ist das wie eine Pause.
Du kannst nicht einmal eine 1 Sekunde Pause machen und dann eine 5 oder 10 Sekunden pause.
Was du einfach machen kannst ist ein Counter einbauen der auf x Zählt und dann zB bei 10 sendet.
Dazu musst du einen zweiten Block UDP senden bauen damit der BWM immer sendet und der Ultraschall nur nach zB 10 druchläufen.
Die Messung findet dan jede Sekunde statt aber wird nur all x Sekunden gesendet.
ich habe dank Hismastersvoice meinen Code so umgebaut das die Ultraschallmessung nur bei jedem 10 loop durchlauf angestoßen wird.
Habe jetzt aber das Problem das wenn ein Bewegungsmelder per UDP "0" sendet mein Analogsensor für die Entfernung auch eine 0 erkennt.
Was muss ich eintragen dass die Zeile
sendUDP(chardistanz);
als Befehlserkennung einen Namen beinhaltet so das ich den Wert in der Config unterscheiden kann?
Code:
// benoetigte Bibliotheken
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// Netzwerk Einstellungen
//MAC-Adresse bitte anpassen
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB };
// UDP Port zum Datenempfang Lox MS -> Arduino
unsigned int ARDUPORT = 6000;
// IP Lox MS
IPAddress MSIP(192, 168, 1, 3);
// UDP Port zum Datenversand Arduino -> Lox MS
unsigned int MSPORT = 5000;
// Daten-Buffer
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
// EthernetUDP Instanz um UDP zu senden/empfangen
EthernetUDP Udp;
// Pin fure Bewegungsmelder u. HC SR04 festlegen
#define Bewegungsmelder1 2 // Bewegungsmelder Geräteraum
#define Bewegungsmelder2 3 // Bewegungsmelder Heizraum
#define Bewegungsmelder3 5 // Bewegungsmelder Treppenhaus
#define echoPin 9 // Echo Pin
#define trigPin 8 // Trigger Pin
// Konstanten
int maxReichweite = 300; // Maximum Reichweite der Messung
int minReichweite = 0; // Minimum Recihweite der Messung
// Variablen
long dauer;
float distanz;
char chardistanz[10];
char BewegungsmelderState1 = 0;
char BewegungsmelderState2 = 0;
char BewegungsmelderState3 = 0;
int verzo = 0;
void setup() {
Serial.begin(9600);
if (!Ethernet.begin(mac)) Serial.println("DHCP fehlgeschlagen");
else {
Serial.println ("Netzwerkdaten");
Serial.println ("---------------");
Serial.print("Arduino MAC: ");
Serial.print(mac[0], HEX);
Serial.print(":");
Serial.print(mac[1], HEX);
Serial.print(":");
Serial.print(mac[2], HEX);
Serial.print(":");
Serial.print(mac[3], HEX);
Serial.print(":");
Serial.print(mac[4], HEX);
Serial.println(mac[5], HEX);
Serial.print("Arduino IP: ");
Serial.println(Ethernet.localIP());
Serial.print("Arduino UDP Port: ");
Serial.println(ARDUPORT);
Serial.println ("---------------");
Serial.print ("Miniserver IP: ");
Serial.println(MSIP);
Serial.print("Miniserver UDP Port: ");
Serial.println(MSPORT);
Serial.println ("---------------");
}
Serial.print(":");
Udp.begin(ARDUPORT); // Start UDP
pinMode(Bewegungsmelder1, INPUT);
pinMode(Bewegungsmelder2, INPUT);
pinMode(Bewegungsmelder3, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop()
{
// Bewegungsmelder Geräteraum(Send)
if (digitalRead(Bewegungsmelder1) == LOW && BewegungsmelderState1 != 0)
{
sendUDP("GR.Bewegungsmelder: 0");
Serial.println("keine Bewegung in Geräteraum erkannt");
BewegungsmelderState1 = 0;
}
if (digitalRead(Bewegungsmelder1) == HIGH && BewegungsmelderState1 != 1)
{
sendUDP("GR.Bewegungsmelder: 1");
Serial.println("Bewegung in Geräteraum erkannt");
BewegungsmelderState1 = 1;
}
// Bewegungsmelder Heizraum(Send)
if (digitalRead(Bewegungsmelder2) == LOW && BewegungsmelderState2 != 0)
{
sendUDP("HR.Bewegungsmelder: 0");
Serial.println("keine Bewegung in Heizraum erkannt");
BewegungsmelderState2 = 0;
}
if (digitalRead(Bewegungsmelder2) == HIGH && BewegungsmelderState2 != 1)
{
sendUDP("HR.Bewegungsmelder: 1");
Serial.println("Bewegung in Heizraum erkannt");
BewegungsmelderState2 = 1;
}
// Bewegungsmelder Treppenhaus(Send)
if (digitalRead(Bewegungsmelder3) == LOW && BewegungsmelderState3 != 0)
{
sendUDP("TH.Bewegungsmelder: 0");
Serial.println("keine Bewegung in Treppenhaus erkannt");
BewegungsmelderState3 = 0;
}
if (digitalRead(Bewegungsmelder3) == HIGH && BewegungsmelderState3 != 1)
{
sendUDP("TH.Bewegungsmelder: 1");
Serial.println("Bewegung in Treppenhaus erkannt");
BewegungsmelderState3 = 1;
}
if (verzo == 20)
{
// Distanz lesen
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
dauer = pulseIn(echoPin, HIGH);
//Distanz in cm umrechnen
distanz = dauer / 58.2;
// min max auswerten, wenn in der Range wird gesendet
if (distanz >= maxReichweite || distanz <= minReichweite) {
Serial.println("Messung fehlerhaft!");
}
else
{
Serial.print(distanz), Serial.println(" cm");
dtostrf(distanz, 4, 0, chardistanz); //Distanz fuer UDP Versand umwandeln (1 steht fue r Nachkommastellen)
sendUDP(chardistanz); //Messung an MS senden
}
verzo = 0;
}
delay(1000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden
verzo++;
Serial.print("Nächste Messung bei "), Serial.print(verzo), Serial.println(" von 20");
}
//UDP-Befehl senden
void sendUDP(String text)
{
Udp.beginPacket(MSIP, MSPORT);
Udp.print(text);
Udp.endPacket();
delay(10);
}
Hab ich so ein Arduino system gemacht fur mein "Treibhaus" gemacht.
Ich hab 250l tank im mein Treibhaus drin mit Ultraschall sensor.
Logik ist so gemacht das Ultraschall Sensor zeigt bei full tank 250l - (0 cm) uber bei leer 0 (110cm) -das wegen geht es auch ohne formula.
Impulz ein/aus geht jede 60s so es schickt aktuell stand zu "energie meter"
Nur hab ich problem mit liter / minuten rechnen + richtige impulze einstellen.
Gibt es jetzt schon "Langzeiterfahrungen" Nach dem Startbeitrag müsste der Sensor ja jetzt ca 1 Jahr laufen? Gibt es Probleme oder alles top?
Bin gerade am schauen welchen Sensor ich für die Messung nehmen werde...
Und wie sieht es mir Erfahrungen mit Arduino POE aus? verwendet ihr Ethernet-Module mit POE und versorgt mit 24V oder nutzt ihr 2 "freie" Adern des CAT-Kabels, da 100Mbit nicht alle Adern belegt?
Hab heute endlich Zeit gefunden den Sensor aufzubauen. Läuft soweit gut. Allerdings habe ich momentan ein Rohr DN75 in der Zisterne verbaut. Hier gibt es scheinbar zu viele Reflexionen. Die Messung zeigt viel zu kleine Abstände an...
Welche Erfahrungen habt ihr mit dem Rohrdurchmesser gemacht?
Zum Thema "Programm in festen Intervallen ausführen" habe ich unten stehendes gefunden. Mit den millis() kann man sehr schön seine Programmteile zu unterschiedlichen Zeiten ausführen. So könnte man z.B. eine LED nur alle 10 Sekunden blinken lassen, während im Hintergrund andere Programmteile permanent ausgeführt werden.
PS: Werde heute Nachmittag mich auch mal an die Zisterne wagen.
Ist mir klar das das geht, aber warum soll ein Code ständig laufen wenn er nur alle X Sekunden messen soll.
Ich nutze Mills immer wenn ich unterschiedliche Zeitabläufe habe, aber hier ist es ja nur einer.
Wenn der komplette Code natürlich nur einmal alle X Sekunden laufen soll, ist das mit delay() natürlich auch möglich. Ich hatte das so verstanden, dass der Code eben nicht komplett still stehen soll. Wenn das nicht so ist, um so besser.
Wir verarbeiten personenbezogene Daten über Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen, Werbung zu personalisieren und Websiteaktivitäten zu analysieren. Wir können bestimmte Informationen über unsere Nutzer mit unseren Werbe- und Analysepartnern teilen. Weitere Einzelheiten finden Sie in unserer Datenschutzrichtlinie.
Wenn Sie unten auf "Einverstanden" klicken, stimmen Sie unserer Datenschutzrichtlinie und unseren Datenverarbeitungs- und Cookie-Praktiken wie dort beschrieben zu. Sie erkennen außerdem an, dass dieses Forum möglicherweise außerhalb Ihres Landes gehostet wird und Sie der Erhebung, Speicherung und Verarbeitung Ihrer Daten in dem Land, in dem dieses Forum gehostet wird, zustimmen.
Kommentar