Hardware
1 x Arduino Nano
1 x Ethernet W5100
1 x HC SR04 Ultraschallsensor
Elektrische Verbindungen (Schaltung)
Ethernet zu Arduino
MO -> Pin 11
MI -> Pin 12
SCK -> Pin 13
SS -> Pin 10
5v -> 5V
GND -> GND
HC SR04 zu Arduino
VCC -> 5V
Trig -> Pin 8
Echo -> Pin 7
GND -> GND
Stromversorgung
5V -> VIN
GND -> GND
Arduino Code
// benoetigte Bibliotheken #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 = xxxx; // IP Lox MS IPAddress MSIP(192, xxx, xxx, xxx); // UDP Port zum Datenversand Arduino -> Lox MS unsigned int MSPORT = xxxx; // Daten-Buffer char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // EthernetUDP Instanz um UDP zu senden/empfangen EthernetUDP Udp; // Pin fure HC SR04 festlegen #define echoPin 7 // 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]; 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.print(":"); 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 ("---------------"); } Udp.begin(ARDUPORT); // Start UDP pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { // 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 } delay(5000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden } //UDP-Befehl senden void sendUDP(String text) { Udp.beginPacket(MSIP, MSPORT); Udp.print(text); Udp.endPacket(); delay(10); }
Der Ultraschallsensor sendet ein Schallsignal aus und misst die Zeit bis es wieder zurück kommt.
Anhand der Zeit wird die Entfernung umgerechnet.
Die cm werden an den MS gesendet.
Im MS wird per Formel der Füllstand berechent.
Dazu ist die Montagehöhe des Sensor nötig (Zisterne cm leer), sowie die Liter je cm (Zisterne Liter je cm).
Nötige Anpassungen
Arduino Code
MAC-Adresse (mac)
Port auf den der Arduino hört (ARDUPORT)
IP MiniServer (MSIP)
Port MiniServer (MSPORT)
Loxone
Empfangsport Virtuller-Eingang... Muss gleich MSPORT im Arduino Code sein
Befehlserkennung = \v
Konstanten anlegen...
Empfehlung
Da die Messung leichten Schwankungen im Kommstellen-Bereich hat, macht es Sinn wenige Nachkommastellen weiterzugeben.
In der Zeile "dtostrf(distanz, 4, 1, chardistanz);" werden wo jetzt dei 1 steht die Nachkommastellen angegeben, 0 würde also nur ganze cm weitergeben.
Kommentar