Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Hi,
    @Rasmus7700:
    Sorry for my late reply.
    which version of the Library do you use? The "old" DKA-One - or the new one?
    With with Arduino? The referred comment from myself does not apply to the "new" Version.
    You can find the new one here:
    https://bitbucket.org/thorstengehrig...knx-user-forum

    @DavidB:
    Ich habe die neue Version selbst im Einsatz an einem RFID Leser - und keine Probleme.
    Die letzen Änderungen haben auch keinen Einfluss auf irgendwelche dinge die verspätet auftreten... daher: wenn es am Anfang läuft - sollte es immer Laufen (oder du hast was in deinem Code der nicht passt).
    Vielleicht einfach mal ein ganz simples Test-Programm laufen lassen: alle 60 Sekunden ein Telegram schicken und danach 60 Sekunden warten...

    Gruß
    Thorsten

    Kommentar


      KNX Nachrichten Empfangen funktioniert

      Hallo zusammen,
      habe es nun geschafft Nachrichten auf dem Arduino Nano/Mini mit nur einer seriellen Schnittstelle zu Empfangen und zu verarbeiten.

      Vielen Dank an Thorsten, Michael und Bernator für eure Kommentare. Zum einen hat mir das knx.addListenGroupAddress("0/0/1") gefehlt und zum anderen haben tatsächlich meine Debuginfos auf dem gleichen seriellen Anschluss gestört.

      Hier mein Beispielcode zum Empfangen von KNX Nachrichten, evtl Hilft es ja jemand:
      Code:
      ////////////////////////////////////////////////////////////
      // KNX Project - HTWG Konstanz
      // Receive Grouptelegrams and turn on/off led
      //
      // Works with Arduino MINI
      // Only one serial port is needed, no debug outputs! Don't add Serial.println
      // After Upload the sketch you have to disconnect the Arduino from PC
      //////////////////////////////////////////////////////////
      
      #include <KnxTpUart.h>
      
      // Initialize the KNX TP-UART library on the Serial1 port of Arduino Mega
      // and with KNX physical address 1.1.16
      KnxTpUart knx(&Serial, "1.1.6");
      
      //LED Connection
      int led = 13;
      
      void setup() {
        Serial.begin(19200);
        UCSR0C = UCSR0C | B00100000; // Even Parity
      
        knx.uartReset();
      
        //The Group Adresses you want to listen too
        knx.addListenGroupAddress("0/0/1");
        knx.addListenGroupAddress("0/0/4");
      
        //LED pinMode
        pinMode(led, OUTPUT);
      }
      
      
      void loop() {
        //Only wait for an Serial Event
      }
      
      void serialEvent() {
        //Start Serial Event
        digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)
        delay(200);
        digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
        delay(200);
        digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)
        delay(200);
      
        //Get Serial Event
        KnxTpUartSerialEventType eType = knx.serialEvent();
      
        //Check Serial Event
        if (eType == KNX_TELEGRAM) {
          KnxTelegram* telegram = knx.getReceivedTelegram();
          // Here you have the telegram and can do whatever you want
      
          //Turn on/off the light
          if (telegram->getFirstDataByte() == 0) {
            digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
          } else {
            digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)
          }
      
        } else {
          //Unknown Event: Make Trouble!
          for (int i = 0; i < 10; i++) {
            digitalWrite(led, HIGH);     // LED on
            delay(30);
            digitalWrite(led, LOW);     // LED off
            delay(30);
          }
        }
      }
      Grüße
      Pascal

      Kommentar


        Gratuliere - und danke für das Feedback und das du deinen Code reingestellt hast.
        :-)

        Kommentar


          Zitat von ThorstenGehrig Beitrag anzeigen
          Vielleicht einfach mal ein ganz simples Test-Programm laufen lassen: alle 60 Sekunden ein Telegram schicken und danach 60 Sekunden warten...
          Hallo zusammen,

          Thorsten, danke für die Rückmeldung. Irgendwie finde ich das Problem nicht. Hardware-seitig habe ich alles ausgeschlossen: mehrere Arduinos getestet, mehrere BCUs getestet und an meinem Bus kann es auch nicht liegen. Ich habe mal eine kleine Testumgebung aufgebaut, weil ich zwischen durch den Linienkoppler unter Verdacht hatte. Hat alles nichts gebracht. Unten mal der Code meines Test-Scripts. Vielleicht fällt ja jemandem was auf.

          Wie schon beschrieben, nach ein paar Minuten kommen keine Telegramme mehr an. Der Arduino tut aber noch, auf der seriellen Konsole sehe ich dann weiterhin die Ausgaben. Der Zeitraum bis zum Fehler ist unterschiedlich. Ein Reset des Arduinos löst das Problem dann zeitweise, bis er nach ein paar Minuten wieder stumm wird.

          Ich bin für jeden Rat dankbar.

          Danke und viele Grüße,

          David


          Code:
          #include <KnxTelegram.h>
          #include <KnxTpUart.h>
          
          #define PHYS_ADD "1.0.5"
          
          #define GA_TEMP_NETZTEIL "0/3/0"
          #define TEMP_SEND_INTERVAL_MS 5000
          
          
          KnxTpUart knx(&Serial1, PHYS_ADD);
          unsigned long startTime;
          
          void setup() {
            Serial.begin(9600);
            Serial.println("TP-UART Test");  
            Serial1.begin(19200);
            UCSR1C = UCSR1C | B00100000; // Even Parity
            Serial.print("UCSR1A: ");
            Serial.println(UCSR1A, BIN);
            Serial.print("UCSR1B: ");
            Serial.println(UCSR1B, BIN);
            Serial.print("UCSR1C: ");
            Serial.println(UCSR1C, BIN);
          
            knx.uartReset();
            knx.addListenGroupAddress(GA_TEMP_NETZTEIL);
            
            startTime = millis();
          }
          
          
          void loop() {
            if (abs(millis() - startTime) < TEMP_SEND_INTERVAL_MS) {
              delay(1);
              return;
            }
            startTime = millis();
          
            float temp = 35;
            Serial.print("Sending Temp: ");
            Serial.println(temp);
            boolean result = knx.groupWrite2ByteFloat(GA_TEMP_NETZTEIL, temp);
            Serial.print("Sent successfully: ");
            Serial.println(result);
          }
          
          void serialEvent1() {
            KnxTpUartSerialEventType eType = knx.serialEvent();
            if (eType == KNX_TELEGRAM) {
               KnxTelegram* telegram = knx.getReceivedTelegram();
          
            }
          }

          Kommentar


            Hi

            result von groupWrite2ByteFloat bleibt immer gleich?
            Tritt das Problem auch bei anderen groupWrite (also nicht Float) Methoden auf?

            Kannst du mit dem Oszi an der Seriellen zwischen Arduino und TP Uart messen ob der Arduino im Fehlerfall überhaupt noch Daten zum TP UART sendet?

            VG

            Mode

            Kommentar


              Hallo Leute,

              Entschuldigung falls das jetzt so dazwischen geschoben ist, aber mit dem Arduino ließe sich doch bestimmt auch das Hoval LSA Modul anbinden, siehe PDF in Post #1: https://knx-user-forum.de/knx-eib-fo...-auslesen.html

              Selber habe ich leider gerade überhaupt keine Zeit mich da einzulesen und zum Platinen ätzen und löten schon gleich zweimal nicht. Falls das hier jemand für mich (und evtl. noch andere im Forum?) übernehmen würde, wäre mir das schon etwas Wert (also gegen Bezahlung). Vielleicht können die Herren da mal drüber schauen und mir bei Interesse mal ein Angebot per PN machen. Danke!
              Mit freundlichen Grüßen
              Niko Will

              Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
              - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

              Kommentar


                Hi 2ndsky,
                laut dem verlinkten Post braucht man nur
                * Pin1: Binäreingang (HIGH = Filter fehler)
                * Pin2: Binäreingang (HIGH = Störung)
                * PIN3: Digital bzw. Analogausgang: Homevent Aus (0-3V) / EIN 6-24 Volt
                Frage= ist das nur ein/aus oder 6-24 Volt bedeuten Leistung x bis y?
                * PIN4: Analogausgang 0-10Volt => Volumenstrom 0-100%
                (daraus ergibt sich eigentlich das PIN 3 nur AUS/AN ist, richtig?)

                Galvanische Trennung ist imho pflicht.

                Daraus ergibt sich:
                * Einfacher Arduino
                * BCU
                * PIN 1/2 Arudino Digitaleingang über Optokoppler
                * PIN 3 Arduino Digitaleingang über Optokoppler
                * PIN 4 über Arduino PWM-Ausgang (z.B. http://www.cctools.eu/download/Anleitungen/1420.pdf )

                Eigentlich kein Hexenwerk.
                Der Arduino-Code sollte auch überschaubar sein...
                Sorry - soweit erstmal ein Gedankenspiel.
                Ich denke da muss ich einer der Gruppe selbst ein bisschen Zeit nehmen - dann kriegen wir das zusammen hin.

                Gruß
                Thorsten

                Kommentar


                  KNX Nachrichten Empfangen funktioniert nicht

                  Hallo,

                  das Senden auf den Bus funktioniert.
                  Als nächsten Schritt habe ich gestern den Code von htwg/Pascal auf meinem uno getestet, leider ohne Erfolg.
                  Angepaßt habe ich Serialadresse und die Gruppenadresse.
                  Vom Bus aus habe ich ein Bit 0 und 1 gesendet aber die LED 13 blieb immer aus.
                  Was mache ich falsch?

                  Gruß
                  Andy

                  Kommentar


                    Hi Mode,

                    danke für die Rückmeldung.

                    Zitat von mode Beitrag anzeigen
                    result von groupWrite2ByteFloat bleibt immer gleich?
                    Ja, result ist immer gleich. Aber mir ist jetzt erst aufgefallen, dass es immer false zurückgibt. Sogar zu dem Zeitpunkt, an dem ich noch Telegramme im GA-Monitor sehe. Gibt es da irgendwie eine Art von Debug-Log oder so?

                    Zitat von mode Beitrag anzeigen
                    Tritt das Problem auch bei anderen groupWrite (also nicht Float) Methoden auf?
                    Ja, der Fehler tritt bei allen GroupWrite-Typen auf.

                    Zitat von mode Beitrag anzeigen
                    Kannst du mit dem Oszi an der Seriellen zwischen Arduino und TP Uart messen ...
                    Ich hab leider kein Oszi. Aber vielleicht ist das eine gute Ausrede sich mal ein neues Spielzeug zuzulegen.

                    Kommentar


                      Zitat von DavidB Beitrag anzeigen
                      Ich hab leider kein Oszi. Aber vielleicht ist das eine gute Ausrede sich mal ein neues Spielzeug zuzulegen.
                      Wenns günstig sein soll mal hier reinschauen:
                      http://www.mikrocontroller.net/topic/249628#new

                      Kommentar


                        Zitat von Andi99 Beitrag anzeigen
                        Hallo,
                        Als nächsten Schritt habe ich gestern den Code von htwg/Pascal auf meinem uno getestet, leider ohne Erfolg.
                        Der Code ansich funktioniert bei mir auf dem Uno ohne Probleme.
                        Achte darauf, dass nach dem übertragen des Sketches das USB Kabel wieder entfernt werden muss und dann evtl der Uno noch mal kurz Stromlos gesetzt werden sollte. Der GND-PIN muss ebenfalls zwischen Uno und KNX verbunden sein wegen dem Potenzialausgleich.

                        Als Fehlersuche hilft evtl auch der Bus/Gruppenmonitor in der ETS Software.

                        Zur Debugausgabe/Fehlerausgabe habe Ich inzwischen an den Arduino ein Nokia 5110 LCD Display angeschlossen. Man bekommt es aus ebay China für unter 3€ und kann es leicht über Digitale I/O ansprechen. So kann man leicht den fehlenden zweiten seriellen Port kompensieren.

                        Viel Erfolg ;-)

                        Kommentar


                          Zitat von ThorstenGehrig Beitrag anzeigen
                          Hi,
                          @Rasmus7700:
                          Sorry for my late reply.
                          which version of the Library do you use? The "old" DKA-One - or the new one?
                          With with Arduino? The referred comment from myself does not apply to the "new" Version.
                          You can find the new one here:
                          https://bitbucket.org/thorstengehrig...knx-user-forum

                          @DavidB:
                          Ich habe die neue Version selbst im Einsatz an einem RFID Leser - und keine Probleme.
                          Die letzen Änderungen haben auch keinen Einfluss auf irgendwelche dinge die verspätet auftreten... daher: wenn es am Anfang läuft - sollte es immer Laufen (oder du hast was in deinem Code der nicht passt).
                          Vielleicht einfach mal ein ganz simples Test-Programm laufen lassen: alle 60 Sekunden ein Telegram schicken und danach 60 Sekunden warten...

                          Gruß
                          Thorsten
                          Hello Torsten - also sorry from here - forgot the answer

                          No it was a version from here :
                          https://bitbucket.org/dka/arduino-tpuart

                          I've downloaded the version you linked, i will try that - i'll give response if it works

                          Thanks alot

                          EDIT:
                          I've used the new library, it seems a bit better, but not good.... When starting the Example "GroupWrite" and only change input pin to A0 upload, and monitor i get:
                          Code:
                          TP-UART Test
                          UCSR1A: 100010
                          UCSR1B: 10011000
                          UCSR1C: 100110
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          Successfully sent: 0
                          This results in 2 replies in the Group Monitor in ETS4....
                          Sometimes it does send, but not that often.... please help

                          Kommentar


                            Jawohl der Code von htwg funktioniert.

                            Leider kann der Code nicht zwischen den Gruppenadressen unterscheiden, deshalb habe ich diesen Code etwas modifiziert und vielleicht hilf dieser weiter.

                            Und danke htwg für deine Mühen!

                            Ich stand selber auch auf dem Schlauch, wie das mit dem Empfangen von Gruppenadressen gehen sollte.

                            Code:
                            ////////////////////////////////////////////////////////////
                            // KNX Project - HN 
                            // Receive Grouptelegrams and turn on/off coffee or doorbell
                            //
                            // Works with Arduino UNO (only tested with SMD-Edition)
                            // Only one serial port is needed, no debug outputs! Don't add Serial.println
                            // After Upload the sketch you have to disconnect the Arduino UNO from PC and shortcut the ICSP1 Pin 5 with ICSP1 Pin 6, Reset the Arduino Uno
                            //////////////////////////////////////////////////////////
                             #include <KnxTpUart.h>
                             // Initialize the KNX TP-UART library on the Serial port of Arduino Uno
                            // and with KNX physical address 1.1.16
                            KnxTpUart knx(&Serial, "1.1.16");
                             //Outputs
                            int led = 13;
                            int coffee = 12;
                            int doorbell = 11;
                             void setup() {
                              Serial.begin(19200);
                              UCSR0C = UCSR0C | B00100000; // Even Parity
                               knx.uartReset();
                               //The Group Adresses you want to listen too
                              knx.addListenGroupAddress("0/0/1");
                              knx.addListenGroupAddress("2/5/0");
                               //Output pinMode
                              pinMode(led, OUTPUT);
                              pinMode(coffee, OUTPUT);
                              pinMode(doorbell, OUTPUT);
                            }
                             
                            void loop() {
                              //Only wait for an Serial Event
                            }
                             void serialEvent() {
                              //Start Serial Event
                              digitalWrite(led, LOW);   // turn the LED off (LOW is the voltage level)
                              delay(200);
                              digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
                              delay(200);
                              digitalWrite(led, LOW);   // turn the LED off (LOW is the voltage level)
                              delay(200);
                               //Get Serial Event
                              KnxTpUartSerialEventType eType = knx.serialEvent();
                               //Check Serial Event
                              if (eType == KNX_TELEGRAM) {
                                KnxTelegram* telegram = knx.getReceivedTelegram();
                                // Here you have the telegram and can do whatever you want
                                
                                int main = telegram->getTargetMainGroup();                           // Get TargetMainGroup
                                int middle = telegram->getTargetMiddleGroup();                       // Get TargetMiddleGroup
                                int sub = telegram->getTargetSubGroup();                             // Get TargetSubGroup
                                int TargetGroupAddress(main*2048 + middle*256 + sub);                // Create TargetGroupAddress
                                
                                //Turn on/off the doorbell "0/0/1"
                                if ((TargetGroupAddress == 1) && (telegram->getFirstDataByte() == 0)) {
                                  digitalWrite(doorbell, LOW);
                                }  
                                if ((TargetGroupAddress == 1) && (telegram->getFirstDataByte() == 1)) {
                                  digitalWrite(doorbell, HIGH);   
                                }
                                //Turn on/off the coffee "2/5/0"
                                if ((TargetGroupAddress == 5376) && (telegram->getFirstDataByte() == 0)) {
                                  digitalWrite(coffee, LOW);
                                }
                                if ((TargetGroupAddress == 5376) && (telegram->getFirstDataByte() == 1)) {
                                  digitalWrite(coffee, HIGH);
                                }
                              } 
                              else {
                                //Unknown Event: Make Trouble!
                                for (int i = 0; i < 10; i++) {
                                  digitalWrite(led, HIGH);     // turn the LED on
                                  delay(30);
                                  digitalWrite(led, LOW);      // turn the LED off
                                  delay(30);
                                }
                              }
                            }
                            Grüße

                            Mag Gyver

                            Kommentar


                              Ich erlaube mir mal einen Cross-Post:
                              https://knx-user-forum.de/diy-do-you...tml#post408068

                              Gruß
                              Thorsten

                              Kommentar


                                Hi Throsten,

                                Zitat von ThorstenGehrig Beitrag anzeigen
                                laut dem verlinkten Post braucht man nur
                                * Pin1: Binäreingang (HIGH = Filter fehler)
                                * Pin2: Binäreingang (HIGH = Störung)
                                * PIN3: Digital bzw. Analogausgang: Homevent Aus (0-3V) / EIN 6-24 Volt
                                Frage= ist das nur ein/aus oder 6-24 Volt bedeuten Leistung x bis y?
                                * PIN4: Analogausgang 0-10Volt => Volumenstrom 0-100%
                                (daraus ergibt sich eigentlich das PIN 3 nur AUS/AN ist, richtig?)
                                Soweit ich das verstanden habe, ist PIN3 nur AN/AUS und PIN4 regelt den Volumenstrom. Das Bedienteil ist bei der Verwendung des LSA Moduls weiterhin notwendig und erfasst den Feuchtigkeitsgehalt der Luft. Die Luftfeuchtigkeit lässt sich dann weiterhin nur über das Bedienteil einstellen. Zwar schade, wäre aber für mich erstmal ausreichend.

                                Scheinbar kann man sich das Bedienteil und das LSA Modul auch sparen und direkt auf die Homevent zugreifen, in dem man direkt auf das Kabel geht. Einige hier im Forum haben das wohl so gemacht, aber eine richtige Dokumentation habe ich hierfür nicht gefunden. Außerdem habe ich das LSA Modul bereits und sehe keine Chance das auch nur annähernd zum ursprünglichen Preis wieder los zu werden. Daher kann ich es auch einfach verbauen.

                                Zitat von ThorstenGehrig Beitrag anzeigen
                                Eigentlich kein Hexenwerk.
                                Der Arduino-Code sollte auch überschaubar sein...
                                Sorry - soweit erstmal ein Gedankenspiel.
                                Ich denke da muss ich einer der Gruppe selbst ein bisschen Zeit nehmen - dann kriegen wir das zusammen hin.
                                Ich dachte mir schon, dass es für jemand mit etwas Ahnung von der Materie kein großes Problem darstellen sollte. Für mich als absoluter Anfänger auf dem Gebiet wäre es für ein einmaliges Projekt allerdings viel zu aufwändig, mich in das ganze Einzuarbeiten. Da bin ich lieber bereit, etwas Geld zu investieren, falls mir das jemand als fertig verlötete und programmierte Platine liefern würde.
                                Mit freundlichen Grüßen
                                Niko Will

                                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                                Kommentar

                                Lädt...
                                X