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