Füllstandmessung mit Ultraschall + UDP an Miniserver

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Patrick_92
    Extension Master
    • 17.09.2015
    • 119

    #16
    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

    Kommentar

    • jankir
      Smart Home'r
      • 24.02.2016
      • 32

      #17
      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

      Code:
      #include <ESP8266WiFi.h>
      #include <SoftwareSerial.h>
      #include <WiFiUdp.h>
      
      SoftwareSerial mySerial =  SoftwareSerial(4, 5);
      
      
      unsigned int reading;
      byte readByte;
      byte read_buffer[4];
      byte crcCalc;
      word distance;
      const char* MY_SSID = "xxx"; 
      const char* MY_PWD = "xxx";
      IPAddress ipBroadCast(192, 168, xxx, xxx);
      unsigned int udpRemotePort=xxx;
      unsigned int udplocalPort=xxx;
      const int UDP_PACKET_SIZE = 48;
      char udpBuffer[UDP_PACKET_SIZE];
      char chardistanz[10];
      WiFiUDP Udp;
      
      void setup() 
      {
      
        mySerial.begin (9600);
        Serial.begin (9600);
        for (byte loopstep = 0; loopstep <= 3; loopstep++) 
        {
          read_buffer[loopstep] = 0;
        }
        connectWifi();
      }
      
      void loop() {
        if (mySerial.available() < 1) {
          return;
        }
        readByte = mySerial.read();
      
        for (byte loopstep = 0; loopstep <= 2; loopstep++) {
          read_buffer[loopstep] = read_buffer[loopstep + 01];
        }
      
        read_buffer[03] = readByte;
      
        if (read_buffer[00] != 0xff) {
          return;
        };
      
        crcCalc = read_buffer[00] + read_buffer[01] + read_buffer[02];
        if (read_buffer[03] != crcCalc) {
          return;
        };
      
        distance = (read_buffer[01] * 0xff) + read_buffer[02];
      
      
        float dst = distance / 10.0;
        Serial.print(dst, 1);
        Serial.println(" cm");
        delay(5000);
        while (mySerial.available() > 0) {
          readByte = mySerial.read();
           dtostrf(dst, 4, 0, chardistanz);
          strcpy(udpBuffer, chardistanz); 
          
        Udp.beginPacket(ipBroadCast, udpRemotePort);
        Udp.write(udpBuffer, sizeof(udpBuffer));
        Udp.endPacket();
        }
      }
      void connectWifi()
      {
        Serial.print("Connecting to "+*MY_SSID);
        WiFi.begin(MY_SSID, MY_PWD);
        while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
        }
        
        Serial.println("");
        Serial.println("Connected");
        Serial.println("");  
      }//end connect

      Kommentar

      • Oli
        LoxBus Spammer
        • 25.08.2015
        • 293

        #18
        Hallo Arduino Profis,

        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.

        // 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;
        char 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 !=10);
        {
        // 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;
        }
        }
        if (verzo <10);
        verzo +1;
        Serial.println("verzo");


        delay(1000); // 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);
        }
        wie muss ich das Programm abändern dass der Teil nur alle x sec. ausgeführt wird? Habe da leider nichts im Internet gefunden.


        Danke für Eure Mühe
        Oli

        Kommentar

      • hismastersvoice
        Supermoderator
        • 25.08.2015
        • 7189

        #19
        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.

        Das if 10 muss dann in den 2 UDP Block.
        Kein Support per PN!

        Kommentar

        • Oli
          LoxBus Spammer
          • 25.08.2015
          • 293

          #20
          Das mit dem Counter habe ich ja bereits versucht, sind die fett markierten Bereiche, aber irgendwie will das so nicht klappen.

          Kommentar


          • hismastersvoice
            hismastersvoice kommentierte
            Kommentar bearbeiten
            Das geht genau einmal bis verzo auf 10 geht, dann musst du ihn zurücksetzten.
        • Oli
          LoxBus Spammer
          • 25.08.2015
          • 293

          #21
          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");
          Ja, habe ich eingebaut, aber der code läuft insgesamt nicht so.

          Kommentar


          • hismastersvoice
            hismastersvoice kommentierte
            Kommentar bearbeiten
            Ah hatte ich übersehen...

            Warum
            if (verzo !=10); nichtgleich 10

            müsste es nicht
            if (verzo ==10); heißen

            Sonst misst der von 0-9 aber nicht bei 10, und jetzt kommt wieder verzo =0 und wird zurückgesetzt.
            Denke du solltest es mal so versuchen.
        • Oli
          LoxBus Spammer
          • 25.08.2015
          • 293

          #22
          Habe jetzt verschiedene Änderungen durch, aber im Monitor kommt eigentlicht immer
          49.43 cm
          0
          49.74 cm
          0
          49.33 cm
          0
          keine Bewegung in Heizraum erkannt
          48.93 cm
          0
          49.43 cm
          0
          keine Bewegung in Treppenhaus erkannt
          48.93 cm
          0
          49.43 cm

          Code:
          // Variablen
          long dauer;
          float distanz;
          char chardistanz[10];
          char BewegungsmelderState1 = 0;
          char BewegungsmelderState2 = 0;
          char BewegungsmelderState3 = 0;
          char verzo = 1;
          Code:
          if (verzo == 10);
           {
            // 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 = 1;
            }
           }
           if (verzo < 10);
           verzo = verzo +1;
           Serial.println(!verzo);
          
              delay(1000); // 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);
            }
          Irgendwie lässt sich die Variabel verzo nicht ändern, sonst würde sie jetzt ja nicht bei 0 starten...

          Kommentar


          • hismastersvoice
            hismastersvoice kommentierte
            Kommentar bearbeiten
            das ist übrigens keine if
            if (verzo < 10);
            verzo = verzo +1;
            Serial.println(!verzo);

            müsste so aussehen

            if (verzo < 10) {
            verzo = verzo +1;
            Serial.println(!verzo);
            }

            Aber die brauchst du dar nicht.

            verzo++;
            Serial.println(!verzo);

            reicht.

          • Oli
            Oli kommentierte
            Kommentar bearbeiten
            Will nicht klappen

            Netzwerkdaten
            ---------------
            Arduino MAC: DE:AD:BE:EF:FEEB
            Arduino IP: 192.168.1.17
            Arduino UDP Port: 6000
            ---------------
            Miniserver IP: 192.168.1.3
            Miniserver UDP Port: 5000
            ---------------
            :Messung fehlerhaft!
            0
            49.30 cm
            0
            49.79 cm
            0
            49.30 cm
            0

          • hismastersvoice
            hismastersvoice kommentierte
            Kommentar bearbeiten
            Schick mir mal das ganze Prog per PN
        • Oli
          LoxBus Spammer
          • 25.08.2015
          • 293

          #23
          Für die die mal das gleich Problem haben, Dank hismastervoice läuft es jetzt wie gewollt

          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); }

          Kommentar

          • Gast

            #24
            @ hismastersvoice,

            Welches Ethernet Shield hast du verwendet?

            Kommentar

          • Oli
            LoxBus Spammer
            • 25.08.2015
            • 293

            #25
            Hallo Arduino Profis,

            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);
            }
            Danke!

            Kommentar

            • killeriq
              Smart Home'r
              • 18.09.2015
              • 91

              #26
              Hallo,

              Ich hab diese sensor im einsatz:
              https://www.aliexpress.com/item/Wate...787505580.html

              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.


              Angehängte Dateien

              Kommentar

              • challo
                LoxBus Spammer
                • 21.09.2016
                • 372

                #27
                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?

                Grüße challo
                Zuletzt geändert von challo; 03.08.2017, 22:29.

                Kommentar

              • challo
                LoxBus Spammer
                • 21.09.2016
                • 372

                #28
                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?

                Kommentar

                • patriwag
                  LoxBus Spammer
                  • 28.08.2015
                  • 436

                  #29
                  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.
                  seit 2016 im eigenen LoxHome

                  Kommentar


                  • hismastersvoice
                    hismastersvoice kommentierte
                    Kommentar bearbeiten
                    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.

                  • patriwag
                    patriwag kommentierte
                    Kommentar bearbeiten
                    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.
                • Roger-b
                  LoxBus Spammer
                  • 23.04.2016
                  • 223

                  #30
                  Hat jemand mal so ein Teil getestet..


                  Schau, was ich auf AliExpress gefunden






                  Gesendet von iPhone mit Tapatalk

                  Kommentar

                  Lädt...