Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Das Ganze hat mit Rundungsfehlern nichts zu tun. Das ist eher die Genauigkeit der Hex-Werte in der Darstellung wie du oben schon selber sehen konntest in der ETS.
    Ob du nun 997,08 Pa oder 997,1 Pa nimmst, es wird immer 997,12Pa heraus kommen. Das letzte Bit löst die Nachkommastelle einfach nicht genauer auf.
    Kannst ja spasseshalber mal schauen ab wann auf den nächsten krummen Wert springt.

    Kommentar


      Danke für die Diskusionen hier. Die haben mir sehr geholfen

      Eine Frage: Die PA, die ich bei der lib von ThorstenGehrig angebe. Das Busankoppler agiert dann dem Bus gegenüber als dieser Teilnehmer richtig? Den Busankoppler muss man nicht programmieren (weil die Programmierung ja quasi der Code des Arduinos macht)?

      Bin nur verwirrt über diesen beispielcode, der bei der Lib beiliegt:
      arduino-tpuart-knx-user-forum/LearnKNXAddress.ino at main · thorsten-gehrig/arduino-tpuart-knx-user-forum · GitHub
      Zuletzt geändert von bernji; 11.02.2023, 13:49.

      Kommentar


        Nein, die PA muss wohl im Busankoppler nicht programmiert werden, hab ich mir sagen lassen. Die gibst du ja im Code mit an. Ich weiß nicht, ob im Fall, dass du vom Bus Anfagen absendest, es eine Version gibt, wo du das brauchst aber eigentlich nicht.
        Es gab mal bei GitHub Beispiele, wo die verschiedenen Datenflußrichtungen beschrieben waren. Die waren sehr verständlich und man gab glaube ich nur die PA im Code an und alles funktionierte.

        Ich sehe gerade das sind ja die examples auf GitHup, die ich meine.
        Zuletzt geändert von Charls; 11.02.2023, 17:41.

        Kommentar


          Eine Frage:

          Ich habe in den Examples gesehen, dass der Telegramme in der serialEvent() methode gelesen werden.
          Fehlt hier nicht irgendeine Schleife, falls sich mehrere Telegramme im Buffer befinden? Oder wird serialEvent öfter aufgerufen, wenn mehrere Telegramme angekommen sind?

          Ich habe eine Beobachtung gemacht: Es gibt zwei Werte, die immer zur gleichen Zeit in den Bus geschrieben werden. Ich bekomme aber immer nur eine. Meine Vermutung ist, dass die Lib immer nur den ersten Wert liefert und die Restlichen "unterschlagen" werden. Da sie gleichzeitig geschrieben werden, ist es eine racing condition und mehr oder weniger Zufall welchen Wert die Lib liefert.

          Habe zusätzlich gesehen, dass die Lib von ThorstenGehrig seit 3 Jahren keinen Commit mehr hat.

          netzlaff scheint das selbe Problem gehabt zu haben ARDUINO am KNX - KNX-User-Forum
          Zuletzt geändert von bernji; 14.02.2023, 11:04.

          Kommentar


            Siehe in der Dokumentation: https://www.arduino.cc/reference/en/...l/serialevent/

            Dort steht "Called at the end of loop() when data is available.".

            Je nachdem wie lange du nun im loop hängst dauert das also mal mehr und mal weniger lange. Je nachdem wie groß der Buffer nun ist passen da mal mehr und mal weniger Nachrichten rein.

            Ich habe an der library noch einige Änderungen im Bezug auf die Datentypen vorgenommen (das alles mit Strings zu machen ist schon extrem unperformant), sehe das Problem bei mir aber nicht (habe aber auch einen kurzen loop).
            Zuletzt geändert von Flole; 14.02.2023, 11:28.

            Kommentar


              Edit:
              Verstehe. Ich benutze ein e-ink display um die KNX-Werte anzuzeigen. Ich aktualisiere das Display alle 3 Minuten.
              Dieser eine Durchlauf der loop Methode dauert ein bisschen länger (weil e-inks nun mal leider langsam updaten).
              Die restlichen Durchläufe der loop sind aber sehr schnell, weil nur da nichts wesentliches gemacht wird (ich überprüfe ob 3 min vergangen sind durch 1x millis() und ein if)

              Trotzdem sehe ich manche Werte einfach trotzdem nicht. Es gibt 2 Werte die gleichezitig alle 30 Sekunden geupdated werden. Werte sehe ich meistens nur bei einem. Der Andere ist meistens "0". Welcher von beiden den Wert bekommt ist mehr oder weniger Random.

              Klar kann es sein, dass ich in dem längeren Loop Durchlauf ein paar Werte nicht bekomme. Trotzdem sollte ich in den 3 Minuten maximal 6x oder zumindest 5x Werte für die Datenpunkte bekommen

              P.S. Auf meinem Bus ist viel los. Eventuell ist es trotz kurzer Loops einfach zu viel für den Buffer und da sind 99% einfach sachen drin, die durch die Lib einfach wieder verworfen werden?!
              Zuletzt geändert von bernji; 14.02.2023, 13:05.

              Kommentar


                Was für einen Arduino nutzt du? Hast du die Optimierung schon auf höchste Geschwindigkeit gestellt?

                Eventuell kann man mit Interrupts das ganze noch verbessern.

                Kommentar


                  Hallo zusammen,

                  Ich versuche mich gerade daran, einen Arduino (Mega) in ein KNX System zu integrieren.
                  Daten vom Arduino ins KNX System zu senden habe ich bereits hinbekommen, die Hardware Verbindung scheint also in Ordnung zu sein.
                  Probleme macht mir aktuell nur das Empfangen/Auswerten/Weiterverarbeiten von Daten vom KNX System auf dem Arduino.

                  Ich würde gerne Daten von bestimmten Gruppenadressen auf dem Arduino als Variablen abspeichern bzw. diese für weitere Logiken nutzen. Eigentlich habe ich den Code für das Empfangen/Weiterverarbeiten der Daten aus der verwendeten Bibliothek (gefühlt) korrekt implementiert, da diverse andere User im Internet es genauso gemacht haben, allerdings bekomme ich die Daten trotzdem nicht mit dem Arduino ausgelesen.
                  Das ganze soll später noch deutlich komplexer werden, da ich aktuell aber das Empfangen/Weiterverarbeiten noch nicht korrekt hinbekomme, hier erstmal mein aktueller einfacher Beispielcode:

                  Code:
                  #include <KnxTpUart.h>
                  #define Physical_Adress "1.1.25"
                  #define Nitrat_Group_Adress "1.1.21"
                  
                  KnxTpUart knx(&Serial1, Physical_Adress);
                  void setup() {
                  Serial.begin(9600);
                  Serial1.begin(19200, SERIAL_8E1);
                  knx.uartReset();
                  knx.addListenGroupAddress(Nitrat_Group_Adress); // Nitrat Gruppenadresse
                  }
                  float Nitrat_Value = 0;
                  
                  void Nitrat_Value_Evaluation () {
                  if (Nitrat_Value > 0) Serial.print("Wert Empfangen");
                  }
                  void loop() {
                  maintainKnxSerial();
                  Nitrat_Value_Evaluation();
                  }
                  void maintainKnxSerial() {
                  if (Serial1.available() > 0) {
                  KnxTpUartSerialEventType eType = knx.serialEvent();
                  if (eType == KNX_TELEGRAM) {
                  KnxTelegram* telegram = knx.getReceivedTelegram();
                  // Create the KNX String Address in the "0/0/0" format
                  String target =
                  String(0 + telegram->getTargetMainGroup()) + "/" +
                  String(0 + telegram->getTargetMiddleGroup()) + "/" +
                  String(0 + telegram->getTargetSubGroup());
                  // Check what has been sent on KNX and write it into variables/arrays
                  if (telegram->getCommand() == KNX_COMMAND_WRITE) {
                  if (target == Nitrat_Group_Adress) {
                  Nitrat_Value = telegram->get2ByteFloatValue();
                  }
                  }
                  }
                  }
                  }​

                  Wenn ich dann im KNX System einen Wert auf der Gruppenadresse für den Nitrat-Wert schreibe, tut sich jedoch nichts und ich bin ratlos, wo der Fehler liegt.

                  Über jede Hilfe wäre ich sehr dankbar!

                  Grüße, Sebastian
                  Zuletzt geändert von seba1997; 06.12.2023, 12:46.

                  Kommentar


                    Zum einen vergleichst du Strings auf eine Art und Weise wie man keine Strings vergleichen kann, und zum anderen kannst du mit mehr Ausgaben den Fehler auch selber finden, du schaust dadurch einfach wie weit du im Code kommst. Also kommt was an der seriellen Schnittstelle an? Ist es das erwartete Telegram/Command? Wenn nicht, was ist es dann?

                    Noch ein Tipp aus der Praxis: Versuch auf Strings zu verzichten wo es geht. Insbesondere wenn du eigentlich Zahlen vergleichen willst.

                    Kommentar


                      Danke schonmal für deine Antwort Flole.

                      Was genau meinst du damit, dass ich Strings auf eine Art und Weise vergleiche, wie man es nicht kann?
                      Den Teil mit den Strings (Main/Middle/Sub Group) braucht man angeblich immer genau so für das Auslesen von Telegrammen. So steht es in der Bibliothek und ich habe es auch bei zahlreichen anderen Usern im Internet genau so 1:1 gesehen.

                      Ich hatte schon mehrere Serial.prints zum debuggen eingebaut, jedoch ist generell nie etwas angekommen. Ich hatte z.B. folgende Zeile eingebaut:

                      Code:
                      void maintainKnxSerial() {
                        if (Serial1.available() > 0) {
                          Serial.print("Serial available");
                      // Rest des Codes​
                      Ich habe trotzdem in der IDE nichts zurück bekommen, wenn ich im KNX System einen Wert auf der besagten Gruppenadresse geschrieben habe. Daher schien es mir eher ein grundlegendes Problem bei der Kommunikation zu sein, weshalb ich mich an euch hier im Forum gewendet habe....

                      Kommentar


                        Vergiss was ich zu dem Strings gesagt hab, ich war gedanklich bei einer anderen Art von Strings. Nicht besonders performant ist das ganze so dennoch, daher bietet es sich an die Werte als Zahlen zu vergleichen, also im Prinzip sowas wie
                        HTML-Code:
                        if(getTargetMainGroup() == NITRAT_MAINGROUP && getTarget.....
                        ​​​​​Wenn du dir den Speicherverbrauch der beiden Versionen anschaust und mal vergleichst siehst du was ich meine Bei einem Mega vielleicht nicht unbedingt ein Problem, aber lieber gleich richtig lernen als später überall die riesen Arduino Mega verbauen zu müssen weil der Code so riesig wird. Die library ist da zugegeben etwas blöd geschrieben, die Version die ich nutze habe ich mal so verändert, dass sie gar keine Strings mehr nutzt.

                        Bist du dir sicher, dass die group address oben beim define mit Punkten getrennt werden muss? Versuch es doch mal mit Schrägstrichen.

                        Kommentar


                          Ich schalte mich mal hier mit ein. Bei mir gleiches Problem. Habe ein Skript laufen, welches problemlos vom Arduino Daten auf den Bus schreibt. Also Kommunikation klappt einwandfrei.
                          Möchte aber auch das ganze umgekehrt.#
                          Habe das Beispielskript etwas angepasst (siehe unten) aber bekomme einfach keine Verbindung vom Bus /ETS zum Arduino. Es sollte eigentlich bei Adress 3/4/152 die eingebaute LED angehen, aber nix....
                          Bin auch ratlos.... Original Arduino nano


                          Code:
                          include <KnxTpUart.h>
                          KnxTpUart knx(&Serial, "1.1.38");
                          
                          int target_3_4_152;
                          int target_3_4_151;
                          void setup() {
                          pinMode(LED_BUILTIN, OUTPUT);
                          Serial.begin(19200, SERIAL_8E1);
                          knx.uartReset();
                          knx.addListenGroupAddress("3/4/152");
                          knx.addListenGroupAddress("3/4/151");
                          
                          delay(1000);
                          
                          knx.groupRead("3/4/152");
                          knx.groupRead("3/4/151");
                          }
                          void loop() {
                          }
                          void serialEvent() {
                          
                          KnxTpUartSerialEventType eType = knx.serialEvent();
                          
                          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_ANSWER) {
                          
                          if (target == "3/4/152") {
                          target_3_4_152 = telegram->getBool();
                          
                          if (target_3_4_152) {
                          digitalWrite(LED_BUILTIN, HIGH);
                          }
                          else {
                          digitalWrite(LED_BUILTIN,LOW);
                          }
                          
                          }
                          else if (target == "3/4/151") {
                          target_3_4_151 = telegram->get1ByteIntValue();
                          }}}}​​

                          Kommentar


                            Hast du mal ein paar mehr Ausgaben eingefügt um zu schauen wo es hängt?
                            Zuletzt geändert von Flole; 07.12.2023, 16:50.

                            Kommentar


                              Zitat von pio007 Beitrag anzeigen
                              Bin auch ratlos.... Original Arduino nano
                              Das Problem ist der Nano. Da sind intern die RX/TX-Pins des Atmega mit dem FTDI verbunden. Senden über KNX geht weil der FTDI nur lauscht, Empfangen nur mit Hardwareeingriff*, da der FTDI den RX am Atmega blockt.

                              Wenn Du statt dem Nano einen Pro Mini (mit externem FTDI zum Programmieren) verwendest, wird es funktionieren.

                              *) Wenn Du den Widerstand RP1A (1k) entfernst, ist das Blockieren aufgehoben, allerdings auch keine Programmierung mehr möglich.
                              Zuletzt geändert von dreamy1; 06.12.2023, 23:36.
                              Viele Grüße,
                              Stefan

                              DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                              Kommentar


                                Mit dem nano hatte ich auch gelesen. Hatte vorher Nachbau, deswegen extra einen Originalen gekauft....
                                Wie sieht es beim Mega 2506 aus?
                                Was wäre der "Hardwareeingriff"? Habe mir bereits eine Platine erstellt, welche auf den Nano ausgelegt ist...
                                Vielen Dank und Grüße Marc

                                Kommentar

                                Lädt...
                                X