Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

  • dreamy1
    antwortet
    Zitat von ThorstenGehrig Beitrag anzeigen
    @Dreamy: worauf beziehst du das "pulsed"? Auf den iAQ oder BME?
    Auf den iAQ, den gibts als "C"- und als "P"-Variante. Erste benötigt 66mW, der gepulste nur 9mW...allerdings liefert der auch nur alle 11s einen neuen Messwert. Dürfte aber für die meisten Anwendungen locker ausreichen.

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Hallo,

    ich habe - nach langer langer zeit - mal wieder in diesen Thread geschaut.
    Erstmal VIELEN VIELEN Dank für Mac Gyver für das Pflegen der Lib - da wurde echt viel Arbeit geleistet.
    Genauso stelle ich mir "community" vor...

    Ich muss mal meine bestehenden Projekte auf die neue Lib aktualisieren (die Projekte sind bei mir schon alle größer 1 jähr in Betrieb...)

    @Dreamy: worauf beziehst du das "pulsed"? Auf den iAQ oder BME?

    @Tuxedo: dein Konnekting Projekt ist super - und ich bin ganz froh das ich hier einige "politische" Diskussionen verpasst habe.
    Was echt herausragend ist - sind die Hardwareleistungen - die ja (meines Wissens nach) für alle Libraries einsetzbar sind.
    Die Suite ist sicherlich auch eine Leistung - die ich aber selbst noch nicht begutachtet habe (Zeitmangel).

    Mein träum währe eine industrielle Kleinserien-produktion fertiger Platinen (zu guten Preisen) und fertige "Bastelsätze" (mit Platinen und Sensoren).
    Vermutlich ist das aber nicht so einfach Umsetzbar und nur ein Traum... nevertheless: wir haben - alle zusammen - schon superviel Erreicht. Vieles währe vor 5 Jahren noch undenkbar gewesen :-)

    Gruß
    ​​​​​​​Thorsten

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Nach Murphy natürlich nein - C.
    Ultraschall: Ich will ein Kästchen an die Wand machen und die Entfernung Auto -> Wand messen und dann eine Meldeleuchte schalten.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Hallo Armin,

    hmm...Utraschallsensor? Habe ich was verpasst? :-)

    Platz für den iAQ habe ich übrigens auch gelassen...ich hoffen, Du hast den "pulsed" genommen, der andere wird leider etwas warm und verfälscht dann die Temperaturmessung (leidvolle eigene Erfahrung) in näherer Umgebung.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Räusper - der Code ist von Thorsten, nur von mir umgestrickt auf BME280. Daumen hoch für ThorstenGehrig und an dich als Elektronikprofi
    Achja, der BME muss erst mal "kalibriert" (siehe Messwertkorrektur im Code) werden. Heisst, Feuchte und Temperatur sind anfänglich daneben. Den Luftdruck habe ich von weatherunderground für unsere Gegend und dann ins Beispiel eingetragen. Dann auf Altitude geachtet, ob das ungefähr hinkommt - bei mir hats gepasst. Am Besten Du nimmst erstmal das Beispiel in der Arduino IDE von Adafruit für den BME und bringst die Sensoren auf Linie. Ab dann arbeiten die Sensoren einwandfrei.

    Bin schon sehr gespannt auf deine Platine, wie das aussieht - bestimmt super. Bei mir kommt der Sensor in den Keller, da ist es nicht tragisch. Aufputzdose - fertig.

    Der Ultraschallsensor funktioniert auch ootb und das erstaunlich genau aufn Zentimeter. Mit einem Pro Micro nur 3 Bauteile incl. Siemens. Leider habe ich im Moment nur einen Siemens-Buskoppler.
    Dann sind gestern noch 2 iAQs gekommen. Dazu fehlen mir noch ein paar Teilchen.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Geil...vielen Dank fürs Teilen!!! Dein Code hilft mir immens, da ich leider nicht gerade fit in Software bin...ich habe lieber nen Lötkolben in der Hand :-)

    Bin gerade ausm Urlaub zurückgekommen...nächste Woche mache ich die Testplatine fertig. Habe allerdings ein etwas kleineres BME-Modul genommen.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Sorry, Link geht iwie im Edit nicht für den Sensor BME280. Klick
    Zuletzt geändert von WagoKlemme; 26.05.2017, 15:12.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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 <pskorovs@gmail.com>
     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 & pressure sensor
      Designed specifically to work with the Adafruit BME280 Breakout
      ----> 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 & Kevin Townsend for Adafruit Industries.
      BSD license, all text above must be included in any redistribution
     ***************************************************************************/
    #include <Wire.h>
    #include <I2Cdev.h>
    #include <Adafruit_Sensor.h>
    #include <Adafruit_BME280.h>
    
    
    //KNX
    #include <KnxTpUart.h>
    #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(&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 < KNX_MEASSURE_INTERVAL_MS) {
        delay(1);
        return;
      }
      startTime = millis();
    
      // Wenn überhalb des sendeintrvalls
      if (millis() - sendTimePressure > KNX_SEND_INTERVAL_MS_AIRPRESSURE) {
        oldairpressure = 950; // undefinierter wert - damit beim nächsten befehl gesendet wird
      }
    
      // Wenn überhalb des sendeintrvalls
      if (millis() - sendTimeHumidity > KNX_SEND_INTERVAL_MS_HUMIDITY) {
        oldhumidity = 30; // undefinierter wert - damit beim nächsten befehl gesendet wird
      }
    
      // Wenn überhalb des sendeintrvalls
      if (millis() - sendTimeTemp > 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 > 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 >= (oldairpressure + 0.1) || airpressure <= (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 >= (oldhumidity + 1) || humidity <= (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 >= (oldtemp + 0.2) || temp <= (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->getTargetMainGroup())   + "/" +
        String(0 + telegram->getTargetMiddleGroup()) + "/" +
        String(0 + telegram->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->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.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Hmm, müsste der Button nicht auf LOW abgefragt werden? Hängt per Pull-Up doch permanent auf HIGH...

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    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.

    Einen Kommentar schreiben:


  • xRay06
    antwortet
    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);
      }
    }
    }

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    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.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    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.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X