Um bei unserer Zisterne den aktuellen Füllstand zu erfassen habe ich mit einfachen Mitteln einen Ultraschall-Sensor gebaut, welche via 1-Wire mit dem Miniserver kommuniziert.
Hardware
1 x Arduino Nano oder dgl.
1 x HC SR04T Ultraschallsensor (Messbereich: 2cm - 450cm)
1 x 12V Spannungsversorgung (zB.: LM317 Spannungswandler oder Extra Netzteil 12V)
Elektrische Verbindungen (Schaltung)
HCSR04T zu Arduino
VCC -> 5V
Trig -> Pin 3
Echo -> Pin 2
GND -> GND
1-Wire Extension zu Arduino
DQ -> Pin 6
GND -> GND
VCC -> 5V
Hinweis: Ich empfehle statt VCC der 1-Wire Extension einen gesonderte Spannungsquelle zu verwenden (7-12V via VIN am Arduino) da der maximale Strom von 50mA der 1-Wire Extension knapp erreicht wird. Daher könnten es möglicherweise Probleme mit anderen Sensoren geben. Bei mir funktioniert es bislang mit 15 weiteren DS18B20 Sensoren, aber es sei gesagt, dass das Extension-Limit erreicht ist!
Arduino Code
Folgende Arduino-Bibliothek wird benötigt: https://github.com/orgua/OneWireHub/
// benoetigte Bibliotheken #include "OneWireHub.h" #include "DS18B20.h" // Digital Thermometer, 12bit // Define Trig and Echo pin: #define trigPin 3 #define echoPin 2 #define pin_onewire 6 #define pin_led 13 // Define variables: long duration; float distance; float temperature; auto hub = OneWireHub(pin_onewire); auto ds18b20 = DS18B20(DS18B20::family_code, 0x00, 0x00, 0xB2, 0x18, 0xDA, 0x00); // DS18B20: 9-12bit, -55 - +85 degC bool blinking(void); void setup() { Serial.begin(9600); Serial.println("OneWire-Hub DS18B20 Temperature-Sensor"); Serial.flush(); pinMode(pin_led, OUTPUT); // Define inputs and outputs für messung pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Setup OneWire hub.attach(ds18b20); Serial.println("config done"); } void loop() { // following function must be called periodically hub.poll(); // this part is just for debugging (USE_SERIAL_DEBUG in OneWire.h must be enabled for output) if (hub.hasError()) hub.printError(); // Blink triggers the state-change if (blinking()) { // Messung beginnt: // Clear the trigPin by setting it LOW: digitalWrite(trigPin, LOW); delayMicroseconds(5); // Trigger the sensor by setting the trigPin high for 10 microseconds: digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the echoPin. pulseIn() returns the duration (length of the pulse) in microseconds: duration = pulseIn(echoPin, HIGH); // Calculate the distance: distance = duration*0.034/2; // Set temp if ((distance != 0) && (distance <= 450)) { //Messfehler ignorieren: temperature = (distance/4)-50; // das Messbereich von 0-400 cm wird in -50 bis +50 umgerechnet } else { Serial.println("Messfehler! Wert wurde nicht geändert!"); } ds18b20.setTemperature(temperature); Serial.println(distance); Serial.println(temperature); } } bool blinking(void) { constexpr uint32_t interval = 1000; // interval at which to blink (milliseconds) static uint32_t nextMillis = millis(); // will store next time LED will updated if (millis() > nextMillis) { nextMillis += interval; // save the next time you blinked the LED static uint8_t ledState = LOW; // ledState used to set the LED if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(pin_led, ledState); return 1; } return 0; }
Der Ultraschallsensor sendet ein Schallsignal aus und misst die Zeit bis es wieder zurück kommt.
Anhand der Zeit wird die Entfernung in cm ermittelt.
Der Arduino simuliert einen 1-Wire Temperaturfühler DS18B20 weshalb die cm in dessen Range als Temperatur an den Miniserver gesendet wird.
Hierzu wird in diesem Beispiel die Temperatur wie folgt umgewandelt:
d Distanz in cm | t Temperatur in °C |
0 | -50 |
100 | -25 |
200 | 0 |
300 | +25 |
400 | +50 |
Die Korrektur im Miniserver erfolgt bei den Eigenschaften des 1-Wire-Temperatur Eingangs
Die Miniserver-Config
Im Miniserver wird nach dem 1-Wire Fühler gesucht, dieser hinzugefügt und die Temperatur wieder in cm umgerechnet.
Umrechnung in Prozent:
Mit folgender Formel wird aus Distanz, Zisterne Voll und Zisterne Leer die Prozente ermittelt.
((I2-I3)-(I1-I3))*100/(I2-I3)
((max.Wasser)-(Wasserstand))*100/(max. Wasser)
Umrechnung in Liter
Nach einer MinMax-Begrenzung (0-100%) erfolgt die Umrechnung von Prozent in Liter mit einem Skalierer-Baustein.
Montage:
Nach der Montage des Sensors sind folgende Werte (In diesem Beispiel als Konstanten) anzupassen:
- Zisterne Leer: Abstand von Sensor zum Boden der Zisterne (zB. 250)
- Zisterne Voll: Abstand von Sensor zu maximalen Wasseroberfläche (zB. 50)
Kommentar