Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Danke dreamy1

    Dann werde ich mir wohl den Typ zulegen müssen. Immer diese Anfänger
    ;-)

    Gruß
    Bernhard

    Kommentar


      Hello guys!

      First of all, I have to thank Thorsten for his work!
      Secondly, I would like to apologize fot writing in English, but my German is very weak, especially technical German...

      I would like to ask you for help with communicatin between two KNX devices...

      In my diploma work (fig. 1) I use two KNX devices. Both consist of an Ardunio Nano controller and an Opternus TP-UART2 BOARD BTM2-PCB interface module.
      I need to transfer two integer values (stav_tc, stav_osv) and two boolean values (tienenie_akt, tienenie_deakt) from one device - CONTROL PANEL to another - CONTROL UNIT.

      CONTROL PANEL is situated inside the installation box under the push-buttons in "living room" (fig. 2).
      CONTROL UNIT is situated in switchboard inside the DIN-rail mounted box in "technical room" (fig. 3).

      Schemes of PCB's are available on: https://easyeda.com/mariobachorik/DP_Upravene

      The problem is, that CONTROL PANEL is sending telegram to the bus (Ardunio Tx LED is blinking , fig. 4 - COM4 - reversed ? appears, when Arduino is sending telegram), but CONTROL UNIT can't read telegram from bus (Arduino Rx LED is blinking, but function serialEvent() is not activated).

      My diploma work consultant recommended me to rename function serialEvent() to the handleSerial() and call it in the loop, for example:

      void loop()
      {
      if(Serial.available())
      handleSerial();
      ...
      }

      Unfortunately, this solution did not help me with my problem.

      Below are the source codes of both devices.
      Lines related to communication are marked with comment //KNX.

      Any ideas, guys?

      Thank you in advance for any idea...


      Code used in CONTROL PANEL:

      Code:
      #include <KnxTelegram.h> //KNX
      #include <KnxTpUart.h> //KNX
      
      #include <OneWire.h>
      #include <DallasTemperature.h>
      #include "U8glib.h"
      
      U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
      
      float t_akt;
      float t_poz = 25;
      float t_kurenie;
      float t_chladenie;
      float t_kurenie_h;
      float t_chladenie_h;
      
      int id = 0;
      
      volatile int stav_tc = 0; //KNX
      volatile int stav_osv = 0; //KNX
      volatile bool tienenie_akt = false; //KNX
      volatile bool tienenie_deakt = false; //KNX
      
      const int tl_1 = 7;
      const int tl_2 = 8;
      const int tl_3 = 6;
      const int tl_4 = 4;
      const int tl_5 = 5;
      const int tl_6 = 3;
      const int t_senzor = 2;
      const int tpuart_reset = 13; //KNX
      
      char *str[] = {"NECINNE" , "KURENIE" , "CHLADENIE"};
      
      OneWire oneWireDS(t_senzor);
      DallasTemperature senzoryDS(&oneWireDS);
      
      KnxTpUart knx(&Serial, "1.1.10"); //KNX
      
      void setup() {
      
      senzoryDS.begin();
      
      pinMode(tl_1, INPUT_PULLUP);
      pinMode(tl_2, INPUT_PULLUP);
      pinMode(tl_3, INPUT_PULLUP);
      pinMode(tl_4, INPUT_PULLUP);
      pinMode(tl_5, INPUT_PULLUP);
      pinMode(tl_6, INPUT_PULLUP);
      pinMode(tpuart_reset, OUTPUT); //KNX
      
      digitalWrite(13, HIGH); //KNX
      delay(1000);
      digitalWrite(13, LOW); //KNX
      delay(1000);
      digitalWrite(13, HIGH); //KNX
      delay(1000);
      
      Serial.begin(19200, SERIAL_8E1); //KNX
      knx.uartReset(); //KNX
      delay(2000);
      }
      
      void loop() {
      
      senzoryDS.requestTemperatures();
      t_akt = senzoryDS.getTempCByIndex(0);
      
      u8g.firstPage();
      
      float t_kurenie = t_poz - 2;
      float t_chladenie = t_poz + 2;
      float t_kurenie_h = t_poz + 1;
      float t_chladenie_h = t_poz - 1;
      
      if (digitalRead(tl_1) == LOW && stav_osv >= 1){
      id = 1;
      stav_osv = stav_osv - 1;
      knx.groupWrite1ByteInt("1/1/2", stav_osv); //KNX
      }
      
      if (digitalRead(tl_2) == LOW && stav_osv <= 2){
      id = 2;
      stav_osv = stav_osv + 1;
      knx.groupWrite1ByteInt("1/1/2", stav_osv); //KNX
      }
      
      if (digitalRead(tl_3) == LOW){
      id = 3;
      tienenie_akt = false;
      tienenie_deakt = true;
      knx.groupWriteBool("1/1/3", tienenie_akt); //KNX
      knx.groupWriteBool("1/1/4", tienenie_deakt); //KNX
      }
      
      if (digitalRead(tl_4) == LOW){
      id = 4;
      tienenie_akt = true;
      tienenie_deakt = false;
      knx.groupWriteBool("1/1/3", tienenie_akt); //KNX
      knx.groupWriteBool("1/1/4", tienenie_deakt); //KNX
      }
      
      if (digitalRead(tl_5) == LOW && t_poz > 20){
      t_poz = t_poz - 0.5;
      id = 5;
      }
      
      if (digitalRead(tl_6) == LOW && t_poz < 30){
      t_poz = t_poz + 0.5;
      id = 6;
      }
      
      if (t_akt <= t_kurenie && stav_tc == 0){
      stav_tc = 1;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      if (t_akt >= t_chladenie && stav_tc == 0){
      stav_tc = 2;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      if (t_akt >= t_kurenie_h && stav_tc == 1){
      stav_tc = 0;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      if (t_akt <= t_kurenie && stav_tc == 1){
      stav_tc = 1;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      if (t_akt <= t_chladenie_h && stav_tc == 2){
      stav_tc = 0;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      if (t_akt >= t_chladenie && stav_tc == 2){
      stav_tc = 2;
      knx.groupWrite1ByteInt("1/1/1", stav_tc); //KNX
      }
      
      do {
      draw1();
      } while (u8g.nextPage());
      }
      
      void draw1(void){
      u8g.setFont(u8g_font_profont10);
      
      u8g.setPrintPos(10, 18);
      u8g.print("TEPLOTA V MIESTNOSTI");
      
      u8g.setPrintPos(0, 40);
      u8g.print("Aktualna:");
      
      u8g.setPrintPos(65, 40);
      u8g.print(t_akt);
      
      u8g.setPrintPos(102, 40);
      u8g.print("st. C");
      
      u8g.setPrintPos(0, 50);
      u8g.print("Pozadovana:");
      
      u8g.setPrintPos(65, 50);
      u8g.print(t_poz);
      
      u8g.setPrintPos(102, 50);
      u8g.print("st. C");
      
      u8g.setPrintPos(0, 60);
      u8g.print("Stav:");
      
      u8g.setPrintPos(65, 60);
      u8g.print(str[stav_tc]);
      
      u8g.setPrintPos(120, 60);
      u8g.print(id);
      
      u8g.setPrintPos(55, 60);
      u8g.print(stav_osv);
      
      u8g.setPrintPos(0, 18);
      u8g.print(tienenie_akt);
      
      u8g.setPrintPos(120, 18);
      u8g.print(tienenie_deakt);
      }

      Code used in CONTROL UNIT:

      Code:
      #include <KnxTelegram.h> //KNX
      #include <KnxTpUart.h> //KNX
      
      #include <Servo.h>
      
      volatile int stav_tc = 0; //KNX
      volatile int stav_osv = 0; //KNX
      volatile bool tienenie_akt = false; //KNX
      volatile bool tienenie_deakt = false; //KNX
      
      const byte interruptPin = 2;
      const int rele_k = 4;
      const int rele_ch = 5;
      const int tpuart_reset = 13; //KNX
      
      Servo tienenie;
      
      KnxTpUart knx(&Serial, "1.1.11"); //KNX
      
      void setup(){
      
      tienenie.attach(6);
      tienenie.write(90);
      
      pinMode(rele_k, OUTPUT);
      pinMode(rele_ch, OUTPUT);
      pinMode(2, INPUT_PULLUP);
      pinMode(3, OUTPUT);
      pinMode(tpuart_reset, OUTPUT); //KNX
      
      digitalWrite(13, HIGH); //KNX
      delay(1000);
      digitalWrite(13, LOW); //KNX
      delay(1000);
      digitalWrite(13, HIGH); //KNX
      delay(1000);
      
      Serial.begin(19200, SERIAL_8E1); //KNX
      knx.uartReset(); //KNX
      delay(1000);
      
      attachInterrupt(digitalPinToInterrupt(interruptPin ), detect_zero, RISING );
      
      TCCR2A = _BV(COM2B0) | _BV(COM2B1) | _BV(WGM20) | _BV(WGM21);
      TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
      
      OCR2B = 255;
      TCNT2 = 120;
      
      knx.addListenGroupAddress("1/1/1"); //KNX
      knx.addListenGroupAddress("1/1/2"); //KNX
      knx.addListenGroupAddress("1/1/3"); //KNX
      knx.addListenGroupAddress("1/1/4"); //KNX
      delay(1000);
      }
      
      void loop(){
      if (tienenie_akt == false && tienenie_deakt == false){
      tienenie.write(90);
      }
      
      if (tienenie_akt == false && tienenie_deakt == true){
      tienenie.write(106);
      }
      
      if (tienenie_akt == true && tienenie_deakt == false){
      tienenie.write(80);
      }
      
      if (tienenie_akt == true && tienenie_deakt == true){
      tienenie.write(90);
      }
      
      if (stav_tc == 0){
      digitalWrite(rele_k, LOW);
      digitalWrite(rele_ch, LOW);
      }
      
      if (stav_tc == 1){
      digitalWrite(rele_ch, LOW);
      digitalWrite(rele_k, HIGH);
      }
      
      if (stav_tc == 2){
      digitalWrite(rele_k, LOW);
      digitalWrite(rele_ch, HIGH);
      }
      
      if (stav_osv == 0){
      OCR2B = 250;
      }
      
      if (stav_osv == 1){
      OCR2B = 240;
      }
      
      if (stav_osv == 2){
      OCR2B = 220;
      }
      
      if (stav_osv == 3){
      OCR2B = 180;
      }
      }
      
      void detect_zero(){
      TCNT2 = 120;
      }
      
      
      void serialEvent(){ //KNX
      KnxTpUartSerialEventType eType = knx.serialEvent();
      if (eType != KNX_TELEGRAM) return;
      
      KnxTelegram* telegram = knx.getReceivedTelegram();
      
      String target =
      String(0 + telegram->getTargetMainGroup()) + "/" +
      String(0 + telegram->getTargetMiddleGroup()) + "/" +
      String(0 + telegram->getTargetSubGroup());
      
      if (telegram->getCommand() == KNX_COMMAND_WRITE){
      if (target == "1/1/1"){
      stav_tc = telegram->get1ByteIntValue();
      } else if (target == "1/1/2"){
      stav_osv = telegram->get1ByteIntValue();
      } else if (target == "1/1/3"){
      tienenie_akt = telegram->getBool();
      } else if (target == "1/1/4"){
      tienenie_deakt = telegram->getBool();
      }
      }
      }
      You do not have permission to view this gallery.
      This gallery has 4 photos.
      Zuletzt geändert von mariobachorik; 17.03.2020, 21:33.

      Kommentar


        Hi Mario,
        for troubleshooting it's best to get a real KNX hardware and see what's happening on KNX. I recommend a USB interface and the ETS Demo. Maybe your School/University owns some hardware you can borrow.

        With the confirmed working hardware you can analyze if the sender or the receiver is causing trouble and then troubleshoot further. Otherwise it's just guessing. Since your RX Led is blinking, there is physical activity on the bus, but you don't know if the transmitter is sending correct KNX data or just rubbish.

        Kommentar


          Thank you for your advice!

          I'll try to get the USB / KNX interface you mentioned and then I hope to find the problem soon.

          Kommentar


            Und hier die Auflösung:
            Arduino Nano Nachbau geht nicht !!!


            Arduino Uno und Busankoppler 5WG1117-2AB12 geht

            Ich danke Euch !!
            Zuletzt geändert von boots; 22.03.2020, 17:50.

            Kommentar


              Hallo,

              wie finde ich den den letzten bzw. aktuellen Stand der KNX library?
              Ist das hier https://bitbucket.org/thorstengehrig...m/src/default/ der aktuelle Stand?

              Danke Euch.

              Kommentar


                Hallo,

                kann man die Funktionsfähigkeit des TP-UART an der Siemens BCU testen?

                Hintergrund: Ich bekomme keine Nachrichten mit der Siemens BCU auf den Bus, mit der Micro BCU bei gleichem Setup schon. Ich habe den Verdacht, dass ich die Siemens BCU geschrottet habe.

                Danke Euch.

                Kommentar


                  Zitat von Sisamiwe Beitrag anzeigen
                  Hallo,

                  kann man die Funktionsfähigkeit des TP-UART an der Siemens BCU testen?

                  Hintergrund: Ich bekomme keine Nachrichten mit der Siemens BCU auf den Bus, mit der Micro BCU bei gleichem Setup schon. Ich habe den Verdacht, dass ich die Siemens BCU geschrottet habe.

                  Danke Euch.
                  Tja, es sieht wirklich so aus, als ob deine Siemens BCU defekt ist :/
                  Du kann als Prüfung Spannungen testen.
                  Ach ja, mit welchen Arduinos testes du? Weil Siemens BCU ja 5V Logik hat und MicroBCU 3.3V. D.h. einfach so kann man nicht hin und her tauschen.

                  Ansonsten kann man auch damit schauen ob etwas kommt:
                  https://github.com/Adminius/KNX_sniffer

                  Kommentar


                    Zitat von boots Beitrag anzeigen
                    Und hier die Auflösung:
                    Arduino Nano Nachbau geht nicht !!!


                    Arduino Uno und Busankoppler 5WG1117-2AB12 geht

                    Ich danke Euch !!
                    Bei den China Arduinos mit 328p MCU gibt es immer weider Problem, wenn CH340G als USB-to-UART verwendet wird. Bei allen China-Clones Nanos ist das der Fall. Bei vielen UNOs aber auch. Weil CH340G und BCU an den selben Pins hängen, stören sie sich gegenseitig. Workaround: es gibt 2x 1k Widerstände die von CH340 zu D0 und D1 führen, wenn man die weglötet, funktioniert BCU wieder, aber so kann man über USB nicht mehr programmieren (dann nur über ISP oder mit externem USB-to-UART Adapter) :/

                    Kommentar


                      Hallo Eugenius,
                      danke für Deine Rückmeldung.

                      Zitat von Eugenius Beitrag anzeigen
                      Du kann als Prüfung Spannungen testen.
                      Die 5V aus der BCU ist noch verfügbar. Der Arduino startet bei angeschlossener BCU und läuft auch.
                      Kann man RC und TX aus der BCU auch prüfen?
                      Kann man die BCU auch resetten? Es gibt zumindest einen Reset-Ausgang an der BCU?

                      Zitat von Eugenius Beitrag anzeigen
                      Ach ja, mit welchen Arduinos testes du? Weil Siemens BCU ja 5V Logik hat und MicroBCU 3.3V. D.h. einfach so kann man nicht hin und her tauschen.
                      Ich arbeite mit einem Arduino ProMini 8MHz, 3.3V. Wenn ich auf mit der MicroBCU arbeite, verbinde ich VCC der MicroBCU mit VCC des Arduino. Bei Verwendung der Siemens BCU verbinde ich den 5V der BCU mit RAW des Arduino.


                      Kommentar


                        Ok, ProMini kann auch mit 5V direkt arbeiten.
                        verbinde VCC mit 5V der BCU und schaue ob es geht.
                        Es kann sein, dass deine BCU 3.3V Logic Level von MCU nicht verarbwiten kann.
                        Umgekehrt, es ist ganz schlecht mit 5V LogicLevel aus der BCU an 3.3V MCU geben (RAW wandelt ja in 3.3V um)
                        Da kann man MCU grillen.

                        Kommentar


                          Ich versuche ohne Erfolg, das simple Beispiel von raphaelhuber aus #1171 mit einem NodeMCU V3 umzusetzen:

                          Code:
                          // Test constellation = NodeMCU V3 <-> 5WG1 117-2AB12
                          
                          // GND    GND (PIN 1)
                          // 5V        VCC (PIN 5)
                          // RX 03  TX (PIN 4)
                          // TX 01   RX (PIN 2)
                          
                          #include <KnxTpUart.h>
                          
                          KnxTpUart knx(&Serial, "1.1.80");          // KNX-Gruppenadresse 1.1.80 mit Dummy-Applikation
                          
                          void setup() {
                          pinMode(16, OUTPUT);                        // LED PIN 16 (statt Nano 13)
                          digitalWrite(16, LOW);
                          
                          Serial.begin(19200, SERIAL_8E1);
                          knx.uartReset();
                          }
                          
                          void loop() {
                          knx.groupWriteBool("6/7/4", true);
                          digitalWrite(16, HIGH);
                          delay (1000);
                          
                          knx.groupWriteBool("6/7/4", false);
                          digitalWrite(16, LOW);
                          delay (1000);
                          }
                          Leider kann ich das Sketch schon einmal gar nicht kompilieren und bekomme folgenden Fehler:

                          C:\Users\Andreas\Documents\Arduino\libraries\KnxTp Uart\KnxTelegram.cpp: In member function 'void KnxTelegram::set2ByteFloatValue(float)':
                          C:\Users\Andreas\Documents\Arduino\libraries\KnxTp Uart\KnxTelegram.cpp:294:23: error: invalid operands of types 'double' and 'int' to binary 'operator&'long m = round(v) & 0x7FF;
                          exit status 1
                          Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module).


                          Kennt wer diesen Fehler ?
                          Ist die serielle Schnittstelle (PIN 1+3) korrekt angegeben ?
                          Macht es überhaupt Sinn, auf einem NopdeMCU mit CH340 weiterzutesten (vgl #1194) ?

                          Vielen Dank
                          Andreas
                          Zuletzt geändert von ak68; 11.04.2020, 10:01.

                          Kommentar


                            Nein, macht keinen Sinn. Hatte den selben Fehler.
                            Lösung kauft dir einen Arduino Uno. Weiter oben steht mit welchen Boards das funktioniert.
                            Wenn ich es richtig weiß, sind die 2 Pull-up Widerstände schuld daran.
                            VG Bernhard

                            Kommentar


                              Übrigens, beim ESP8266 kann man Serialpins durch Serial.swap() ummappen. Dann soll CH340 nicht stören.
                              ABER VORSICHT, ESP verträgt nur 3.3V, Siemens BCU hat aber 5V am TX Pin. Ohne Pegelwandler kann man ESP also zerstören!

                              Zum eigentlichen Problem kann ich leider nichts beitragen.

                              Kommentar


                                Zitat von boots Beitrag anzeigen
                                Nein, macht keinen Sinn. Hatte den selben Fehler.
                                Lösung kauft dir einen Arduino Uno. Weiter oben steht mit welchen Boards das funktioniert.
                                Wenn ich es richtig weiß, sind die 2 Pull-up Widerstände schuld daran.
                                VG Bernhard
                                Du hast Recht, habe den NodeMCU ausgemustert, hat zu viele Probleme gemacht, nicht nur mit der KNX-Library.

                                Mit einem ProMini läuft die Software korrekt !!!

                                Ein Problem habe ich aber:

                                Die Datentypen von Uv... stimmen wohl nicht überein Float = 2ByteFloat =2-ByteGleitkomma (DPT 9.x),
                                der Bool-Wert 6/7/7) wird hingegen korrekt übertragen.




                                In KNX/ Ediomi weder aber keine Werte angezeigt, obwohl diese im Seriellen Monitor sichtbar sind (bei daktivierter KNX-Tp.UART):

                                2020_04_18_16_30_24_Window.png

                                Was mache ich falsch bei den Datentypen ?
                                Zuletzt geändert von ak68; 18.04.2020, 15:37.

                                Kommentar

                                Lädt...
                                X