Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eugenius
    antwortet
    Zitat von NorbertB Beitrag anzeigen
    Nachdem die Kommunikation mit dem Bus bei mir läuft stehe ich vor dem nächsten Problem.
    Telegramme zum Bus senden funktioniert klaglos, beim Empfangen stehe ich aber noch auf dem Schlauch.
    Code:
    #include <KnxTpUart.h>
    KnxTpUart knx(&Serial, "1.1.160");
    
    void setup() {
    Serial.begin(19200, SERIAL_8E1);
    ...
    }
    
    void loop() {...}
    
    void serialEvent1() {...}
    Im void loop() überprüfe ich nur ob die Bus-Kommunikation läuft.
    Im void serialEvent1() möchte ich, angelehnt an den Beispielsketch, Telegramme vom Bus empfangen.
    Die Zeile "knx.groupWrite2ByteInt("7/0/4",received_7_0_2);" dient nur als Rückmeldung zum Gruppenmonitor.
    Dort kommt allerdings nichts an
    Habt Ihr einen Tip für mich?
    ihr müsst langsam von SerialEvent weg. SerialEvent wird eh über Loop ausgeführt...
    https://github.com/arduino/ArduinoCo...o/main.cpp#L47
    https://github.com/arduino/ArduinoCo...al.cpp#L64-L78

    Jetzt zu deinem Problem: in setup gibst du Serial an, nutzt aber SerialEvent1 was zu Serial1 gehört...
    Du musst also SerialEvent nutzen. oder besser in der Loop:

    Code:
    if(Serial.available()){
    //inhalt von SerialEvent Funktion
    }

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Nachdem die Kommunikation mit dem Bus bei mir läuft stehe ich vor dem nächsten Problem.
    Telegramme zum Bus senden funktioniert klaglos, beim Empfangen stehe ich aber noch auf dem Schlauch.
    Code:
    #include <KnxTpUart.h>
    KnxTpUart knx(&Serial, "1.1.160");
    
    void setup() {
      Serial.begin(19200, SERIAL_8E1);
      Serial.println(UCSR0C, BIN);
      knx.uartReset();
      knx.addListenGroupAddress("7/0/2");
      knx.addListenGroupAddress("7/0/3");
    }
    
    void loop() {
      knx.groupWriteBool("7/0/1", true);
      delay (1000);
      knx.groupWriteBool("7/0/1", false);
      delay (1000);
    }
    
    void serialEvent1() {
      KnxTpUartSerialEventType eType = knx.serialEvent();
      if (eType == TPUART_RESET_INDICATION) {
        Serial.println("Event TPUART_RESET_INDICATION");
      } 
      else if (eType == UNKNOWN) {
        Serial.println("Event UNKNOWN");
      } 
      else if (eType == KNX_TELEGRAM) {
        Serial.println("Event KNX_TELEGRAM");
        KnxTelegram* telegram = knx.getReceivedTelegram();
        // Telegrammauswertung auf KNX (bei Empfang immer notwendig)
        String target =
          String(0 + telegram->getTargetMainGroup())   + "/" +
          String(0 + telegram->getTargetMiddleGroup()) + "/" +
          String(0 + telegram->getTargetSubGroup());
    
          if (target == "7/0/2") {
            int received_7_0_2 = telegram->get4BitIntValue();
            Serial.print("Empfangener Wert:");
            Serial.println(received_7_0_2);
            knx.groupWrite2ByteInt("7/0/4",received_7_0_2);
          }
    
          if (target == "7/0/3") {
            int received_7_0_3 = telegram->get4BitIntValue();
            Serial.print("Empfangener Wert:");
            Serial.println(received_7_0_3);
            knx.groupWrite2ByteInt("7/0/5",received_7_0_3);
          }
        }
    }
    Im void loop() überprüfe ich nur ob die Bus-Kommunikation läuft.
    Im void serialEvent1() möchte ich, angelehnt an den Beispielsketch, Telegramme vom Bus empfangen.
    Die Zeile "knx.groupWrite2ByteInt("7/0/4",received_7_0_2);" dient nur als Rückmeldung zum Gruppenmonitor.
    Dort kommt allerdings nichts an
    Habt Ihr einen Tip für mich?

    Einen Kommentar schreiben:


  • mfd
    antwortet
    Hat sich so angehört, als müsste die Hardware das dauerhaft liefern können.
    Mein größeres Problem ist ohnehin die Software...

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Wo ist der der Widerspruch zu dem, was ich geschrieben habe?

    Wenn Dein RFID in der Spitze 110mA zum Lesen benötigt, dann muss Deine Hardware das auch liefern können.

    Einen Kommentar schreiben:


  • mfd
    antwortet
    Zitat von dreamy1 Beitrag anzeigen
    Das Hardwaredesign muss ohnehin den größtmöglichen Energieverbrauch abdecken können.
    Ich sehe das von der anderen Seite her. Ich kann nur eine bestimmte Menge an Strom verbrauchen, mehr darf nicht. Ich kann doch auch die Software so auslegen, dass das eingehalten wird, oder verstehe ich da was falsch?
    Es gibt IMHO Schaltaktoren die ab einer bestimmten Schalthäufigkeit begrenzen (müssen) weil sonst die dicken Relais den erlaubten Strombedarf übersteigen, bzw. die verbauten Elkos das nicht hergeben. Da muss doch auch Software auf Hardware abgestimmt sein bzw. umgekehrt.

    Ich habe zwischenzeitlich eine alternative Lib gefunden, der Programmierer geizt auch nicht mit Kritik an der ursprünglichen Version von Adafruit.
    Zumindest wird hier das Thema Stromsparen richtig berücksichtigt.
    In seiner PN532.cpp steht:
    Turns the RF field off.
    When the field is on, the PN532 consumes approx 110 mA
    When the field is off, the PN532 consumes approx 18 mA
    The RF field is turned on again by ReadPassiveTargetID().
    Leider ist der Beispielsketch alles andere als brauchbar für mein Vorhaben.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    In der Lib sind jedenfalls Powerdown-Befehle enthalten, die werden in den Beispielen aber wohl nicht genutzt. Ich würde das erstmal versuchen, das Ganze ohne Nutzung von Sleepmodes zuverlässig ans Laufen zu bekommen - die Sleepmodes kann man ja auch noch nachträglich implementieren. Das Hardwaredesign muss ohnehin den größtmöglichen Energieverbrauch abdecken können.

    Einen Kommentar schreiben:


  • mfd
    antwortet
    Ja, die Intelligenz der Geräte ist natürlich nicht mit der aus den 90igern zu vergleichen, das stimmt.
    Zum Thema:
    Der PN532 beherrscht auf jeden Fall Stromspartechniken. Das Handbuch widmet dem Stromsparen ein ganzes Kapitel.
    Nur ist es für den Programmieranfänger nicht so einfach nachzuvollziehen ob davon überhaupt etwas mit der vorhandenen Library umsetzbar ist.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Da bin ich voll bei Dir, ein Busgerät sollte immer nur so viel Energie verbrauchen wie unbedingt notwendig :-)

    Es ist dann halt die Frage, ob die verbaute Hardware Stromspartechniken beherrscht oder nicht, diese sollten dann natürlich auch genutzt werden (Sleep-Funktionen, getaktetes Einschalten). Ob jedoch ein Kondensator in 0806er SMD-Baugröße oder als THT-Klopper eingesetzt ist, ist i.d.R. für den Stromverbrauch egal. Die "alten", großen Geräte haben da oft auch deutlich weniger Intelligenz onboard (und die kostet Energie), deshalb hinkt der Vergleich da etwas.

    Einen Kommentar schreiben:


  • mfd
    antwortet
    Zitat von dreamy1 Beitrag anzeigen
    Also wo liegt das Problem?
    Habe ich eine Zeile drunter schon geschrieben. Ich möchte weniger verbrauchen, weil unnötig hoher Stromverbrauch, gerade bei Busgeräten, nicht sein muss.
    Die Uralt-Aktoren aus den 90igern kommen busseitig teilweise mit weniger als 4mA im Leerlauf aus obwohl da im Vergleich noch richtige "Hochhäuser" an Bauteilen verbaut sind, sowas kann man sich ja mal als Vorbild nehmen.

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Zu spät

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Gerne :-)

    Aber Achtung: das wird ab dem Zeitpunkt ein Virus, der Dich so schnell nicht loslässt...genau so hats bei mir auch angefangen :-)

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Code:
    UCSR0C = UCSR0C | B00100000;
    Danke, läuft

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Das auf der ersten Seite ist kein lauffähiger Code, u.a. muss dem UART noch even parity beigebracht werden. Schau mal in die Beispiele auf der verlinkten Seite im ersten Post, wo die Lib abliegt.

    Einen Kommentar schreiben:


  • NorbertB
    antwortet
    Ich versuche mich gerade an die Kommunikation zwischen Arduino und KNX ranzutasten.
    Dafür habe ich, wie im ersten Post dieses Monsterthreads, einen Uno mit einer BCU 5WG1 117-2AB12 verbunden. Dann einen einfachen Sketch zum Testen rauf:
    Code:
    #include <KnxTpUart.h>
    KnxTpUart knx(&Serial, "1.1.160");
    
    void setup() {
      Serial.begin(19200);
      knx.uartReset();
    }
    
    void loop() {
      knx.groupWriteBool("7/0/1", true);
      delay (1000);
      knx.groupWriteBool("7/0/1", false);
      delay (1000);
    }
    Im Gruppenmonitor sehe ich allerdings kein einziges Telegramm
    Im seriellen Monitor allerdings schon.
    Kann es sein, dass das gar nicht mit dem Uno funktioniert???
    Oder was könnte ich noch falsch machen?

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Zitat von mfd Beitrag anzeigen
    Allerdings hätte ich gern <50 mA. Das wäre noch besser in der Spezifikation, auch von der BCU.
    .
    Der Siemens BCU kann innerhalb der Spezifikation (!!!) bis zu 650mW Leistung entnommen werden. Also wo liegt das Problem?

    Einen Kommentar schreiben:

Lädt...
X