Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Ich verwechsle immer den ARDUINO (PRO) MICRO mit dem ARDUINO NANO.

    Der ARDUINO (PRO) MICRO hat den Mikroprozessor ATmega 32U4, das heißt einmal USB-Schnittstelle und einmal UART-Schnittstelle.
    Der ARDUINO NANO hat einen ATmega 328P, dieser hat nur eine UART-Schnittstelle.

    Danke. Eugenius. Ich sollte mir das irgendwann mal notieren.

    Kommentar


      Mh, ich habe das Problem auch mit einem Mega 2560...
      Kann das noch an was anderem liegen? Zur Zeit verwende ich das ganze nur in meiner Testumgebung. Raspberr Pi mit BCU & KNXd als IP Gateway und sende die Telegramme per ETS Gruppenmonitor an den Arduino Mega mit BCU und Seriellemmonitor in der Aurduino IDE. Zwischen BCU und Arduino habe ich nur RX,TX & GND verbunden. Der Raspberry ist per ADUM1201 galv. getrennt.

      In den angehängten Beispielen habe ich per ETS drei Telegramme auf die GA 15/0/0 gesendet (ReceiveKNXTelegrams_ETS Gruppenmonitor.txt).
      Im Log des Arduino wird das letzte Telegramm 4 mal ausgegeben (ReceiveKNXTelegrams_SerialMonitor.txt) ...
      Angehängte Dateien

      Kommentar


        Hallo jaykay,


        ich habe die Empfangsroutine in der Library umgestellt.
        Lade dir doch gerade die neueste Version runter und probiere dies bei dir.

        https://bitbucket.org/thorstengehrig...forum/overview

        Bitte um Rückmeldung, danke im Voraus.
        Zuletzt geändert von Mag Gyver; 14.05.2017, 15:42.

        Kommentar


          Hallo Mag Gyver,

          sieht gut aus. Habe den Beispiel Sketch mit einem Pro Micro & einem Mega 2560 getestet und habe keine doppelten Ausgaben mehr bekommen.
          Vielen Dank für deine Änderung!

          Kommentar


            Ja, dann auch noch viel Spaß damit.

            Habe noch ein paar zusätzliche Änderungen vorgenommen, die bestimmte Mindestwerte an interne Funktionen übergeben, falls der ein oder andere Nutzer die Werten in "KnxTpUart.h" zu klein einstellen sollte.

            Etwas mehr Sicherheit, damit solche unangenehmen Aussetzer nicht zur Regel werden.

            Kommentar


              Vielen Dank und Respekt vor all der Arbeit/Freizeit, die in diesem Projekt steckt.

              Ich habe mal die 63 Seiten durchgeackert. Die erste Hälfte war sehr spannend und auch nachvollziehbar. In der zweiten Hälfte, bin ich, je akademischer die Diskussion wurde, nicht mehr durchgestiegen. Praktische Umsetzungen sind leider immer weniger geworden.
              Wenn ich es richtig verstanden habe, gibt es inzwischen 3 Libs. Allerdings bin ich inzwischen so verwirrt, dass ich jetzt nicht mehr weiss, welche der 3 für mich am Besten geeignet ist. Oder ist das egal ?
              Ich bräuchte Floats aufm Bus für 2 Vorhaben:
              - 1 Pro micro für die Ultraschallmessung der Entfernung des Autos meiner Frau zur Wand, mit Ansteuerung einer Meldeleuchte per KNX und Lichtschranken im Torbereich.
              - 1 Pro micro mit BME280. Ich will den Luftdruck auf meiner Edomi-Visu haben, für lokalen Wettertrend.
              Die Setups sollen ohne Hilfsspannung laufen. Das soll der Buskoppler machen.

              Die Hardware ist unterwegs, sodaß ich bald loslegen kann.
              >>Smelly One<<
              >> BURLI <<
              Grüße Armin

              Kommentar


                Hallo WagoKlemme,

                gepflegt werden derzeit von ThorstenGehrig und mir zusammen die Library von ThorstenGehrig. Dann gab es dazu noch die Anfänge von tuxedo, bevor dieser KONNEKTING ins Leben gerufen hat. KONNEKTING basiert aber auf einer anderen Library, als die von ThorstenGehrig. Die Version von tuxedo habe ich angepasst und weiterentwickelt und wird etwas zeitversetzt zur Library von ThorstenGehrig aktualisiert.


                Librarys:
                • ThorstenGehrig Version (DKA-Derivat)
                • KONNEKTING (FM-Derivat)
                • Optimierte Version (DKA-Derivat)

                Konfus? Hoffe nicht. Aber alle drei Librarys bekommen deine Wünsche in den Griff. Nimm dir für die Einarbeitung etwas Zeit und "Probieren geht über studieren!". Beispielsketche sind überall hinterlegt, die warten nur darauf von dir ausprobiert zu werden.

                Das mit dem Setup ohne Hilfsspannung funktioniert nur dann, wenn du die Grenzen der Stromaufnahme deines Setups (Hardware) mit der jeweiligen EIB/KNX-Anschaltung (Busankoppler) vergleichst. Bedenke hierzu, dass der Busankoppler auch den Arduino und deine Sensoren mit Strom versorgen muss + etwas Puffer.

                Sollte es nicht ohne Hilfsspannung gehen, dann galvanische Trennung zwischen Busankoppler und dem Rest herstellen.
                Zuletzt geändert von Mag Gyver; 18.05.2017, 17:36.

                Kommentar


                  Ich habe gerade gestern einen Satz Platinen bekommen, da kannst Du direkt einen BME280 draufstecken und das Ganze an den bekannten Siemens Busankoppler stecken. Ich verwende allerdings den Pro Mini. Kleines TFT kann man auch mit unterbringen, wenn auch eine lokale Anzeige gewünscht ist. Alles nur über den Bus versorgt, also wirklich easy. Ist auch alles so vorbereitet, dass es in eine Standard 55er Blindabdeckung passt.

                  Dauert aber noch ein paar Tage bis ich das vorstelle...ich gehe jetzt erstmal in Urlaub und danch muss ich erstmal bestücken und sehen ob alles funzt :-)
                  Zuletzt geändert von dreamy1; 16.05.2017, 20:16.
                  Viele Grüße,
                  Stefan

                  DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                  Kommentar


                    Mag Gyver
                    Danke für die klärenden Worte.
                    Als Lib hatte ich schon die ThorstenGehrig/Mag Gyver Version ins Auge gefasst und damit entschieden. Und bzgl. Stromaufnahme, ich werde darauf achten.
                    Ich freue mich schon und arbeite mich gerne ein.

                    dreamy1
                    Welche Platine meinst Du ? Nein, hat Zeit. Ich wünsche dir einen schönen Urlaub.
                    Einen Pro Mini zu kaufen ist ja kein Problem.

                    Vielen Dank an Euch, dass ihr das Projekt weiter leben lässt. Ich finde das richtig super und das Projekt auch. Wenn meine Sachen laufen stelle ich sie hier vor, versprochen.
                    >>Smelly One<<
                    >> BURLI <<
                    Grüße Armin

                    Kommentar


                      Zur Info,

                      beide Versionen liegen überarbeitet auf "bitbucket" vor.

                      Änderungen:
                      • Leseroutine angepasst, aufgrund mehrfacher Telegramme
                      • "Timeout" Leseroutine mit Min/Max-Wertebereich (10 bis 1000 Millisekunden)
                      • "Writedelay" Wartezeit zwischen dem Senden aufeinanderfolgender Telegramme zum Bus Min-Wert (100 Millisekunden), nach oben nur durch "unsigned long" begrenzt
                      • Ersetzen der Funktion "delay()"
                      • Beispiel GroupWrite angepasst, Anzeigefehler auf dem "Serieller Monitor"

                      Bei Fehlverhalten bitte melden. Danke im voraus. Dann leg ich nochmal nach.
                      Zuletzt geändert von Mag Gyver; 19.05.2017, 06:39.

                      Kommentar


                        Hallo an die Profis,

                        ich bin ziemlicher Anfänger was Arduion angeht,

                        hab mich durch die ganzen Seite gelesen und finde das Projekt ziemlich genial.
                        Jetz hab ich den versucht einen kleinen Aufbau zu machen.

                        Es soll durch einen Taster einfach nur eine Gruppenadresse mit einem Wert gesendet werden.
                        Das funktioniert auch aber nur beim ersten drücken. Danach geht nix mehr.
                        Durch Reset des Arduion kann ich wieder einmal den Wert senden usw.

                        Board ist Arduino UNO.

                        Vieleicht kann mal jemand drüberschauen.

                        Grüsse Stefan

                        Code:
                        #include <KnxTpUart.h>
                        
                        KnxTpUart knx(&Serial, "15.15.20");   // Initialize the KNX TP-UART library on the Serial port
                        
                        const int buttonPin1 = 12;     // the number of the pushbutton pin
                        const int ledPin1 = 13;      // the number of the LED pin
                        
                        int WertKNX = 6;       //KNX Wert der gesendet wird
                        
                        
                        int buttonState1 = 0;         // variable for reading the pushbutton status
                        
                        
                        void setup() {
                        
                          pinMode(ledPin1, OUTPUT);        // initialize the LED pin as an output:
                          //digitalWrite(ledPin1, LOW);    
                        
                          pinMode(buttonPin1, INPUT);      // initialize the pushbutton pin as an input:
                          //digitalWrite(buttonPin1, HIGH);  // Turn on pullup
                        
                        
                          Serial.begin(19200, SERIAL_8E1);
                          knx.uartReset();
                        }
                        
                        void loop() {
                        
                          buttonState1 = digitalRead(buttonPin1);   // read the state of the pushbutton value:
                        
                          // check if the pushbutton is pressed.
                          // if it is, the buttonState is HIGH:
                          if (buttonState1 == HIGH) {
                            // turn LED on:
                            digitalWrite(ledPin1, HIGH);
                        
                          if (buttonState1 == HIGH) {
                        
                            knx.groupWrite2ByteInt("0/0/100", WertKNX);
                            WertKNX = WertKNX*100;
                            //WertKNX = !WertKNX;
                          }
                          else {
                            // turn LED off:
                            digitalWrite(ledPin1, LOW);
                          }
                        }
                        }

                        Kommentar


                          Hallo xRay06,

                          herzlich willkommen.

                          Es liegt nicht an der Hardware und auch nicht an deinem Sketch, so viel steht fest.
                          Sehr komisch, zugegeben habe die Library mit dem Beispielsketch "GroupWrite" zum letzten Mal im Januar 2017 getestet.
                          Muss dies nachstellen ...

                          ... ich kann dich beruhigen, du hast keinen Fehler gemacht, denn gleiches Verhalten bei mir.

                          Aha! Auslöser des Fehlverhalten gefunden. Library auf Ausgabestand Januar 2017 gebracht.

                          Nur zur Information:

                          Bitte im Moment keinerlei Änderungen in der Library an

                          Code:
                          #define SERIAL_WRITE_DELAY_MS 100
                          oder

                          Code:
                          #define SERIAL_READ_TIMEOUT_MS 0
                          durchführen!


                          https://bitbucket.org/thorstengehrig...forum/overview

                          Die Library Version (10.01.2017) wurde von mir am 24.05.2017 mit den Beispielsketchen " GroupRead" und "GroupWrite" und "ReceiveKNXTelegrams" und "ReplyToKNXRead" erfolgreich getestet.


                          Der Rücksprung auf diese Version (10.01.2017) der Library hat noch den "Fehler" Mehrfachausgabe von Telegrammen im "Serieller Monitor", obwohl nur ein einziges Telegramm empfangen wurde.


                          Nun viel Spaß dabei.
                          Zuletzt geändert von Mag Gyver; 24.05.2017, 20:05.

                          Kommentar


                            Hmm, müsste der Button nicht auf LOW abgefragt werden? Hängt per Pull-Up doch permanent auf HIGH...
                            Viele Grüße,
                            Stefan

                            DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                            Kommentar


                              Wie versprochen mein erstes kleines Projekt mit Arduino überhaupt - ist fertig.
                              Es geht um einen Pro Micro 5V mit BME280 (Boschsensor: Luftdruck, Feuchte, Temperatur).
                              Das Setup:​
                              IMG_0278.JPG


                              Der Code:
                              Code:
                              /***************************************************************************
                               I2C device class (I2Cdev) demonstration Arduino sketch for IAQ2000 class
                               2012-04-01 by Peteris Skorovs &lt;pskorovs@gmail.com&gt;
                               Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
                               I2C Device Library hosted at http://www.i2cdevlib.com
                                This is a library for the BME280 humidity, temperature &amp; pressure sensor
                                Designed specifically to work with the Adafruit BME280 Breakout
                                ----&gt; http://www.adafruit.com/products/2650
                                These sensors use I2C or SPI to communicate, 2 or 4 pins are required
                                to interface. The device's I2C address is either 0x76 or 0x77.
                                Adafruit invests time and resources providing this open source code,
                                please support Adafruit andopen-source hardware by purchasing products
                                from Adafruit!
                                Written by Limor Fried &amp; Kevin Townsend for Adafruit Industries.
                                BSD license, all text above must be included in any redistribution
                               ***************************************************************************/
                              #include &lt;Wire.h&gt;
                              #include &lt;I2Cdev.h&gt;
                              #include &lt;Adafruit_Sensor.h&gt;
                              #include &lt;Adafruit_BME280.h&gt;
                              
                              
                              //KNX
                              #include &lt;KnxTpUart.h&gt;
                              #define KNX_PHYSICAL_ADRESS                 "15.15.20"
                              #define KNX_WRITE_GROUPADRESS_PRESSURE      "4/0/200"
                              #define KNX_WRITE_GROUPADRESS_HUMIDITY      "4/0/201"
                              #define KNX_WRITE_GROUPADRESS_TEMP          "4/0/202"
                              #define KNX_MEASSURE_INTERVAL_MS            30000    // Messintervall alle 30 sekunden
                              #define KNX_SEND_INTERVAL_MS_AIRPRESSURE    3600000  // senden des Luftdrucks mindestens alle 60 minuten
                              #define KNX_SEND_INTERVAL_MS_HUMIDITY       3600000  // senden der rel. Feuchte mindestens alle 60 minuten
                              #define KNX_SEND_INTERVAL_MS_TEMP           3600000  // senden der Temperatur mindestens alle 60 minuten
                              #define watchdog_time                       3600000  // Watchdog = 1 Stunde
                              
                              #define SEALEVELPRESSURE_HPA (1021)
                              //Initialize KNX
                              KnxTpUart knx(&amp;Serial1, KNX_PHYSICAL_ADRESS);
                              
                              Adafruit_BME280 bme; // I2C
                              
                              float airpressure = 0;
                              float humidity = 0;
                              float temp = 0;
                              float oldhumidity = 0;
                              float oldtemp = 0;
                              float oldairpressure = 0;
                              
                              unsigned long delayTime;
                              unsigned long startTime;
                              unsigned long watchdog;
                              unsigned long sendTimePressure;
                              unsigned long sendTimeHumidity;
                              unsigned long sendTimeTemp;
                              
                              
                              bool result;
                              
                              void setup() {
                                // join I2C bus (I2Cdev library doesn't do this automatically)
                                Wire.begin();
                              
                                // initialize serial communication
                                Serial.begin(9600);
                                delay(1000);
                                Serial.println("Initializing Serial...");
                                delay(1000);
                              
                                //initialize connection to KNX BCU
                                Serial1.begin(19200);
                                while (!Serial1) {
                                  ; // wait for serial port to connect
                                }
                                UCSR1C = UCSR1C | B00100000;
                              
                                Serial.print("UCSR1C: ");
                                Serial.println(UCSR1C, BIN);
                              
                                // Reset UART
                                knx.uartReset();
                              
                                bool status;
                              
                                // default settings for BME280
                                status = bme.begin();
                                if (!status) {
                                    Serial.println("Could not find a valid BME280 sensor, check wiring!");
                                    while (1);
                                }
                              
                                Serial.println("-- Default Test --");
                                Serial.println();
                              
                                delay(100); // let sensor boot up
                              
                                startTime = millis();
                                watchdog = millis();
                              
                                // initialize device
                                Serial.println("Initializing I2C devices...");
                              
                                // Lese-Addressen registrieren
                                knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_PRESSURE);
                                knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_HUMIDITY);
                                knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_TEMP);
                              }
                              
                              
                              void loop() {
                              
                                // Wenn unterhalb des messintervalls: nichts tun
                                if (millis() - startTime &lt; KNX_MEASSURE_INTERVAL_MS) {
                                  delay(1);
                                  return;
                                }
                                startTime = millis();
                              
                                // Wenn überhalb des sendeintrvalls
                                if (millis() - sendTimePressure &gt; KNX_SEND_INTERVAL_MS_AIRPRESSURE) {
                                  oldairpressure = 950; // undefinierter wert - damit beim nächsten befehl gesendet wird
                                }
                              
                                // Wenn überhalb des sendeintrvalls
                                if (millis() - sendTimeHumidity &gt; KNX_SEND_INTERVAL_MS_HUMIDITY) {
                                  oldhumidity = 30; // undefinierter wert - damit beim nächsten befehl gesendet wird
                                }
                              
                                // Wenn überhalb des sendeintrvalls
                                if (millis() - sendTimeTemp &gt; KNX_SEND_INTERVAL_MS_TEMP) {
                                  oldtemp = 10; // undefinierter wert - damit beim nächsten befehl gesendet wird
                                }
                              
                                // Wenn über Watchdog-time: Fehler auf BUS senden, reboot
                                if (millis() - watchdog &gt; watchdog_time) {
                                  result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_PRESSURE, 127);
                                  delay(1000);
                                  asm volatile ("  jmp 0");
                                  return;
                                }
                              
                                // read sensor airpressure
                                airpressure = (bme.readPressure()/100.0F)+50;
                                if (airpressure &gt;= (oldairpressure + 0.1) || airpressure &lt;= (oldairpressure - 0.1)) {
                                  oldairpressure = airpressure;
                                  result = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_PRESSURE, airpressure);
                                  sendTimePressure = millis();     // define last pressure send time
                                  watchdog = millis();            // set Watchdog
                                  Serial.print("Luftdruck = ");
                                  Serial.print(airpressure);
                                  Serial.println(" hPa");
                                }
                                delay(100);
                              
                                // read seansor humidity
                                humidity = bme.readHumidity()+3;
                                if (humidity &gt;= (oldhumidity + 1) || humidity &lt;= (oldhumidity - 1)) {
                                  oldhumidity = humidity;
                                  result = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_HUMIDITY, humidity);
                                  sendTimeHumidity = millis();       // define last humidity send time
                                  watchdog = millis();          // set Watchdog
                                  Serial.print("Feuchte   = ");
                                  Serial.print(humidity);
                                  Serial.println(" %");
                                }
                                delay(100);
                              
                                // read seansor temperatur
                                temp = bme.readTemperature()-2;
                                if (temp &gt;= (oldtemp + 0.2) || temp &lt;= (oldtemp - 0.2)) {
                                  oldtemp = temp;
                                  result = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_TEMP, temp);
                                  sendTimeTemp = millis();         // define last temp send time
                                  watchdog = millis();            // set Watchdog
                                  Serial.print("Temperatur= ");
                                  Serial.print(temp);
                                  Serial.println(" *C");
                                }
                                delay(100);
                              }
                              
                              void reboot() {
                              
                              }
                              
                              void serialEvent() {
                                //Get Serial Event
                                KnxTpUartSerialEventType eType = knx.serialEvent();
                              
                                //Check Serial Event
                                  Serial.print("check");
                              
                                if (eType == KNX_TELEGRAM) {
                                  KnxTelegram* telegram = knx.getReceivedTelegram();
                              
                                  // Telegrammauswertung auf KNX (bei Empfang immer notwendig)
                                  String target =
                                  String(0 + telegram-&gt;getTargetMainGroup())   + "/" +
                                  String(0 + telegram-&gt;getTargetMiddleGroup()) + "/" +
                                  String(0 + telegram-&gt;getTargetSubGroup());
                                  result = knx.groupWrite14ByteText("4/0/203", target );  // Nur test damit ich sehe das die Auswertung läuft!
                              
                                  // Auswertung der Gruppenadresse des empfangenen Telegrammes und Zwischenspeicherung in Variable target
                                  if (telegram-&gt;getCommand() == KNX_COMMAND_READ) {
                                    if (target == KNX_WRITE_GROUPADRESS_PRESSURE) {
                                      airpressure = (bme.readPressure()/100.0F)+50;
                                      result = knx.groupAnswer2ByteFloat(KNX_WRITE_GROUPADRESS_PRESSURE, airpressure);
                                      oldairpressure = airpressure;
                                      sendTimePressure = millis();  // define last pressure send time
                                      watchdog = millis();        // set Watchdog
                                    }
                                    if (target == KNX_WRITE_GROUPADRESS_HUMIDITY) {
                                      humidity = bme.readHumidity()+3;
                                      result = knx.groupAnswer2ByteFloat(KNX_WRITE_GROUPADRESS_HUMIDITY, humidity);
                                      oldhumidity = humidity;
                                      sendTimeHumidity = millis();     // define last humidity send time
                                      watchdog = millis();        // set Watchdog
                                    }
                                     if (target == KNX_WRITE_GROUPADRESS_TEMP) {
                                      temp = bme.readTemperature()-2;
                                      result = knx.groupAnswer2ByteFloat(KNX_WRITE_GROUPADRESS_TEMP, temp);
                                      oldtemp = temp;
                                      sendTimeTemp = millis();     // define last Temp send time
                                      watchdog = millis();        // set Watchdog
                                    }
                              
                                  }
                                }
                              }
                              Das Ergebnis:
                              2017-05-26 15_29_29-ETS5™ - Test Jung.png



                              Ich bin schwer begeistert. Vielen Dank für das Projekt und höchsten Respekt !
                              Zuletzt geändert von WagoKlemme; 26.05.2017, 15:11.
                              >>Smelly One<<
                              >> BURLI <<
                              Grüße Armin

                              Kommentar


                                Sorry, Link geht iwie im Edit nicht für den Sensor BME280. Klick
                                Zuletzt geändert von WagoKlemme; 26.05.2017, 15:12.
                                >>Smelly One<<
                                >> BURLI <<
                                Grüße Armin

                                Kommentar

                                Lädt...
                                X