Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Hallo dirkan das mit dem Zweitbus würde ich nicht machen. Eher alle Sensorik gleich mal auf KNX bringen. Vielleicht ist ja das Sensormodul von Masifi was für dich?

    Kommentar


      Dieser link auf das Sensormodul ist besser: https://knx-user-forum.de/forum/%C3%...-1-wire-buzzer
      Das ist der aktuellere Thread.
      www.smart-mf.de | KNX-Klingel | GardenControl | OpenKNX-Wiki

      Kommentar


        Danke für eure Links. Das ist eine sehr interessante und bemerkenswerte Entwicklung. Ich halte das mal im Auge.
        Gruss Dirk

        Kommentar


          Empfangsprobleme

          Ich habe mir einen 5WG1117-2AB12 besorgt und an einen Arduino Uno gehängt. Das Senden von KNX-Telegrammen mit der library funktioniert, die tauchen im ETS BUS/GA-Monitor auf, perfekt.

          Allerdings habe ich noch kein einziges Telegramm empfangen können. Ich habe sowohl einen UNO als auch einen NANO probiert, aber es kommen einfach keine SerialEvents hinen. Mit einem Oszilloskop kann ich auf dem TX-Pin der BCU ein digitales Signal sehen, wenn ich in der ETS etwas sende (und auch, wenn andere Geräte auf dem Bus was senden). Auf dem Nano kann man die RX-LED ganz schwach blinken sehen, wenn ein Telegramm ankommt. Aber keiner der Arduinos bekommt davon etwas mit. Hier mein simples Testprogramm:

          Code:
          void setup()
          {
            pinMode(LED_BUILTIN, OUTPUT);
            digitalWrite(LED_BUILTIN, HIGH);
            Serial.begin(19200, SERIAL_8E1); // KNX settings
          }
          
          void loop()
          {
            // nix
          }
          
          void serialEvent()
          {
            digitalWrite(LED_BUILTIN, LOW);
          }
          Sobald irgendein Byte hereinkommt, sollte die LED ausgehen. Das funktioniert, wenn ich den Arduino am USB-port habe und per Serial Monitor ein paar bytes eintippe. Aber nicht, wenn der Arduino an der BCU hängt (USB ist dann natürlich abgezogen).

          Irgendwelche Tipps?

          Kommentar


            Hallo Kunkrab,

            für das Empfangen kannst du dir den Beispielsketch ReceiveKNXTelegrams.ino benützen.

            Achtung dieser ist für den Arduino Mega geschrieben, das heißt du musst da noch Anpassungen für den Arduino Uno oder Arduino Nano machen.
            Bitte beachte auch die Hinweise im Beispielsketch GroupRead.ino oder in der Datei ReadMe enthalten sind. Getstestet wurde die Library mit original Arduino-Hardware.

            Bei diversen Arduino Klonen wird der CH340 zur USB-Kommunikation zwischen dem Mikroprozessor und dem PC genutzt, da man den CH340 nicht dazu bewegen kann seinen Kommunikationsport hochohmig zu schalten, stört der CH340 dadurch die Punkt zu Punkt Kommunikation zwischen der BCU und dem Mikroprozessor.

            Für dich heißt das nun:

            Anpassen deines Sketches um überhaupt Telegramme empfangen zu können, dazu musst du dem Arduino die von dir benutzen Gruppenadresse auf die er reagieren soll erst mitteilen. Dann kannst du diese auch Auswerten, egal ob im Loop oder im Serial Event.

            Entweder hast du einen originall Arduino Uno R3, dann kannst du wie in den oben genannten Dokumenten beschrieben verfahren. Beim Arduino Nano geht diese vorhaben nicht, hierzu würde ich dir einen Arduino Pro oder einen Arduino Pro Mini und dazu noch ein USB-zu-TTL Konverter Modul vorschlagen.

            Du kannst natürlich den CH340 vom Aduino Nano herunterlöten und dann zum Hochladen deines Sketches ein USB-zu-TTL Konverter Modul benutzen.


            Mit freundlichen Grüßen

            Mag Gyver

            Kommentar


              Ok, wenn niemand antwortet, muss ich das selber tun 😉
              Mein Problem war, dass Uno und Nano beide ihr USB auf den RX/TX pins haben. Der USB chip hat offensichtlich soviel vom Eingangssignal "weggefressen", dass es nicht mehr für die Signalerkennung ausreichte. Ich hatte das dann mit dem Oszi auch gemessen, da blieben nur noch knapp 3 Volt übrig, von den 4.5V, die das TPUART liefert. Jetzt habe ich zwei Inverter eines 7404 TTL chips vor den RX input gehängt, und jetzt geht es. Das ist nicht wirklich eine praktikable Lösung, aber fixt das Problem. Die Lösung sind hoffentlich die Arduino Pro Minis, die demnächst kommen ...

              Edit: Danke, Mag Gyver , hab deine Antwort erst danach gesehen, und genau das habe ich vor. Vielleicht hilft jemand anderem ja die 7404-Lösung.

              Arduino-7404.jpg
              Zuletzt geändert von Kunkrab; 11.10.2020, 09:38.

              Kommentar


                Hi Thorsten.

                Versuche grade, von meinem ESP8266 Telegramme abzuschicken. Allerdings bekomme ich beim Kompilieren einen Fehler in der Library-Datei \Arduino\libraries\KnxTpUart\KnxTelegram.cpp angezeigt. Sagt: In member function 'void KnxTelegram::set2ByteFloatValue(float)' --> line 357:23: error: invalid operands of types 'double' and 'int' to binary 'operator&' long m = round(v) & 0x7FF;

                Hast du zufällig irgendeine Idee?

                Kommentar


                  Reicht die Arbeitsgeschwindigkeit eines Pro Micros nicht aus, um zwei Telegramme, die auf den Bus gelegt werden "gleichzeitig" zu verarbeiten? Hintergrund meiner Frage ist, ich habe ein 8-fach-Relais-Modul an meinem Pro Micro mit Siemens Koppler. Kommt ein passendes Telegram, schaltet ein Ausgang und das Relais und es wird auf eine Status-GA geschrieben. Testweise habe ich mal versucht zwei Listen-GAs zu schalten - funktioniert nicht, das zweite wird anscheinend übersehen.

                  Gibt es ein gutes Example, wie man auf mehrere GAs liest, dann reagiert ohne das etwas verloren geht? Mir geht es um den Programmablauf. Zusätzlich soll das Skretch auch auf Status-Abfragen der Relais antworten.

                  Wisst ihr, was wie ich das meine?

                  Kommentar


                    Zitat von netzlaff Beitrag anzeigen
                    Testweise habe ich mal versucht zwei Listen-GAs zu schalten - funktioniert nicht, das zweite wird anscheinend übersehen.
                    Kannst du deinen Sketch einmal posten?

                    Zitat von netzlaff Beitrag anzeigen
                    Gibt es ein gutes Example, wie man auf mehrere GAs liest, dann reagiert ohne das etwas verloren geht? Mir geht es um den Programmablauf. Zusätzlich soll das Skretch auch auf Status-Abfragen der Relais antworten.
                    In ThorstenGehrigs Repository ist ein Beispiel dabei, das auf mehrere GA-ReadRequests reagiert. In ähnlicher Form läuft es auch bei mir in einem Projekt.

                    Kommentar


                      Hallo. Genau dieses Beispiel-Sketch dient meinem Projekt auch als Vorlage, nur dass ich auch auf COMMAND_WRITE reagieren will/muss.
                      Ich habe das Sketch mal schnell etwas verschlankt, weil es immer 8x das gleiche macht, nur mit unterschiedlichen GAs:

                      Code:
                      #include <KnxTpUart.h>
                      
                      #define PHYSICAL_ADDRESS "1.1.100" /
                      
                      // Gruppen Adressen
                      // Schalten
                      #define R1_ONOFF_GA "0/4/0"
                      #define R2_ONOFF_GA "0/4/1"
                      #define R3_ONOFF_GA "0/4/2"
                      ...bis R8_ONOFF_GA
                      // Status
                      #define R1_STATE_GA "0/4/20"
                      #define R2_STATE_GA "0/4/21"
                      #define R3_STATE_GA "0/4/22"
                      ... bis R8_STATE_GA
                      
                      const int R1 = 2;
                      const int R2 = 3;
                      const int R3 = 4;
                      ...bis R8
                      
                      KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS);
                      
                      void setup() {
                      Serial.begin(9600);
                      Serial.println("TP-UART Test");
                      
                      Serial1.begin(19200, SERIAL_8E1);
                      
                      Serial.print("UCSR1A: ");
                      Serial.println(UCSR1A, BIN);
                      
                      Serial.print("UCSR1B: ");
                      Serial.println(UCSR1B, BIN);
                      
                      Serial.print("UCSR1C: ");
                      Serial.println(UCSR1C, BIN);
                      
                      knx.uartReset();
                      
                      // listen ON/OFF command
                      knx.addListenGroupAddress(R1_ONOFF_GA);
                      knx.addListenGroupAddress(R2_ONOFF_GA);
                      knx.addListenGroupAddress(R3_ONOFF_GA);
                      ...bis R8_ONOFF_GA
                      // listen Status reads
                      knx.addListenGroupAddress(R1_STATE_GA);
                      knx.addListenGroupAddress(R2_STATE_GA);
                      knx.addListenGroupAddress(R3_STATE_GA);
                      ...bis R8_STATE_GA
                      pinMode(R1, OUTPUT);
                      pinMode(R2, OUTPUT);
                      pinMode(R3, OUTPUT);
                      pinMode(R4, OUTPUT);
                      pinMode(R5, OUTPUT);
                      pinMode(R6, OUTPUT);
                      pinMode(R7, OUTPUT);
                      pinMode(R8, OUTPUT);
                      
                      digitalWrite(R1, HIGH);
                      digitalWrite(R2, HIGH);
                      digitalWrite(R3, HIGH);
                      digitalWrite(R4, HIGH);
                      digitalWrite(R5, HIGH);
                      digitalWrite(R6, HIGH);
                      digitalWrite(R7, HIGH);
                      digitalWrite(R8, HIGH);
                      knx.groupWriteBool(R1_STATE_GA, false);
                      knx.groupWriteBool(R2_STATE_GA, false);
                      knx.groupWriteBool(R3_STATE_GA, false);
                      knx.groupWriteBool(R4_STATE_GA, false);
                      knx.groupWriteBool(R5_STATE_GA, false);
                      knx.groupWriteBool(R6_STATE_GA, false);
                      knx.groupWriteBool(R7_STATE_GA, false);
                      knx.groupWriteBool(R8_STATE_GA, false);
                      }
                      
                      void loop() {
                      }
                      
                      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());
                      
                      // KNX READ
                      if (telegram->getCommand() == KNX_COMMAND_READ) {
                      
                      // R1
                      if (target == R1_STATE_GA) {
                      Serial.print("R1:State Read");
                      if (digitalRead(R1) == HIGH) {
                      knx.groupAnswerBool(R1_STATE_GA, false);
                      }
                      else {
                      knx.groupAnswerBool(R1_STATE_GA, true);
                      }
                      }
                      
                      // R2
                      if (target == R2_STATE_GA) {
                      Serial.print("R2:State Read");
                      if (digitalRead(R2) == HIGH) {
                      knx.groupAnswerBool(R2_STATE_GA, false);
                      }
                      else {
                      knx.groupAnswerBool(R2_STATE_GA, true);
                      }
                      }
                      
                      // R3
                      if (target == R3_STATE_GA) {
                      Serial.print("R3:State Read");
                      if (digitalRead(R3) == HIGH) {
                      knx.groupAnswerBool(R3_STATE_GA, false);
                      }
                      else {
                      knx.groupAnswerBool(R3_STATE_GA, true);
                      }
                      }
                      
                      ...bis R8, immer identischer Ablauf
                      }
                      
                      
                      // KNX WRITE
                      if (telegram->getCommand() == KNX_COMMAND_WRITE) {
                      // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
                      
                      // R1
                      if (target == R1_ONOFF_GA) {
                      int R1_state = telegram->getBool();
                      Serial.print("R1:");
                      Serial.println(R1_state);
                      if (R1_state) {
                      digitalWrite(R1, LOW);
                      knx.groupWriteBool(R1_STATE_GA, true);
                      }
                      else {
                      digitalWrite(R1, HIGH);
                      knx.groupWriteBool(R1_STATE_GA, false);
                      }
                      }
                      
                      // R2
                      if (target == R2_ONOFF_GA) {
                      int R2_state = telegram->getBool();
                      Serial.print("R2:");
                      Serial.println(R2_state);
                      if (R2_state) {
                      digitalWrite(R2, LOW);
                      knx.groupWriteBool(R2_STATE_GA, true);
                      }
                      else {
                      digitalWrite(R2, HIGH);
                      knx.groupWriteBool(R2_STATE_GA, false);
                      }
                      }
                      
                      // R3
                      if (target == R3_ONOFF_GA) {
                      int R3_state = telegram->getBool();
                      Serial.print("R3:");
                      Serial.println(R3_state);
                      if (R3_state) {
                      digitalWrite(R3, LOW);
                      knx.groupWriteBool(R3_STATE_GA, true);
                      }
                      else {
                      digitalWrite(R3, HIGH);
                      knx.groupWriteBool(R3_STATE_GA, false);
                      }
                      }
                      
                      ...bis R8, Ablauf immer identisch
                      }
                      }
                      }
                      }

                      Sicher könnte man sich die ganzen IF-Abfragen sparen und ggf. mit CASE oder sowas arbeiten, vielleicht liegt es auf daran?


                      EDIT:

                      Meint Test-Pro-Micro war heute in der Post. Habe ihn mal mit diesem Sketch beladen und an ein Steckboard mit zwei Test-LEDs gesteckt. Habe dann mal zwei der GAs über KNX gleichzeitig geschaltet. Und auch hier ist es so, dass die erste LED geschaltet wird, die zweite aber nicht. Wenn der Zeitabstand größer ist, klappt es. Ich gehe ganz stark davon aus, dass mein Code für diesen Zweck etwas suboptimal ist.
                      Wie könnte man dies schöner, bzw. funktionaler gestalten. Unter Umständen möchte ich alle 8 Ausgänge gleichzeitig schalten und mich schon darauf verlassen, dass nicht "vergessen" wird.
                      Zuletzt geändert von netzlaff; 05.11.2020, 18:01. Grund: Test-Aufbau mit gleichem Ergebnis

                      Kommentar


                        Zitat von netzlaff Beitrag anzeigen
                        Ich gehe ganz stark davon aus, dass mein Code für diesen Zweck etwas suboptimal ist.
                        Richtig, ich vermute die Debug-ausgabe bremst stark. Erst mal die Baudrate des Serial auf 38400 (oder so was) hochschrauben. Wenns noch zu langsam ist die "Serial print" aus der Auswertung auskommentieren.
                        Ein Durchlauf der Funktion SerialEvent1 muss so kurz wie möglich sein.
                        Dann würde ich die ifs auf ein switch case ändern (oder else if). Und die "if (Rx_state)" in den loop verschieben.

                        Kommentar


                          Ok, verstehe.

                          Wie würde eine Aufbau der if (Rx_state) im loop aussehen? Müsste ich dort das target wieder genauso aufbauen wie in SerialEvent1?


                          case auf target funktioniert leider nicht, klappt wohl nur bei int und char.
                          Habe die Schleifen dann alle umgebaut auf if...elseif...
                          Debug auf Serial ist nun auch komplett raus.
                          Leider keine Besserung. Ich habe testweise mal die den ganzen KNX_COMMAND_READ rausgenommen, da ich noch nicht weiß, wie ich diesen im Loop() unterbringe. Hat aber auch nichts gebracht.

                          Code:
                          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());
                          
                          // KNX READ
                          if (telegram->getCommand() == KNX_COMMAND_READ) {
                          int R = 0;
                          String R_STATE_GA = "";
                          
                          if ( target == R1_STATE_GA ) {
                          R = R1;
                          R_STATE_GA = R1_STATE_GA;
                          }
                          else if ( target == R2_STATE_GA ) {
                          R = R2;
                          R_STATE_GA = R2_STATE_GA;
                          }
                          else if ( target == R3_STATE_GA ) {
                          R = R3;
                          R_STATE_GA = R3_STATE_GA;
                          }
                          else if ( target == R4_STATE_GA ) {
                          R = R4;
                          R_STATE_GA = R4_STATE_GA;
                          }
                          else if ( target == R5_STATE_GA ) {
                          R = R5;
                          R_STATE_GA = R5_STATE_GA;
                          }
                          else if ( target == R6_STATE_GA ) {
                          R = R6;
                          R_STATE_GA = R6_STATE_GA;
                          }
                          //else if ( target == R7_STATE_GA ) {
                          // R = R7;
                          // R_STATE_GA = R7_STATE_GA;
                          //}
                          else if ( target == R8_STATE_GA ) {
                          R = R8;
                          R_STATE_GA = R8_STATE_GA;
                          }
                          
                          if (digitalRead(R) == HIGH) {
                          knx.groupAnswerBool(R_STATE_GA, false);
                          }
                          else {
                          knx.groupAnswerBool(R_STATE_GA, true);
                          }
                          }
                          
                          
                          // KNX WRITE
                          if (telegram->getCommand() == KNX_COMMAND_WRITE) {
                          int R = 0;
                          String R_STATE_GA = "";
                          
                          if ( target == R1_ONOFF_GA ) {
                          R = R1;
                          R_STATE_GA = R1_STATE_GA;
                          }
                          else if ( target == R2_ONOFF_GA ) {
                          R = R2;
                          R_STATE_GA = R2_STATE_GA;
                          }
                          else if ( target == R3_ONOFF_GA ) {
                          R = R3;
                          R_STATE_GA = R3_STATE_GA;
                          }
                          else if ( target == R4_ONOFF_GA ) {
                          R = R4;
                          R_STATE_GA = R4_STATE_GA;
                          }
                          else if ( target == R5_ONOFF_GA ) {
                          R = R5;
                          R_STATE_GA = R5_STATE_GA;
                          }
                          else if ( target == R6_ONOFF_GA ) {
                          R = R6;
                          R_STATE_GA = R6_STATE_GA;
                          }
                          //else if ( target == R7_ONOFF_GA ) {
                          // R = R7;
                          // R_STATE_GA = R7_STATE_GA;
                          //}
                          else if ( target == R8_ONOFF_GA ) {
                          R = R8;
                          R_STATE_GA = R8_STATE_GA;
                          }
                          
                          int R_state = telegram->getBool();
                          if (R_state) {
                          digitalWrite(R, LOW);
                          knx.groupWriteBool(R_STATE_GA, true);
                          }
                          else {
                          digitalWrite(R, HIGH);
                          knx.groupWriteBool(R_STATE_GA, false);
                          }
                          }
                          }
                          }
                          Zuletzt geändert von netzlaff; 06.11.2020, 10:46.

                          Kommentar


                            Ich gebe zu ich kenne diesen Stack nicht richtig, hab nur 1x kurz damit rum gespielt, aber einige andere Stacks hab ich intensiver in Verwendung.
                            Ich glaub ich hab dich in die falsche Richtung geschickt mit der Auslagerung in den loop, mach das mal wieder rückgängig...

                            Kommentar


                              Ok, habs gar nicht hinbekommen. Aktuell ist loop() leer, alles wird über void serialEvent1() abgefragt, so wie in meinem letzten Sketch. Nach wie vor ist es so, dass der auf das zweite WRITE einer Listener-GA nicht reagiert, beispielsweise R4_ONOFF_GA und R5_ONOFF_GA. R4 wird geschaltet, R5 nicht.

                              Kommentar


                                funktioniert es wenn du den Schreibvorgang der Status_GA mal testweise auskommentierst?

                                Kommentar

                                Lädt...
                                X