INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
20.01.2019, 18:37
Beitrag #1
Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
Ich den Füllstand in einem Drainageschacht überwachen. Ziel soll es sein über den Ultraschallsensor den Füllstand zu erfassen und darüber die Pumpe zu steuern. Die Werte für den Füllstand und den Pumpenstatus möchte ich auf den KNX-Bus gesendet haben. Ausserdem sollen vom Bus Minimal- und Maximal-Wert, sowie eine Pumpen-Zwangsschaltung gesetzt werden können.
Dafür habe ich mir 2 Programme geschrieben (1. Setzen der Sollwerte, 2. Füllstandsmessung und Pumpensteuerung), die unabhangig voneinander auch funktionieren. Nur wenn ich sie in einen Sketch zusammen bringen möchte ist das Verhalten nichtmehr das erwartete.

Hier mal der Sketch zum Setzen der Sollwerte:
Code:
#include <KnxTpUart.h>
KnxTpUart knx(&Serial, "1.1.160");

int pumpe = 10;

void setup() {
  pinMode(pumpe, OUTPUT);
  digitalWrite(pumpe, LOW);

  Serial.begin(19200, SERIAL_8E1);
  Serial.println(UCSR0C, BIN);
  knx.uartReset();
  knx.addListenGroupAddress("7/0/2");
  knx.addListenGroupAddress("7/0/3");
  knx.addListenGroupAddress("7/0/4");
}

void loop() {
  KnxTpUartSerialEventType eType = knx.serialEvent();
  if (eType == TPUART_RESET_INDICATION) {
  }
  else if (eType == UNKNOWN) {
  }
  else if (eType == KNX_TELEGRAM) {
    KnxTelegram* telegram = knx.getReceivedTelegram();

    String target =
      String(0 + telegram->getTargetMainGroup())   + "/" +
      String(0 + telegram->getTargetMiddleGroup()) + "/" +
      String(0 + telegram->getTargetSubGroup());

    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
      if (target == "7/0/2") {
        int received_7_0_2 = telegram->get2ByteIntValue();
        if (received_7_0_2) {
        knx.groupWrite2ByteInt("7/0/7",received_7_0_2);
        }
      }
      if (target == "7/0/3") {
        int received_7_0_3 = telegram->get2ByteIntValue();
        if (received_7_0_3) {
        knx.groupWrite2ByteInt("7/0/6",received_7_0_3);
        }
      }
      if (target == "7/0/4") {
        int received_7_0_4 = telegram->getBool();
        knx.groupWriteBool("7/0/5",received_7_0_4);
        if (received_7_0_4) {
          digitalWrite(pumpe, HIGH);
          knx.groupWriteBool("7/0/5",1);
        }
        else {
          digitalWrite(pumpe, LOW);
          knx.groupWriteBool("7/0/5",0);
        }
      }
    }
  }
}

Bedeutung der KNX-GAs:
7/0/0 - Pumpe (ein / aus)
7/0/1 - Füllstand (Abstand vom Ultraschallsensor zur Wasseroberfläche)
7/0/2 - Sollwert für "Pumpe aus"
7/0/3 - Sollwert für "Pumpe ein"
7/0/4 - Zwangsschaltung Pumpe
7/0/5 - Rückmeldeadresse Zwangsschaltung
7/0/6 - Rückmeldung für "Pumpe ein"
7/0/7 - Rückmeldung für "Pumpe aus"

Der Sketch zum messen des Füllstandes und steuern der Pumpe:
Code:
#include <KnxTpUart.h>
KnxTpUart knx(&Serial, "1.1.160"); // 1.1.160 ist die KNX-Source-Adresse

int trigPin = 8;
int echoPin = 9;
int pumpe = 10; // zum Schalten des Pumpen-Relais

unsigned int dauer, abstand;
unsigned int voll = 20;
unsigned int leer = 40;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(pumpe, OUTPUT);

  // Set KNX Serial to Even parity
  Serial.begin(19200, SERIAL_8E1);
  Serial.println(UCSR0C, BIN);
  knx.uartReset();
}

void loop() {
  Steuerung();
}

void Steuerung() {
  digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);
  dauer = pulseIn(echoPin, HIGH);

  abstand = (dauer/2) / 29.1;

  if (abstand != 0) bool success = knx.groupWrite2ByteInt("7/0/1",abstand);
    
  if (abstand < voll)
  {
    knx.groupWriteBool("7/0/0",1);
    digitalWrite(pumpe, HIGH); // Pumpe ein
  }
  if (abstand > leer)
  {
    knx.groupWriteBool("7/0/0",0);
    digitalWrite(pumpe, LOW); // Pumpe aus
  }

  delay(2000);   //ms
}

Wie gesagt, diese beiden Sketches funktionieren für sich alleine fehlerfrei.

Hier habe ich versucht beide zusammenzuführen:
Code:
#include <KnxTpUart.h>
KnxTpUart knx(&Serial, "1.1.160"); // 1.1.160 ist die KNX-Source-Adresse

int trigPin = 8;
int echoPin = 9;
int pumpe = 10; // zum Schalten des Pumpen-Relais

unsigned int dauer, abstand;
unsigned int voll = 20;
unsigned int leer = 40;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(pumpe, OUTPUT);
  digitalWrite(pumpe, LOW);

  Serial.begin(19200, SERIAL_8E1);
  Serial.println(UCSR0C, BIN);
  knx.uartReset();
  knx.addListenGroupAddress("7/0/2");
  knx.addListenGroupAddress("7/0/3");
  knx.addListenGroupAddress("7/0/4");
}

