Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Hi Mag Gyver
    zurückgeändert auf groupRead - dein Beispiel hochgeladen und die readme angepasst.
    DANKE!
    Allerdings habe ich das nicht getestet - vielleicht holst du dir gerade mal die aktuelle Library und sagst mir ob die compilied & funktioniert?
    Gruß
    Thorsten

    Kommentar


      Hallo ThorstenGehrig,

      kein Problem. Auch Danke!

      Ja, Beispiel "Groupread" arbeitet wie es soll.

      Für die Funktionsprüfung benützte Versionen der ARDUINO IDE 1.0.5 und 1.6.5 von arduino.cc.
      Sonst vergleichen wir Äpfel mit Birnen bei irgendwelchen aufkommenden Problemen.


      Mit freundlichen Grüßen

      Mag Gyver

      Kommentar


        Zur Info für die KARDUINO "Follower":

        In Zusammenarbeit mit dem gerade entstehenden KNX-Arduino-Basis-Boards hab ich angefangen ein wenig um zu strukturieren. Dabei sind auch die "Organisationsmitgliedschaften" von JuMi2006 und Ing-Dom weggefallen. Ich hoffe ihr seid mir da nicht böse. Sobald ihr Zeit und Luft habt etwas aktiv beizutragen, einfach melden, dann ändern wir das wieder.

        Zum TpUart-Fork: Ich hab den mal als "deprecated" markiert (bzw. den Repository-Namen dahingehend geändert). Aktuell bastle ich an einer besseren Lösung die besser in das Gesamtbild "Ein Arduino mit Peripherie als KNX Gerät" passt.

        Stay tuned.

        Kommentar


          Hallo zusammen,

          nach 50 Seiten (ja, es gibt sie noch, die Neulinge, die erstmal den ganzen Thread erfassen wollen) melde auch ich mich zu Wort mit meinem Projekt:
          Arduino Mega als Steuergerät für 3-4 APA102 LED Stripes, KNX Anbindung über den berühmten Siemens 5WG1 117.

          Bislang alles noch im kompletten Prototypen- / Breadboard-Mode, aber die grundsätzlichen Themen (PA zuweisen, GAs auslesen, GAs schreiben,...) funktionieren so weit ganz gut.

          Was mich ein wenig wundert sind zwei Dinge:

          Zum einen Schickt der Arduino nach einem Neustart ein komisches Telegramm auf den Bus (siehe Bild im Anhang) - ich glaube mich zu erinnern, dass es dazu mal ein paar Posts gab in diesem Thread, finde diese aber nicht mehr.

          Zum anderen scheint der Arduino zu "prellen", wenn ich über die ETS an eine GA einmalig ein "AN" oder "AUS" schicke, dann bekomme ich auf der Serial-Konsole der Arduino IDE folgenden Output:
          Code:
          TPTP-UART Test
          KNX SINGNALwert
          10/0/0
          Empfangener wert1
          KNX SINGNALwert
          10/0/0
          Empfangener wert1
          KNX SINGNALwert
          10/0/0
          Empfangener wert1
          Sieht für mich aus als ob es irgendwie dreimal verarbeitet wurde, im Gruppemonitor taucht das Telegramm nur einmal auf.

          Mein Quellcode sieht derzeit so aus (nicht schön, dafür selten)
          Code:
          // Include KNXUart Interface and APA102 LED Stripe Library
          #include <KnxTpUart.h>
          #include <APA102.h>
          
          const bool is_debug=true;
          //Initialisieren der Schnittstelle - set the Device's KNX ID
          KnxTpUart knx(&Serial1, "10.0.1");
          
          //LED: Initialize the Pins to use
          const uint8_t dataPin = 11;
          const uint8_t clockPin = 12;
          
          
          // Create an object for writing to the LED strip.
          APA102<dataPin, clockPin> ledStrip;
          
          // Set the number of LEDs to control.
          const uint16_t ledCount = 36;
          
          int target_10_0_0=0;
          int target_10_0_1=0;
          int target_10_0_2=0;
          int target_10_0_3=0;
          int target_10_0_4=0;
          int target_10_0_5[3];
          
          
          int stripe1_r =0;
          int stripe1_g =0;
          int stripe1_b =0;
          int stripe1_p =0;
          
          
          void setup() {
            //initialize DEBUG
            if(is_debug){
              Serial.begin(9600);
            Serial.println("TP-UART Test");
            }
            // Initialize the KNX UART
            Serial1.begin(19200);
            UCSR1C = UCSR1C | B00100000; // Even Parity
            knx.uartReset();
            
            
            knx.addListenGroupAddress("10/0/0"); //Global on-off
            knx.addListenGroupAddress("10/0/1"); //Global Dimmer
            knx.addListenGroupAddress("10/0/2"); //RED Dimmer
            knx.addListenGroupAddress("10/0/3"); //Green Dimmer
            knx.addListenGroupAddress("10/0/4"); //Blue Dimmer
            knx.addListenGroupAddress("10/0/5"); //RGB Value
          
          
              delay(1000);
            knx.groupRead("10/0/0");
              knx.groupRead("10/0/1");
               knx.groupRead("10/0/2");
                   knx.groupRead("10/0/3");
           knx.groupRead("10/0/4");
             knx.groupRead("10/0/5");
          
            //INITIALIZE THE LED STRIPES
          
          
          }
          
          void loop() {
            /*
            knx.groupWriteBool("1/5/2", true);
            delay (5000);
            knx.groupWriteBool("1/5/2", false);
            delay (5000);  
            */
            ledMonoColor(stripe1_r,stripe1_g,stripe1_b,stripe1_p);
          
          }
          
          void ledMonoColor(int R, int G, int B, int power){
              ledStrip.startFrame();
                for(uint16_t i = 0; i < 36; i++)
            {
                          ledStrip.sendColor(R,G,B,power);
          
              }
                ledStrip.endFrame(ledCount);
          }  
          
          
          
          void serialEvent1() {
           
            //Aufruf knx.serialEvent()
           
            KnxTpUartSerialEventType eType = knx.serialEvent();
          
            //Auswertung des empfangenen Telegrammes -> nur KNX-Telegramme werden akzeptiert
           
            if (eType == KNX_TELEGRAM) {
              KnxTelegram* telegram = knx.getReceivedTelegram();
                        if(is_debug)    Serial.println("KNX SINGNALwert");
          
              // Telegrammauswertung auf KNX (bei Empfang immer notwendig)
            
              String target =
                String(0 + telegram->getTargetMainGroup())   + "/" +
                String(0 + telegram->getTargetMiddleGroup()) + "/" +
                String(0 + telegram->getTargetSubGroup());
          
              // Auswertung der Gruppenadresse des empfangenen Telegrammes und Zwischenspeicherung in Variable "target"
                                if(is_debug)Serial.println(target);
          
              if (telegram->getCommand() == KNX_COMMAND_WRITE) {
              
                // Auswertung der Leseanfrage in serialEvent() mit Datentypen
                // Auswertung des empfangenen KNX-Telegrammes mit Antwort auf Leseanfrage (Flag) -> Aktion
              
             
                if (target == "10/0/0") {
                  target_10_0_0 = telegram->getBool();
                  
                        if(is_debug)Serial.print("Empfangener wert");
                    if(is_debug)Serial.println(target_10_0_0);
                
                  // Speicherung des Inhaltes in Variable "target_5_6_0" der Antwort auf die Leseanfrage der Gruppenadresse "2/6/0"
                
                  if (target_10_0_0) {
                      stripe1_p=31;
          
                  }
                  else {
                      stripe1_p=0;
          
                  }
                  }
                  if (target == "10/0/1") {
                    target_10_0_1 = telegram->get1ByteIntValue();
                      if(is_debug)Serial.print("Empfangener wert auf 10/0/1 ");
                      if(is_debug)Serial.println(target_10_0_1);
              
                    stripe1_p=target_10_0_1*31/255;
                      if(is_debug)Serial.print("Translates to ");
                 if(is_debug) Serial.println(stripe1_p);
                }
                 if (target == "10/0/2") {
                    target_10_0_2 = telegram->get1ByteIntValue();
                     if(is_debug) Serial.print("Empfangener wert auf 10/0/2 ");
                     if(is_debug) Serial.println(target_10_0_2);
              
                    stripe1_r=target_10_0_2;
                    
                }
                 if (target == "10/0/3") {
                    target_10_0_3 = telegram->get1ByteIntValue();
                      if(is_debug)Serial.print("Empfangener wert auf 10/0/3 ");
                      if(is_debug)Serial.println(target_10_0_3);
                    stripe1_g=target_10_0_3;
                }
                 if (target == "10/0/4") {
                    target_10_0_4 = telegram->get1ByteIntValue();
                      if(is_debug)Serial.print("Empfangener wert auf 10/0/4");
                      if(is_debug)Serial.println(target_10_0_4);
                    stripe1_b=target_10_0_4;
                }
                       
                }
               
              
            }
          }
          Library verwende ich die von Thorsten, letzter Versionsstand.

          Viele Grüße und schonmal danke

          Hans

          You do not have permission to view this gallery.
          This gallery has 1 photos.

          Kommentar


            Hallo Thorsten,

            kannst Du noch mal bitte nachschauen, mit dem Code in Post #750 und dem Example GroupRead stimmt etwas nicht:

            Code:
             if (telegram->getCommand() == KNX_COMMAND_ANSWER) {
            ist offensichtlich falsch, um Werte vom Bus abzufragen.

            Mit

            Code:
             if (telegram->getCommand() == KNX_COMMAND_Write) {
            funtioniert es, müßte es nicht aber

            Code:
             if (telegram->getCommand() == KNX_COMMAND_READ) {
            heißen? War schon fast am verzweifeln, ehe mir der Unterschied zum Code von Haka in Post #754 aufgefallen war.

            Jens


            Kommentar


              Hallo Haka,

              zu deinem Problem mit den "unklaren" Telegrammen.

              In deinem Sketch in der Funktion Setup unter der Warteanweisung von 1000 Millisekunden stehen mehrere (Leseanfragen -> KNX) Statusabfrageanweisungen für den TP-UART.
              Wenn du beim Initialisieren deiner Anwendung die Zustandabfrage der Gruppenadressen nicht benötigst, dann kommentier diese Zeilen aus.
              Dadurch verschwinden diese "unklaren" Telegramme.


              Mit freundlichen Grüßen

              Mag Gyver
              Zuletzt geändert von Mag Gyver; 17.01.2016, 20:27.

              Kommentar


                Hallo intelligente Haustechnik,

                der Sketch vom Post #750 ist in Ordnung.

                Zu deinem Problem:


                Code:
                KNX_COMMAND_ANSWER
                Beim Starten der Anwendung kennt man die Zustände bzw. Werte der Gruppenadressen nicht.
                Deshalb kann man mit dem Befehl
                Code:
                knx.groupRead("10/0/0");
                eine Leseanfrage starten, die Auswertung erfolgt über die
                Funktion.
                Code:
                if (telegram->getCommand() == KNX_COMMAND_ANSWER) {
                (Leseanfrage(n) -> KNX -- KNX -> Antwort(en))


                Code:
                KNX_COMMAND_WRITE
                Code:
                if (telegram->getCommand() == KNX_COMMAND_WRITE) {
                Dies ist dazu da um Werte oder Befehle, die von anderen Teilnehmern kommen, auszuwerten oder auszuführen.
                (Wert(e)/Befehl(e) <- KNX)


                Code:
                KNX_COMMAND_READ
                Code:
                if (telegram->getCommand() == KNX_COMMAND_READ) {
                Dies ist dazu da, um auszuwerten ob ein anderer Teilnehmer von deiner Anwendung Werte haben möchte.
                (Leseanfrage(n) <- KNX)


                Die Funktionen im Post #754 von Haka funktionieren, nur das mit dem mehrmaligen senden ist nicht in Ordnung.
                Kann aber auch an der Library APA102 liegen, die greift auch wie die Library TP-UART auf den RAM des (ATmega) Arduino zu.


                Mit freundlichen Grüßen

                Mag Gyver
                Zuletzt geändert von Mag Gyver; 16.01.2016, 12:33.

                Kommentar


                  Hallo Mag Gyver,

                  danke für die Ausführungen, ist jetzt schon etwas klarer, meine Beleuchtungssteuerung läuft ja auch soweit.

                  Wahrscheinlich muß ich mir das mal irgendwo aufschreiben


                  Jens

                  Kommentar


                    Hallo
                    Habe mal die vorhandenen Komponenten zusammengesucht.
                    Arduino Nano 3.0
                    Siemens 5WG1 114-2AB02
                    Diesen Busankoppler habe ich vor über 10Jahren für die Programmierung ETS2 und und den Buszugriff benutzt.
                    Der Busankoppler kann mit Hilfe eine Wiederstandes 11 kOhm = PEI-16 (ETS) oder 45.3 kOhm = PEI-10 (FT1.2) an +5V umgeschaltet werden.
                    Hier der Busankoppler mit der Beschaltung http://www.dehof.de/eib/pdfs/BIM_Schaltplan.pdf Seite3
                    Da der Busankoppler auch RTS und CTS hat, kann ich nicht sagen ober er überhaupt geeignet ist.
                    Ich bekomme mit Ihm keine Verbindung zu KNX-Bus.
                    Code:
                    #include <KnxTpUart.h>
                    
                    // Initialize the KNX TP-UART library on the Serial an Physikalische Adresse der BCU
                    KnxTpUart knx(&Serial, "15.15.20");
                    
                    void setup() {
                      // LED - blinkt beim senden eines Telegramms
                      pinMode(13, OUTPUT);
                      digitalWrite(13, LOW);
                     
                      Serial.begin(19200);
                      UCSR0C = UCSR0C | B00100000;
                    
                      knx.uartReset();  
                    }
                    
                    void loop() {
                    knx.groupWriteBool("2/1/1", true);
                      delay (5000);
                     knx.groupWriteBool("2/1/1", false);
                      delay (5000);  hole
                    }
                    Die LED auf den Arduino blink im 5sec. Tackt, aber auf der ETS ist nichts zu sehen.
                    RX und TX habe ich über Kreuz verbunden.
                    Werde mal schauen das ich mir den Siemens 5WG1117-2AB12 hole.
                    Den Arduino Nano programmiere ich mit abgezogener BCU.
                    Vielleicht hat ja jemand einen Tip für mich.
                    Gruß NetFritz
                    KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                    WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                    PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                    Kommentar


                      Hallo ist da
                      So der Siemens 5WG1117-2AB12 ist da.
                      Produktdatenbank knx.117.knxprod runter geladen in ETS 4 importiert.
                      In der ETS der Linie1.1 hinzugefügt, dann hat der BTM die Adresse 1.1.-
                      Kann man den BTM keine Adresse vergeben?
                      Wenn Ja was für eine Adresse stelle ich dann im Sketch unter
                      Code:
                        
                       KnxTpUart knx(&Serial, "15.15.20"); ein.
                      Gruß NetFritz ein.
                      KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                      WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                      PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                      Kommentar


                        Der BTM hat keine programmiertaste ... Der ist nur "die dumme KNX Schnittstelle". Du musst der Applikation, die du an den BCU dran hängst eine Adresse geben.

                        Im Sketch gibtst du die Adresse an die dein Arduino dann haben soll.

                        Kommentar


                          Hallo
                          Vielen Dank.
                          Es läuft jetzt, genial.
                          Bei der Siemens 5WG1 114-2AB02 konnte man eine Adresse vergeben und diese auch Programmieren.
                          Deshalb komme ich darauf.
                          Gruß NetFritz
                          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                          Kommentar


                            Hallo
                            Muss ich die Flankenerkennung im Sketch selbst programmieren oder wird der KNX Befehl nur einmal gesendet?
                            Auch wenn in void loop() jedes mal knx.groupWriteBool("2/1/1", true); durchlaufen wird.
                            Gruß NetFritz
                            KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                            WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                            PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                            Kommentar


                              Auch wenn in void loop() jedes mal knx.groupWriteBool("2/1/1", true); durchlaufen wird.
                              Das sendet dir mit jedem Durchlauf von loop() ein neues Telegramm mit dem Wert "true" auf 2/1/1 ...

                              Muss ich die Flankenerkennung im Sketch selbst programmieren
                              Um welche Flanke geht's denn? zu 90% wird die Antwort aber JA lauten.

                              oder wird der KNX Befehl nur einmal gesendet?
                              Er wird so oft gesendet wie du ihn sendest.

                              Kommentar


                                Hallo
                                Das sendet dir mit jedem Durchlauf von loop() ein neues Telegramm mit dem Wert "true" auf 2/1/1
                                Das beantwortet schon meine Frage.
                                Mit Flankenerkennung meine ich z.B. einen Binäreingang der nur Periodisch seinen Wert ändert.
                                Dann muss der alte Zustand bei jeden loop() durchlauf mit abgefragt werden.
                                Gruß NetFritz
                                KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                                WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                                PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                                Kommentar

                                Lädt...
                                X