Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Hallo ThorstenGehrig,

    ich habe auf Bitbucket einen Pull requests gestartet.
    Schau dir das bitte einmal an, ob dies so richtig ist.

    Mit freundlichen Grüßen

    Mag Gyver

    Kommentar


      Hab den pull request approved. War ja nur die eine Zeile.
      Danke für´s testen (hab selbst gerade wenig Zeit)

      Kommentar


        Hallo ThorstenGehrig,

        kein Problem.


        Mit freundlichen Grüßen

        Mag Gyver

        Kommentar


          Hallo ThorstenGehrig,

          habe auf Bitbucket noch einen pull requests gestartet.


          Anpassungen durchgeführt:

          Readme


          Funktionen hinzugefügt:

          Knx Telegram.cpp
          Knx Telegram.h
          Knx TpUart.cpp
          Knx TpUart.h


          Aufnahme der neuen Funktionen in die Examples:

          Groupread.ino
          ReceiveKNXTelegrams.ino
          ReplyToKNXRead.ino


          Die Änderungen bzw. Anpassungen der Funktionen sind getestet mit den jeweiligen Examples.


          Checke dies Änderungen bzw. Anpassungen bei Gelegenheit gegen.
          Danke.




          Mit freundlichen Grüßen

          Mag Gyver

          Kommentar


            Done. Was hast du umgebaut/eingebaut?

            Kommentar


              Hallo ThorstenGehrig,

              ein wenig mehr als letztes Mal.

              Änderung in Funktion:

              Code:
              void setKNXTime(int day, int hours, int minutes, int seconds);
              nach
              Code:
              void set3ByteTime(int weekday, int hour, int minute, int second);
              Zusätzliche Funktion:

              Code:
              void set3ByteDate(int day, int month, int year);
              Antworten auf Leseanfragen:

              Code:
              bool groupAnswer3ByteTime(String, int, int, int, int);
              bool groupAnswer3ByteDate(String, int, int, int);
              Variablenübergabe auf Leseanfragen:

              Code:
              int get3ByteWeekdayValue();
              int get3ByteHourValue();
              int get3ByteMinuteValue();
              int get3ByteSecondValue();
              
              int get3ByteDayValue();
              int get3ByteMonthValue();
              int get3ByteYearValue();
              Aufnahme und Änderungen in Readme:

              siehe oben und

              Code:
              bool groupRead(String);

              Danach ein bisschen sortieren und gruppieren, damit man beim Lesen keine Augenkrämpfe bekommt.

              Anpassung und Prüfung der Examples mit neuem Code.



              Mit freundlichen Grüßen

              Mag Gyver
              Zuletzt geändert von Mag Gyver; 21.02.2016, 18:49.

              Kommentar


                Cheapau.
                Danke :-)
                Ich kann dir gerne commit rechte geben - die Qualität gefällt mir!
                Grüße aus Barcelona (morgen fängt der MWC an)

                Kommentar


                  Hallo ThorstenGehrig,

                  das mit den Rechten halte ich persönlich für nicht sinnvoll. Es sollte ja Jemand das noch gegenprüfen oder zumindest überfliegen.

                  Ich benütze deinen Code als Vorlage für meinen kleinen Projekte, deshalb versuche ich sinnvolle Sachen direkt zu integrieren.
                  Darüberhinaus könnten noch Andere davon profitieren.

                  Wie gesagt, Programmieren ist schon eine ganze Weile her. Mache dies nicht beruflich.

                  Viel Spaß in Barcelona auf der Handymesse !


                  Mit freundlichen Grüßen

                  Mag Gyver

                  Kommentar


                    Passt schon. Bei mir ist es nicht viel anders ;-)

                    Kommentar


                      Hallo ThorstenGehrig,

                      habe auf Bitbucket noch einen weiteren pull requests gestartet.

                      Habe die Schreibfunktionen

                      Code:
                      bool groupWrite4BitInt(String, int);
                      bool groupWrite4BitDim(String, bool, byte);
                      und die Antwortfunktionen (Die Antwortfunktionen sind eigentlich nicht notwendig, aber man weis ja nie)

                      Code:
                      /*
                      bool groupAnswer4BitInt(String, int);
                      bool groupAnswer4BitDim(String, bool, byte);
                      */
                      sowie die dazugehörigen Rückgabefunktionen

                      Code:
                      int get4BitIntValue();
                      bool get4BitDirectionValue();
                      byte get4BitStepsValue();
                      in die Library aufgenommen.

                      Aufnahme der neuen Funktionen in Readme.
                      Anpassung und Prüfung der Examples mit neuem Code.

                      Dadurch kann man 4 Bit Werte auf den KNX-Bus Senden oder Empfangen. Es stehen zwei grundsätzliche Funktionen zur Verfügung.
                      1. Senden + Empfangen + (Antworten) als gemeinsamer 4 Bit Wert bei Eingabe- und Rückgabe
                      2. Senden + Empfangen + (Antworten) Richtung / Schritte getrennt Eingabe- und Rückgabe, jedoch wird immer der komplette 4 Bit Wert gesendet bzw. empfangen
                      Näheres hierzu finden man im ReceiveKNXTelegrams.ino



                      Mit freundlichen Grüßen

                      Mag Gyver

                      Kommentar


                        Projektvorstellung 1-wire Sensoren über Arduino am Bus


                        Hallo,

                        ich habe mir die diversen 1-wire-Sketche im Netz zu Gemüte geführt und bin zu einer für mich akzeptablen Lösung gekommen, um möglichst viele Temperaturen auf den Bus zu bekommen.

                        Bauteile
                        Arduino R3
                        SIEMENS 5WG1117-2AB12
                        kleine zusammengelötete Adapterplatine mit 2 Optokopplern, um den Arduino mit dem Bus zu verbinden
                        Spannungsversorgung Arduino nicht vom Bus, betrachte ich aber nicht als Problem in meinem Fall

                        Als Sensoren verwende ich aktuell 3 DS18S20 mit einer Auflösung von 0,5K (ich weis, DS18B20 hat eine höhere Auflösung, die sind aber bei einer spontanen Pollinbestellung mal eben zum Testen mitbestellt worden...

                        Trotz das mein Sketch fleißig Werte auf den Bus bringt, habe ich noch ein paar ungelöste Fragen an die Programmierer unter Euch:

                        1. Die Adressen der Sensoren werden in ja 8 byte gesendet und empfangen. Der Einfachheit halber habe ich nur die letzten beiden byte verglichen, da sich meine Sensoren dort unterschieden haben. Kann man das so machen, wenn man den Überblick behält oder gibt es auch eine einfachere Lösung?

                        2. Für den Datenverkehr habe ich Pin 10 verwendet. Trotzdem blinkt die TX-LED munter im Sekundentakt mit, auch wenn ich den KNX-Teil komplett weglasse. Wenn der Serial-Monitor aus ist, dauert es gut 5 Minuten bis die TX-LED dauerhaft leuchtet. Die Temperaturen werden aber weiterhin fleißig gesendet. Wie ist dieses Verhalten zu erklären?

                        3. Die im gesamten Sketch enthaltenen Serial.print() sind nur zum Anschauen auf dem Serialmonitor der Arduino-Ide gedacht. Dachte ich. Und habe sie alle kaltgestellt, weil ich Sie nur am Anfang benötigt habe. Wenn ich das im Sketch ganz unten befindliche
                        Code:
                        Serial.print( OneWire::crc8( data, 8), HEX);
                        auch kaltstelle, erhalte ich die tollsten Temperaturwerte. Woran liegt das oder habe ich hier einen Denkfehler?

                        4. Wo zeigen sich hier die Grenzen hinsichtlich Anzahl der Sensoren und Performance, wenn man bedenkt, daß der Arduino nur diese Aufgabe hat. Ich glaube, Wintermute hatte sich in einem früheren Beitrag negativ dazu geäußert?


                        Letzte Frage an alle:
                        Ist diese Projektvorstellung einen eigenen Thread wert, um den Originalthread nicht noch mehr aufzublähen?
                        Gehören Sketche wie der Nachfolgende nicht genauso in die Rubrik Code-Schnipsel?

                        Jens

                        Code:
                        #include <OneWire.h>
                        #include <KnxTpUart.h>
                        
                        // Initialize the KNX TP-UART library on the Serial1 port of Arduino
                        KnxTpUart knx(&Serial, "1.1.199");
                        
                        
                        // DS18S20 Temperaturchip i/o
                        // DS18B20 Temperaturchip i/o
                        
                        OneWire ds(10); // an pin 10
                        
                        int haveSent = 0;
                        
                        byte i;
                        
                        byte present = 0;
                        
                        byte data[12];
                        
                        byte addr[8];
                        
                        int HighByte, LowByte, TReading, SignBit;
                        
                        float Tc_100, a;
                        
                        
                        
                        
                        
                        
                        void setup() {
                        
                        // inputs/outputs initialisieren
                        
                        // seriellen port starten
                        
                        
                        Serial.begin(19200);
                        UCSR0C = UCSR0C | B00100000; // Even Parity
                        
                        knx.uartReset();
                        
                        }
                        
                        
                        
                        
                        void loop() {
                        
                        // Sensoren suchen
                        
                        delay(1000); //alle 1sek eine Messung
                        
                        if ( !ds.search(addr)) {
                        
                        // Serial.print("Keine weiteren Addressen.\n");
                        
                        ds.reset_search();
                        
                        return;
                        
                        }
                        
                        // Hier stehen die Adressen der Temperatursensoren
                        
                        // Serial.print("Adresse =");
                        
                        // for( i = 0; i < 8; i++) {
                        
                        // Serial.print(addr[i], DEC);
                        
                        // Serial.print(" ");
                        
                        // }
                        
                        // Serial.println(" ");
                        
                        
                        // if ( OneWire::crc8( addr, 7) != addr[7]) {
                        
                        // Serial.print("CRC nicht gültig!\n");
                        
                        // return;
                        
                        // }
                        
                        /* Hier wird die Gerätefamilie ermittelt
                        
                        if ( addr[0] == 0x10) {
                        
                        Serial.print("Gerät ist aus der DS18S20 Familie.\n");
                        
                        }
                        
                        else if ( addr[0] == 0x28) {
                        
                        Serial.print("Gerät ist aus der DS18B20 Familie.\n");
                        
                        }
                        
                        else {
                        
                        Serial.print("Gerätefamilie nicht erkannt : 0x");
                        
                        Serial.println(addr[0],HEX);
                        
                        return;
                        
                        }
                        
                        */
                        
                        // man sollte ein ds.depower() hier machen, aber ein reset tut das auch
                        
                        ds.reset();
                        
                        ds.select(addr);
                        
                        ds.write(0x44,1); // start Konvertierung, mit power-on am Ende
                        
                        present = ds.reset();
                        
                        ds.select(addr);
                        
                        ds.write(0xBE); // Wert lesen
                        
                        LowByte = data[0];
                        HighByte = data[1];
                        TReading = (HighByte << 8) + LowByte;
                        SignBit = TReading & 0x8000; // test most sig bit
                        
                        if (SignBit) {// negative
                        //TReading = (TReading ^ 0xffff) + 1; // 2's comp
                        TReading = !TReading + 1;
                        TReading = (TReading * -1);
                        }
                        
                        // Tc_100 = (6 * TReading) + TReading / 4; // mal (100 * 0.0625) oder 6.25 bei ds18B20
                        // Tc_100 = (TReading*100/2); //bei ds18s20
                        
                        Tc_100 = (TReading*100/2);
                        
                        if (addr[6] == 0 && addr[7] == 135){
                        delay (100);
                        haveSent = false;
                        if (!haveSent) {
                        float success = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen
                        haveSent = true;
                        }
                        }
                        else if (addr[6] == 0 && addr[7] == 2){
                        delay (100);
                        haveSent = false;
                        if (!haveSent) {
                        float success = knx.groupWrite2ByteFloat("5/3/2", (Tc_100 / 100)); //Isttemp Bad
                        haveSent = true;
                        }
                        }
                        else if (addr[6] == 0 && addr[7] == 252){
                        delay (100);
                        haveSent = false;
                        if (!haveSent) {
                        float success = knx.groupWrite2ByteFloat("7/3/2", (Tc_100 / 100)); //Isttemp Wohnen
                        haveSent = true;
                        }
                        }
                        
                        // Serial.println(" ");
                        
                        // Serial.print("P=");
                        
                        // Serial.print(present,HEX);
                        
                        // Serial.print(" ");
                        
                        for ( i = 0; i < 9; i++) { // 9 bytes
                        
                        data[i] = ds.read();
                        
                        // Serial.print(data[i], HEX);
                        
                        // Serial.print(" ");
                        
                        }
                        // Serial.println(" ");
                        // Serial.print("CRC=");
                        
                        Serial.print( OneWire::crc8( data, 8), HEX);
                        
                        // Serial.println();
                        // Serial.println(" ");
                        
                        }

                        Kommentar


                          Hi,
                          @MacGyver: super. Genau so habe ich mir open source collaboration vorgestellt: nicht nur hinweise auf Bugs und "Anforderungen" - sondern auch eigene Implementierungen (auch wenn es manchmal Spaß macht sich durch die KNX spec durchzuwühlen...). Ich habe eben erst, beim nochmaligen durchlesen, gesehen das du im vorletzten commit schon neue Telegrammarten hinzugefügt hast (set3ByteDate) - und nun noch 4-Bit Dim-Telegramme.
                          Super! Verrätst du und noch deine Projekte wo du das Einsetzt?
                          Außerdem habe ich dir Admin/Commit rechte gegeben... die Code qualität passt und ein rollback ist ja jederzeit möglich.

                          @Jens: allzuviele deiner Fragen kann ich zwar nicht beantworten - da ich mich nicht mit 1Wire auf dem Arudino beschäftigt habe... trotzdem eine info:
                          du schreibst "float success = knx.group...." - dabei gibt es auf eiin knx.groupWrite ... nur ein 0 (fail) oder 1 (success) zurück.
                          Mit float definierst du die variable aber als float - int würde aber reichen.
                          (hat alles nichts mit deinen anderen Fragen zu tun).
                          ... wenn ich mir den code genauer ansehe macht du das "doppelt gemoppelt" mit dem "haveSend".
                          Also eigentlich müsste auch statt das:
                          Code:
                              haveSent = false;
                              if (!haveSent) {
                                float success = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen
                                haveSent = true;
                              }
                          auch das gehen:
                          Code:
                              haveSent = false;
                              if (!haveSent) {
                                haveSent = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen
                              }
                          da du aber "haveSend" garnicht auswertest - kannst du auch noch einfacher:
                          Code:
                                haveSend = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen
                          Weiterhin - wenn ich den code mal "trocken" lese: ich vermute mal der Loop liest jede sekunde den "nächsten" 1-Wire aus? Und anschließend schaust du ob es Schlafen/Bad/Wohnen ist - und schreibst den Wert auf den Bus.
                          Das würde jede Sekunde einen Wert bedeuten ... eine Ziemliche buslast.
                          Wenn das funktioniert solltest du die Werte speichern und nur bei änderung über x% erneut senden - oder nach Zeit y.

                          Falls man den "OneWire::crc8 (data, 8) HEX);" kannst du den auch ohne Serial.print ausführen.
                          Einfach "int test = Serial.print( OneWire::crc8( data, 8), HEX);" verwenden... so müsste der letzte Teil so aussehen:
                          Code:
                            for ( i = 0; i < 9; i++) { // 9 bytes
                              data[i] = ds.read();
                            }
                            dummy = ( OneWire::crc8( data, 8), HEX);
                          Last but not least: ein solcher Demo code ist schön - aber bei der "arbeit" die noch vor dir liegt bist er sauber/final ist - macht ein eigener Thread vielleicht sinn :-)

                          Gruß
                          Thorsten


                          Kommentar


                            Hallo Thorsten,

                            danke für die Info und Codeunterstützung.

                            Ganz kurz noch dazu: Ist der von mir eingesetzte havesend-Code nicht dazu da, mehrfaches Senden zu verhindern?

                            Mit der Buslast hast Du natürlich recht, da gehen auch größere Zeitabstände, da man ja nicht wirklich aller 1 sek einen Temperaturwert braucht. Oder wie du schon richtig schreibst, senden bei Änderung...

                            Punkt 2 erledigt, da ohne mein Zutun der Fehler? von gestern nicht wieder aufgetreten ist
                            Punkt 3 erledigt


                            Jens

                            Kommentar


                              Hallo ThorstenGehrig,

                              meine kleinen Projekte sind bei mir im Haus verbaut.
                              • Digitales Schlüsselbrett mit I-Button´s
                              • Übergabe Zeit und Datum vom KNX-Bus an ein Fremdsystem mit Synchronisierungstelegram
                              • Synchronisierung und Ansteuerung einer Uhr mit 86 LED´s
                              • Erkennung einer akustischen Meldung zum Starten einer Schaltsequenz auf KNX
                              • Kopplung zwischen Siemens Logo 0BA7 und KNX
                              • Kopplung Heizung und KNX über einen eigenwilligen Heizungssteuerungsbus
                              • u.s.w
                              Dinge die man halt nicht mehr vermissen möchte, wenn man Diese erst einmal hat.

                              Eigentlich hat dein Code alles erst ins rollen gebracht.
                              Ich hatte schon lange nach einem Code für EIB/KNX auf dem ATmega 328P oder dieser ATmega-Reihe gesucht.
                              Eben für kleine Projekte, was es nicht zu kaufen gibt und/oder nie hergestellt werden wird.

                              @ intelligente Haustechnik

                              Rob Tillaart hat eine Library geschrieben (mit vielen Beispielen), vielleicht hilft dir davon etwas. Link siehe weiter unten.
                              Hat mir bei meinen I-Button´s auch geholfen.
                              Code:
                              http://forum.arduino.cc/index.php?topic=333923
                              Code-Schnipsel können ein gute Basis sein, um die Sache aus einem anderen Winkel zu betrachten.



                              Mit freundlichen Grüßen

                              Mag Gyver
                              Zuletzt geändert von Mag Gyver; 02.03.2016, 19:27.

                              Kommentar


                                Empfang vom Bus klappt nicht

                                Aber erst mal "Hallo" in diesen Thread und vielen Dank für die Idee und die Arbeit zur Umsetzung.

                                Ich habe bisher mit der KnxTpUart-Library eine kleine Wetterstation gebastelt, die zyklisch die aktuellen Messwerte auf den Bus sendet. Das habe ich mit meiner copy&paste-Programmierung recht gut und zügig hinbekommen.

                                Jetzt wollte ich einen Schritt weiter gehen und per GA (Schalt-)Befehle an den Arduino senden.
                                Zum Test habe ich (auf Grundlage des Beispiels "ReceiveKNXTelegrams") ein kleines Sketch erstellt und geladen:

                                Code:
                                #include <KnxTpUart.h>
                                
                                // Initialize the KNX TP-UART library on the Serial port of Arduino Uno
                                // and with KNX physical address 1.1.5
                                KnxTpUart knx(&Serial, "1.1.5");
                                
                                int LED = LED_BUILTIN;
                                
                                void setup() {
                                  pinMode(LED, OUTPUT);
                                  digitalWrite(LED, LOW);
                                
                                  Serial.begin(19200);
                                  UCSR0C = UCSR0C | B00100000; // Even Parity
                                
                                  knx.uartReset();
                                 
                                  knx.addListenGroupAddress("15/0/0");
                                }
                                
                                
                                void loop() {
                                  // nothing in the loop. This example is only to receive telegrams
                                }
                                
                                void serialEvent() {
                                  KnxTpUartSerialEventType eType = knx.serialEvent();
                                  if (eType == TPUART_RESET_INDICATION) {
                                  } else if (eType == UNKNOWN) {
                                  } else if (eType == 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());
                                
                                    // Here you have the telegram and can do whatever you want
                                    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
                                      // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
                                      if (target == "15/0/0") {
                                        int received_15_0_0 = telegram->getBool();
                                        if (received_15_0_0) {
                                          digitalWrite(LED, HIGH);
                                        }
                                        else {
                                          digitalWrite(LED, LOW);
                                        }
                                      }
                                    }
                                  }
                                }
                                Jetzt sollte ich im ETS-Gruppenmonitor mittels beschreiben der GA 15/0/0 die eingebaute LED schalten können - dies klappt aber nicht !?

                                Zum Test mal ein kleines Sende-Sketch geladen:

                                Code:
                                // EIN-/AUS-Schalten der GA 15/0/0 (DPT 1)  
                                #define GA "15/0/0"  
                                
                                #include <KnxTpUart.h>      // Bibliothek zur KNX-Anbindung
                                // Initalisierung der KNX TP-UART library ...
                                // ... mit der Physikal. Adresse "1.1.5"
                                KnxTpUart knx(&Serial, "1.1.5");
                                
                                void setup() {
                                  Serial.begin(19200);          // init. serielle Schnittstelle
                                  UCSR0C = UCSR0C | B00100000;  // Parität even
                                  knx.uartReset();              // UART initialisieren
                                }
                                
                                void loop() {
                                  knx.groupWriteBool(GA, 1);
                                  delay (2500);
                                  knx.groupWriteBool(GA, 0);
                                  delay (2500);  
                                }
                                ... und OK, die GA schaltet im Gruppenmonitor abwechseld zwischen 0 und 1

                                ... also Verkabelung zwischen Arduino und BCU sowie Busverbindung usw. OK

                                dann noch
                                1) das erste Sketch auf verschiedener Hardware getestet:
                                - ich habe zwei verschiedene BCUs versucht
                                - zwei ProMinis und einen Uno ausprobiert

                                2) zur Sicherheit noch mal die neueste Version (am Sonntag / 6.3.16) runtergeladen und installiert

                                3) nochmals diesen Thread durchgelesen (und hoffentlich nichts übersehen ;-)

                                ... und immer das gleiche Ergebniss: senden geht, empfangen nicht

                                Ich habe leider keinen Mega o.ä. da, um Serial1 zur Fehlersuche zu nutzen. So habe ich ein paar Sketche gebastelt, die mittels LEDs an diversen Ausgängen zeigen, sollen, in welchen Programmteil verzweigt wird. Hierdurch konnte ich herausfinden, dass das Sketch immer in den Zweig "eType == UNKNOWN" läuft, also keine gültigen KNX-Telegramme ankommen.
                                Sollte / muss ich mir noch einen Mega zum Testen bestellen? (Wollte ich vermeiden, da ich vermute, dass ich nur zum gleichen Ergebnis komme.)

                                Habt Ihr noch Tipps für mich, wo / wie ich weiter suchen kann (ich habe inzwischen wohl schon einen recht vernebelten Blick auf das Problem)?
                                Danke schon Mal.

                                Gruß Marco

                                Kommentar

                                Lädt...
                                X