Füllstandmessung mit Ultraschall via Arduino und 1-Wire Emulator an Miniserver

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • KultGrazer
    Smart Home'r
    • 27.11.2015
    • 32

    Füllstandmessung mit Ultraschall via Arduino und 1-Wire Emulator an Miniserver

    - In Anlehnung an hismastersvoice Projekt: Füllstandmessung mit Ultraschall + UDP an Miniserver

    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

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Schaltplan HC-SR04_Steckplatine.png Ansichten: 102 Größe: 85,1 KB ID: 244810
    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/

    Code:
    // 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;
    }
    Wie funktioniert es
    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
    Dies ergibt folgende Formel für den Arduino: t = (d/4)-50

    Die Korrektur im Miniserver erfolgt bei den Eigenschaften des 1-Wire-Temperatur Eingangs

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: eigenschaften 1-wire-Eingang.png Ansichten: 0 Größe: 33,1 KB ID: 244666
    Die Miniserver-Config
    Im Miniserver wird nach dem 1-Wire Fühler gesucht, dieser hinzugefügt und die Temperatur wieder in cm umgerechnet.

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: config.png Ansichten: 0 Größe: 28,2 KB ID: 244667

    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.

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: skalierer.png Ansichten: 0 Größe: 9,2 KB ID: 244668
    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)
    Viel Spaß mit der Umsetzung und LG
    Angehängte Dateien
    Zuletzt geändert von KultGrazer; 20.04.2020, 01:23.
  • Gagi
    LoxBus Spammer
    • 20.01.2018
    • 289

    #2
    Cool bei mir liegt eigentlich genau die gleiche Hardware rum um nenn temp + humidity sensor für die Sauna über 1-wire anzubinden.

    Die Füllstandsmessung ist auch schon geplant, dann aber über Modbus ;-)


    Gesendet von iPhone mit Tapatalk

    Kommentar

    • KultGrazer
      Smart Home'r
      • 27.11.2015
      • 32

      #3
      Und So sieht das Ganze dann mit Spannungswandler LM317 (24V auf 9V) fertig aus! :-D


      Die Pin's haben sich nochmal geändert, sonst klappt alles perfekt :-D

      Klicke auf die Grafik für eine vergrößerte Ansicht  Name: IMG_5618.jpg Ansichten: 0 Größe: 1,09 MB ID: 245344Klicke auf die Grafik für eine vergrößerte Ansicht  Name: IMG_5623.jpg Ansichten: 0 Größe: 1,48 MB ID: 245345Klicke auf die Grafik für eine vergrößerte Ansicht  Name: IMG_5619.jpg Ansichten: 0 Größe: 1,95 MB ID: 245346Klicke auf die Grafik für eine vergrößerte Ansicht  Name: IMG_5620.jpg Ansichten: 0 Größe: 2,42 MB ID: 245348 Klicke auf die Grafik für eine vergrößerte Ansicht  Name: beschriftet.jpg Ansichten: 0 Größe: 1,08 MB ID: 245356
      Zuletzt geändert von KultGrazer; 19.04.2020, 20:55.

      Kommentar

      • Hesch@
        Extension Master
        • 31.08.2015
        • 193

        #4
        Hallo KultGrazer,

        bei mir läuft seit 5 Jahren ein Ultraschallsensor Typ UB6000-F42 von Pepperl+Fuchs zur Füllstandsmessung in der Zisterne. War nicht ganz billig.
        Wenn der mal defekt geht, kommt auf jeden Fall deine Bauanleitung zum Einsatz.

        Vielen Dank für die detaillierte Beschreibung.

        Kommentar


        • KultGrazer
          KultGrazer kommentierte
          Kommentar bearbeiten
          Das ist doch der selbe den Loxone verkauft, der wird hoffentlich nie kaputt! :-D Aber danke für die Anerkennung :-D
      • Klartext
        LoxBus Spammer
        • 25.08.2015
        • 426

        #5
        Hallo,

        funktioniert mit den gleichen Programm auch der HC-SR04 (ohne T)
        bin leider ein Ardiuino DAU, möchte ihn für die Brieferkennung einsetzen

        Danke

        Kommentar


        • KultGrazer
          KultGrazer kommentierte
          Kommentar bearbeiten
          Ja Klar... arbeiten mit den selben daten...
      Lädt...