Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Zitat von ThorstenGehrig Beitrag anzeigen
    Hi
    hier mal eine kleine Projektdokumentation zu meinem RFID-Leser-Projekt.
    Der Arduino-Code ist noch der selbe wie früher - mit minimalen änderungen.
    Derzeit sende ich die Seriennummer einfach an den HS zum Auswerten - das erspart umprogrammieren wenn ich einen neuen Transponer habe - und ermöglicht zusätzliche Sicherheits-Logiken (da RFID ja als unsicher anzusehen ist).
    PA und Gruppenadresse muss natürlich im Code noch angepasst werden.

    Gruß
    Thorsten
    Hallo Thorsten,

    welche RFID-Karten/Keys kann man denn mit deiner Anlage nutzen? Gehen diese: http://www.amazon.de/Kamor%C2%AE-NFC.../dp/B00DRDURG4
    Die könnte ich ja dann überall hin kleben bzw. einbauen (Uhr, Handy, Jacke) oder irre ich mich da?

    Und noch eine Frage: Wie tief ist dein Aufbau für die Unterbringung im Siedle-Blinddeckel?

    Danke.

    Ari

    Kommentar


      Zitat von wintermute Beitrag anzeigen
      Hi Max,

      schau mal in dem Example-Ordner nach dem LearnKNXAddress.ino und dort nach der Funktion serialEvent1. Nach kurzem Ueberfliegen wuerde ich vermuten, dass da schon fast alles drinsteckt was du brauchst.
      Wenn das laeuft bau ichs zukuenftig in meine Beispielsketche ein - versprochen

      gruesse
      Done, ohne Garantie. Das Auslesen der Werte und Abspeichern überlasse ich Kundigen
      Code ist nicht getestet und auch nicht debuggt. Viel Spaß damit.

      Gruß,

      Max
      Code:
      void serialEvent1() {
        KnxTpUartSerialEventType eType = knx.serialEvent();
        if (eType == KNX_TELEGRAM) {
          KnxTelegram* telegram = knx.getReceivedTelegram();
      
          if (telegram->isTargetGroup() && telegram->getCommand() == KNX_COMMAND_INDIVIDUAL_ADDR_WRITE && programmingMode) {
            // Broadcast to all devices in programming mode to store new physical address
            Serial.print("Received IndvAddrWrite: ");
      
            int area = (telegram->getBufferByte(8) & B11110000) >> 4;
            int line = telegram->getBufferByte(8) & B00001111;
            int member = telegram->getBufferByte(9);
      
            Serial.print(area);
            Serial.print(".");
            Serial.print(line);
            Serial.print(".");
            Serial.println(member);   
      
            knx.setIndividualAddress(area, line, member);    
         
            // Here the new address could be stored to EEPROM and be reloaded after restart of Arduino   
          } else if (telegram->getCommand() == KNX_COMMAND_MASK_VERSION_READ) {
            // Request for mask version (version of bus interface
            knx.individualAnswerMaskVersion(telegram->getSourceArea(), telegram->getSourceLine(), telegram->getSourceMember());
          } else if (telegram->getCommand() == KNX_COMMAND_INDIVIDUAL_ADDR_REQUEST && programmingMode) {
            // Broadcast request for individual addresses of all devices in programming mode
            knx.individualAnswerAddress(); 
          } else if (telegram->getCommand() == KNX_COMMAND_ESCAPE) {
            // Configuration data handling
            programmingMode = false;
            switch(telegram->getFirstDataByte() & 0x7C) {
            case 0x54:
              Serial.println("Read property called, object %02X, property %02X, count %i\n",telegram->getBufferByte(8),telegram->getBufferByte(9),telegram->getBufferByte(10) >> 4,(telegram->getBufferByte(10) & 0x0F) * 256 + telegram->getBufferByte(11));
              /* Reply to the request here */
              break;
            case 0x5C:
              Serial.println("Write property called, object %02X, property %02X, count %i\n",telegram->getBufferByte(8),telegram->getBufferByte(9),telegram->getBufferByte(10) >> 4,(telegram->getBufferByte(10) & 0x0F) * 256 + telegram->getBufferByte(11));
              /* Check and store value here */
              break;
            }
          } else if (telegram->getFirstDataByte() == KNX_EXT_COMMAND_AUTH_REQUEST && programmingMode) {
            // Authentication request to allow memory access
            knx.individualAnswerAuth(15, telegram->getSequenceNumber(), telegram->getSourceArea(), telegram->getSourceLine(), telegram->getSourceMember());
          } else if (telegram->getCommand() == KNX_COMMAND_RESTART && programmingMode) {
            // Restart the device -> end programming mode
            programmingMode = false;
            knx.setListenToBroadcasts(false);
            Serial.println("Received restart, ending programming mode"); 
          }
        }
      }
      Auf ein Read und ein Write muss man eine PropertyResponse zurückschicken. Das müsste in etwa so aussehen (einbauen in KnxTpUart.cpp, Headerfile anpassen überlasse ich euch):
      Code:
      /* Send a PropertyResponse to an indidual address.
         area/line/member: communication partner
         Object/Property: indicates the configuration value
         start: index of first value to be sent
         nvalues: number of values to be sent
         valuesize: size of each value (in bytes)
         data: pointer to the first value to be sent. 
        */
         
      bool KnxTpUart::propertyResponse(int area, int line, int member, int object, int property, int start, int nvalues, int valuesize, char *data) {
          int n;
          /* nvalues*valuesize+4: Wert 4 ist ggf. zu klein, war zu faul zum Recherchieren */
          createKNXMessageFrameIndividual(nvalues*valuesize+4, KNX_COMMAND_ESCAPE, area, line, member, B10110);
          _tg->setCommunicationType(KNX_COMM_UCD);
          _tg->setBufferByte(8, object); 
          _tg->setBufferByte(9, property); 
          _tg->setBufferByte(10, (nvalues << 4) | (start >> 8));; 
          _tg->setBufferByte(11, start & 0xFF);
          while (nvalues*valuesize > 10) {
              nvalues--;
          }
          if (nvalues == 0) {
              return false;
          }
          for (n=0; n < nvalues*nvalues; n++) {
              _tg->setBufferByte(12+n, data[n]); 
          }
          _tg->createChecksum();
          return sendMessage();
      }

      Kommentar


        Zitat von rel Beitrag anzeigen
        welche RFID-Karten/Keys kann man denn mit deiner Anlage nutzen?
        Und noch eine Frage: Wie tief ist dein Aufbau für die Unterbringung im Siedle-Blinddeckel?
        Hi
        ja - ich denke diese NFC-Tags kann man nutzen. Ich habe zumindest ähnliche... eigentlich alles was mit heutigen Handys gelesen werden kann.
        Auch etliche Firmenausweiße und "moderne" Messekarten funktionieren ;-)

        Einbautiefe - grob gemessen:
        Antenne+Arduino sind ca. 1 cm. Stecker nochmal 1,5 cm - kann man aber durch direkt anlöten sicherlich verringern.
        Siemens BCU sind ca. 1,8cm.... in der Siedle Anlage ist viel Platz - der BCU ist aber bei mir abgesetzt auf der Hausinnenseite.

        Gruß
        Thorsten

        Kommentar


          Zitat von rel Beitrag anzeigen
          Hallo Thorsten,

          welche RFID-Karten/Keys kann man denn mit deiner Anlage nutzen? Gehen diese: http://www.amazon.de/Kamor%C2%AE-NFC.../dp/B00DRDURG4
          Die könnte ich ja dann überall hin kleben bzw. einbauen (Uhr, Handy, Jacke) oder irre ich mich da?


          Danke.

          Ari

          Sorry für die dumme Frage- aber

          NFC = RFID???

          Also ich finde diese Lösung genial und würde sofort Abstand zu meiner geplanten Ekey Lösung nehmen.
          Meint ihr wenn ich einen solchen NFC hinter meiner Uhr kleben würde, würde der Leser den durch das Uhrgehäuse (am Gehäuse) vorbei erkennen??

          Ne Tiefe Unterputzdose mit 16 Adern 0,8 wäre vorhanden, derzeit befindet sich da nen Fingerprint von Conrad drin!!!

          lG und Danke
          Daniel



          Gesendet von meinem iPad mit Tapatalk

          Kommentar


            Hi
            naja - NFC baut auf RFID auf.
            Ich mach mir´s mal einfach und verweise hierauf: Unterschied RFID und NFC - Eine kurze Erklärung - Fakir Informatik
            Bisher habe ich viele 13,56 MHz Mifare-Transponder und Tags getestet - die meisten (eigentlich bisher alle) gehen.
            Viele NFC Tags haben eher sehr kleine Antennen - daher eine schlechtere Reichweite.

            Es gibt Uhren die Mifare-Transponder eingebaut:
            PKS - Sicherheitssysteme
            Diese Klebe-Transponder könnten gehen:
            RFID Transponder Mifare 1k · 20x0,6mm Folie selbstklebend (E668se-20 Mifare) | eBay

            Und - einfach mal meine normalen Transponder hinter meine Pebbles gehalten: geht. Eine alte Swatch-Uhr und "normale" Uhr gehalten: 2x Misserfolg...

            Gruß
            Thorsten

            Nachtrag: je größer der Transponder - desto besser die Reichweite. Daher noch ein Link zu 25mm-Transponder:
            http://www.ebay.de/itm/2x-NFC-Tag-La...item3f243ad80b

            Kommentar


              Zitat von greentux Beitrag anzeigen
              Ich würde gern die vorhandenen Sensoren von Elabnet weiterverwenden. Also meistens Multisensoren T/H. Wenn man das nun ans KNX bekommen würde zu nem akzeptablen Preis, könnte ich so langsam den 1wire Bus im Haus loswerden...
              T/H in KNX kostet ja schon einiges und in "schön" ist das auch nicht zu bekommen (UP).
              Gerade getestet, der Arduino liest brav die DIY-Variante aus. Da hängt noch ein iButton und ein DS18B20 dran und alle 0.3 Sekunden kommt ein neuer Wert.
              Ziemlich krasse Geschichte .
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                Welchen Code/Library verwendest du denn für die iButtons?
                Temp sind "ja klar" - bei mir ist aber auch die Frage nach einem Kombisensor/Humidity offen.
                Sofern ich das recht im Kopf habe sind das ja einfache Sensoren die einen Spannungswert zurückgeben. Die Frage ist also eher nach fertigem Code für die Umrechnung in rF% und absol. Luftfeuchte und evtl. noch Taupunkt.

                @Greentux: die Elab-Sensoren sind kein Problem - das ist ja "standart" 1-Wire (nur eben in "gut" gemacht :-) ) - es geht "nur" um das Auswerten.

                Gruß
                Thorsten

                Kommentar


                  Ich hab jetzt erstmal nur fertige Librarys gesucht. Die iButtons gehen ja einfach per ID und da tut es das Example schon recht gut: Arduino Playground - OneWire

                  Für die DS2438 gibts auch ne Library+Example, die muss man nur nochmal anpassen wegen einer Namensänderung:
                  https://code.google.com/p/gfb/source...arduino/DS2438

                  Bleibt die Berechnung von absol. Luftfeuchte und Taupunkt, aber das doch nur eine weitere Funktion im Code, kann also echt nicht hart sein. Ich hab mich da auch nicht reingekniet sondern nur mal geschaut wie schnell man ans Ziel kommt -> Sehr schnell .
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    Zitat von ThorstenGehrig Beitrag anzeigen
                    Die Frage ist also eher nach fertigem Code für die Umrechnung in rF% und absol. Luftfeuchte und evtl. noch Taupunkt.
                    Hi Thorsten,

                    such mal nach Arduino Code fuer den DHT11. Das ist T/H (allerdings deutlich ungenauer als zumindest die DS1820) auf preislich ueberschaubarem Niveau. Leicht zu bekommen, inkl. fertiger Libraries fuer den Arduino, Taupunkt inbegriffen.
                    Ich habe ne Handvoll hier, benutze die aber nur fuer Feuchtemessungen, Temp ueberlasse ich lieber den 1820ern.

                    gruesse :: Michael

                    Kommentar


                      Naja, Taupunkt und abs. Luftfeuchte kann man ja auch noch woanders berechnen, wenn man will. Z.b. auf SH.py. Aber das wird auch da im Code gehen. Da braucht man sich keinen DHT11 antun, der ja wiederum kein 1wire spricht.

                      Jumi, es wäre auszuprobieren, was das Bitbanging 1wire am Arduino so "treiben" kann. Also ob man damit so eine Art dezentralen Busmaster baut oder eben in jede UP Dose, wo jetzt ein Multisensor ist, einen verbauen müsste.
                      Du hast parasitär probiert?
                      Derzeit zwischen Kistenauspacken und Garten anlegen.
                      Baublog im Profil.

                      Kommentar


                        Zitat von greentux Beitrag anzeigen
                        Da braucht man sich keinen DHT11 antun, der ja wiederum kein 1wire spricht.
                        Nujo, ob ich nen Sensor nun via 1wire, SPI oder AnalogIN am Arduino anschliesse ist ja nu erstmal egal. Dass der DHT kein 1wire spricht ist IMHO absolut kein Argument - weder dafuer noch dagegen
                        Er ist preiswert und mit fertigen Libs zu betreiben. In meinen Augen ist das der Hauptbeweggrund die ganze Sache ueberhaupt mit nem Arduino zu betreiben: naemlich dass es einfach ist. Wenn ich alles neu erfinden muss kann ich auch irgendeinen uC mit irgendeinem TPUART an den Bus bringen - das kann im Endeffekt naemlich vermutlich mehr als ein Arduino...

                        gruesse

                        Kommentar


                          Na ich glaube mit den "ungenauen" DHT11 wollen sich hier wenige Beschäftigen. Die Wiregate-Sensoren sind halt schonmal sehr gut und bereits für einen Berker-Sensoreinsatz vorbereitet.
                          Wobei ich Wintermute recht gebe: das Protokoll ist erstmal egal.

                          Die Wiregate-Sensoren laufen ja wohl auf dem "Batteriemonitor" DS2438 mit einem Honywell HIHxxx.
                          Also brauchen wir "nur" einen Code um den DS2438 auszulesen - und die Umrechnungsformel. Diese wierrum müsste sich sowohl im Wiregate- also auch im owfs finden lassen.
                          Mit diesen Begriffen hat mir Google das hier ausgespuckt:
                          https://code.google.com/p/gfb/source...istat.pde?r=93
                          Problem Sensor RH lesen damit gelößt
                          Umrechnen auf abs. Luftfeuchte ist dann nur Mathe - sofern man aus dem DS18S20 die Temp. auslesen kann.
                          Google liefert da auch Ergebnisse - aber einfache Formeln suche ich noch...

                          Hier die Formel:
                          TD: =243.04*(LN(RH/100)+((17.625*T)/(243.04+T)))/(17.625-LN(RH/100)-((17.625*T)/(243.04+T)))

                          TD=Taupunkt in Celsius
                          T=Temp in Celsius
                          RH=Rel. Luftfeuchte

                          Gruß
                          Thorsten

                          Kommentar


                            Zur Umrechnung reicht ja vl. auch die Temp aus dem 2438.
                            Das meinte ich eben auch. Schöne Sensoren gibt es ja schon. 1Wire geht offensichtlich out-of-the-box. Sensoren gibt es damit schon mehr als genug.

                            Mag aber auch nur daran liegen, das ich schon ne Menge Sensoren hier verbaut habe...
                            Derzeit zwischen Kistenauspacken und Garten anlegen.
                            Baublog im Profil.

                            Kommentar


                              Bevor sich jetzt alle ganz ausgiebig mit 1wire befassen und loslaufen und Sensoren kaufen oder so sollte ich vielleicht auf einen Effekt hinweisen den ich schonmal kurz beschrieben hatte - laesst sich auch leicht reproduzieren.
                              Das Problem ist, dass exzessives Lesen der 1wire-Sensoren den KNX-Empfang empfindlich stoert. Mir ist das aufgefallen, als ich 2 DS1820 in "recht schneller" Reihenfolge ausgelesen habe (jeweils mit s/4 Pause dazwischen) und der Arduino waehrenddessen nicht mehr auf Read-Anfragen vom Bus geantwortet hat (auf Writes auch nicht, btw).
                              Ich glaube das Problem liegt in der Art begruendet wie die KNX-Lib die Daten empfaengt: standardmaessig wird via Interrupt auf einen seriellen Event gewartet und dann das entsprechende Telegramm komplett vom Bus gelesen. Kurzes Ueberfliegen der 1wire-Lib zeigt aber, dass waehrend der Kommunikation mit den Sensoren, die Interrupts deaktiviert werden - vermutlich damit das Timing nicht durcheinander geraet. Ich schaetze mal das ist der Grund, wieso der Arduino waehrenddessen den seriellen Event nicht mitbekommen hatte. Ist aber erstmal nur ein "wild guess", mir fehlte bisher die Zeit mich naeher damit zu befassen... Je nach Buslast und Anzahl an abzufragenden 1wire-Sensoren ist es dann mitunter auch schon bedenkenswert wie lang es dauert bis die 64byte Buffer des Arduinos ueberlaufen und Busdaten definitiv unwiederbringlich verloren gehen.

                              Natuerlich passiert das nur waehrend der 1wire-Kommunikation und wenn man das eher selten macht sinkt die Wahrscheinlichkeit des Auftretens - aber leider ist das nicht wirklich eine saubere Implementierung. Fuer ein rein passiv arbeitendes Geraet welches nur zyklisch oder bei Schwellwerten sendet ist es natuerlich egal, aber im Sinne der Fehlerfrei- und universellen Handhabbarkeit der Lib sollte vllt mal jemand versuchen ob er den Fehler nachstellen und uU sogar beheben kann - ich weiss leider nicht wann ich dazu kommen wuerde...

                              Vielleicht lags aber auch nur an meinem Aufbau - glaub ich aber nicht, ehrlich gesagt

                              gruesse :: Michael

                              Kommentar


                                Mir würde es anfänglich reichen, wenn man alle 30 Sekunden die 1wire Sensoren abfragt. Die müssen sowieso bei parasitärem Betrieb erstmal Energie speichern...
                                Aber ja, sollte man als ToDo auf der Liste lassen.
                                Derzeit zwischen Kistenauspacken und Garten anlegen.
                                Baublog im Profil.

                                Kommentar

                                Lädt...
                                X