void loop() {
  sollwerte();
  digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);
  dauer = pulseIn(echoPin, HIGH);

  abstand = (dauer/2) / 29.1;

  if (abstand != 0) bool success = knx.groupWrite2ByteInt("7/0/1",abstand);
    
  if (abstand < voll)
  {
    knx.groupWriteBool("7/0/0",1);
    digitalWrite(pumpe, HIGH); // Pumpe ein
  }
  if (abstand > leer)
  {
    knx.groupWriteBool("7/0/0",0);
    digitalWrite(pumpe, LOW); // Pumpe aus
  }

  delay(2000);   //ms
}

void sollwerte() {
  KnxTpUartSerialEventType eType = knx.serialEvent();
  if (eType == TPUART_RESET_INDICATION) {
  }
  else if (eType == UNKNOWN) {
  }
  else if (eType == KNX_TELEGRAM) {
    KnxTelegram* telegram = knx.getReceivedTelegram();

    String target =
      String(0 + telegram->getTargetMainGroup())   + "/" +
      String(0 + telegram->getTargetMiddleGroup()) + "/" +
      String(0 + telegram->getTargetSubGroup());

    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
      if (target == "7/0/2") {
        int received_7_0_2 = telegram->get2ByteIntValue();
        if (received_7_0_2) {
          voll = received_7_0_2;
          knx.groupWrite2ByteInt("7/0/7",voll);
        }
      }

      if (target == "7/0/3") {
        int received_7_0_3 = telegram->get2ByteIntValue();
        if (received_7_0_3) {
          leer = received_7_0_3;
          knx.groupWrite2ByteInt("7/0/6",leer);
        }
      }
      if (target == "7/0/4") {
        int received_7_0_4 = telegram->getBool();
        knx.groupWriteBool("7/0/5",received_7_0_4);
        if (received_7_0_4) {
          digitalWrite(pumpe, HIGH);
          knx.groupWriteBool("7/0/5",1);
        }
        else {
          digitalWrite(pumpe, LOW);
          knx.groupWriteBool("7/0/5",0);
        }
      }
    }
  }
}

Hier werden keine Änderungen der Sollwerte mehr übernommen (laut Rückmelde-GAs).
Da ich nur einen Pro Mini habe kann ich kein seriellen Monitor beobachten um zu sehen wo es klemmt Huh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2019, 18:52
Beitrag #2
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
Ich kenne mich mit knx nicht aus.

Was mich aber wundert, dass Du nur die 3 listen drin hast. Du hast im Text doch noch mehr beschrieben.
Code:
knx.addListenGroupAddress("7/0/2");
  knx.addListenGroupAddress("7/0/3");
  knx.addListenGroupAddress("7/0/4");

Wie gesagt, dass muss nichts zu sagen haben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2019, 19:06
Beitrag #3
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
Als knx.addListenGroupAddress werden nur die Gruppenadressen definiert, die vom KNX-Bus zum Arduino senden sollen.
Die Library ist von hier: https://bitbucket.org/thorstengehrig/ard...ser-forum.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2019, 22:13 (Dieser Beitrag wurde zuletzt bearbeitet: 22.01.2019 22:13 von hotsystems.)
Beitrag #4
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
Zitat:Da ich nur einen Pro Mini habe kann ich kein seriellen Monitor beobachten um zu sehen wo es klemmt.

Wieso kannst du am seriellen Monitor nichts beobachten ?
Wie hast du den denn geflasht ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 17:38
Beitrag #5
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
(22.01.2019 22:13)hotsystems schrieb:  
Zitat:Da ich nur einen Pro Mini habe kann ich kein seriellen Monitor beobachten um zu sehen wo es klemmt.

Wieso kannst du am seriellen Monitor nichts beobachten ?
Wie hast du den denn geflasht ?

Zum flashen muss ich die Verbindung zum KNX-Bus trennen, der verwendet die serielle Schnittstelle zur Kommunikation.
Deshalb habe ich bei Bus-Verbindung keine serielle Konsole, es sei denn man verwendet einen Mega oder Zero.

Zu meinem eigentlichen Problem habe ich im KNX User Forum den Hinweis bekommen mit millis() anstatt mit delay() zu arbeiten.
Das wirkt in diesem Fall Wunder Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 18:16
Beitrag #6
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
Du kannst doch sicher auch SoftwareSerial für den KNX-Bus verwenden.
Da kannst du beliebige digitale Pins verwenden.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 18:42
Beitrag #7
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
(23.01.2019 17:38)NorbertB schrieb:  Zu meinem eigentlichen Problem habe ich im KNX User Forum den Hinweis bekommen mit millis() anstatt mit delay() zu arbeiten.
Das wirkt in diesem Fall Wunder Big Grin
Sorry, das musst du mir bitte erklären, besonders warum es Wunder wirkt!

In der heutigen Zeit ist gesunder Menschenverstand so etwas Ähnliches wie eine Superkraft - aber keine nützliche.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2019, 19:05
Beitrag #8
RE: Füllstandsmessung mit Pumpensteuerung und KNX-Anbindung
(23.01.2019 18:42)Vapalus schrieb:  Sorry, das musst du mir bitte erklären, besonders warum es Wunder wirkt!

Naja, weil's damit einfach funktioniert Wink
delay() sorgt dafür, dass der Arduino praktisch nichts mehr tut, als die Wartezeit abzuwarten.
Mit Hilfe von millis() baut man sich eine Schleife, von der der Rest des Programms unbeeindruckt weiterläuft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Pumpensteuerung für Warmwasser Ringleitung Franz54 97 21.376 12.11.2018 22:12
Letzter Beitrag: hotsystems
  Aquarien / Lüfter / Pumpensteuerung malerlein 0 3.470 14.01.2014 15:01
Letzter Beitrag: malerlein

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste