Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

  • phili
    antwortet
    Zitat von WagoKlemme Beitrag anzeigen
    Wie versprochen mein erstes kleines Projekt mit Arduino überhaupt - ist fertig.
    Es geht um einen Pro Micro 5V mit BME280 (Boschsensor: Luftdruck, Feuchte, Temperatur).
    Top, genauso brauche ich das.
    Ich habe zwar ziemlich viel Erfahrung mit Controllern aber noch nie was mit Arduino realisiert. Welcher Arduino ist hier verbaut? Könnte von der Größe her ein Arduino Nano sein, aber auf Wikipedia sieht das Board leicht anders aus.

    Zitat von WagoKlemme Beitrag anzeigen
    Ich bin schwer begeistert. Vielen Dank für das Projekt und höchsten Respekt !
    Ich auch !

    Einen Kommentar schreiben:


  • vento66
    antwortet
    Das wird dir aber auch nichts bringen, da Dir dadurch Telegramme verloren gehen können. Du solltest Dir vielleicht doch etwas anderes suchen.

    Einen Kommentar schreiben:


  • louisma
    antwortet

    Das sind mein eingebundenen Bibliotheken. KNX Tpuart ist dabei. Das ganze geht ja schon ist am laufen nur eben wie schon gesagt sehr instabil. Gibt es da regeln wie z.B. mindestens ein delay(50) nach einem GroupWrite oder davor oder so etwas, damit das ganze vom Arduino stabil gehandelt werden kann?
    Code:
     #include <SPI.h> #include <Ethernet.h> #include <KnxTpUart.h>

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Aaah. Du willst den Arduino=>Busankoppler als "KNX Gateway" benutzen?
    Uff - das ist ein unerwarteter Anwendungsfall... klar könnte funktionieren (dazu musst du dir aber noch die KNX library einbinden - fehlt in deinem Code) - und außerdem ist der ganze code sicherlich nicht für den Einsatzzweck als "KNX Gateway" ausgelegt.... Also für "mal ein Telegramm" => ok.
    Aber persönlich würde ich dafür eine andere Lösung anpeilen - irgendwas mit Mini-PC (Rasperry) und KNX-TP-UART - und einem eibd am laufen (oder den neueren knxd).
    Done re-invent the wheel...

    Gruß
    Thorsten

    Einen Kommentar schreiben:


  • louisma
    antwortet
    Hallo Thorsten. Ich glaube, dass du mich falsch verstanden hast. Mein Arduino ist direkt am Busankoppler. Auf dem Arduino ist ein Ethernet Shield. Ich will auf dem Arduino einen Webserver laufen lassen. Wenn ein Gerät in meinen Netzwerk den Arduino dann aufruft und einen bestimmten Button drückt wird ein knx GroupWrite Befehl direkt über Seriell an den BCU zum KNX geschickt.
    Gruß Louis

    Einen Kommentar schreiben:


  • ThorstenGehrig
    antwortet
    Zitat von louisma Beitrag anzeigen
    Ach ja und: Sollte ich eventuell einen eigenen Thread dafür eröffnen?
    Ja bitte.
    Dieser Thread ist für Arduinos die direkt an den KNX angebunden sind. Deine Arduinos sind das wohl nicht...
    Danke & Gruß
    Thorsten

    Einen Kommentar schreiben:


  • louisma
    antwortet
    Hallo liebe erfahrene KNX Arduino User,
    ich bin völlig neu im Thema Arduino in Zusammenarbeit mit KNX. Mein Ziel ist es, über alle möglichen Geräte in unserem Haus über eine lokale Website auf dem Arduino mit einem Ethernet Shield alle Lichter an / aus zu schalten. Ich habe mich jetzt seit ein paar Tagen mit dem Thema beschäftigt und basierend auf dem unteren Projekt ein bisschen Code zusammengeklatscht. Die Website läuft, sieht gut aus, nur jetzt kommt mein Problem:
    Manchmal schaltet der Arduino die Lichter auf Befehl, manchmal nicht, und manchmal schaltet er den ersten Befehl, danach aber leider nichts mehr.
    Hat jemand eine Ahnung weshalb das ganze so instabil ist? Sollte ich delays einbauen vor/nach dem Absenden eines GroupWrites?
    Kleine Info am Rande: ich nutze keinen originalen Arduino. ( ist das ein Problem mit KNX oder allgemein? )
    Hier der
    Code:
    #include <SPI.h>
    #include <Ethernet.h>
    #include <KnxTpUart.h>
    
    
    KnxTpUart knx(&Serial1, PA_INTEGER(15,15,20));
    
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
    byte ip[] = { 192, 168, 178, 233 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
    byte gateway[] = { 192, 168, 178, 1 };                   // internet access via router
    byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
    EthernetServer server(80);                             //server port     
    String readString;
    
    void setup() {
      Serial.begin(9600);
      Serial.println("TP-UART Test");  
    
      Serial1.begin(19200);
      UCSR1C = UCSR1C | B00100000; // Even Parity
    
      Serial.print("UCSR1A: ");
      Serial.println(UCSR1A, BIN);
    
      Serial.print("UCSR1B: ");
      Serial.println(UCSR1B, BIN);
    
      Serial.print("UCSR1C: ");
      Serial.println(UCSR1C, BIN);
    
      // start the Ethernet connection and the server:
      Ethernet.begin(mac, ip, gateway, subnet);
      server.begin();
      Serial.print("server is at ");
      Serial.println(Ethernet.localIP());
      knx.uartReset();
    }
    
    
    void loop() {
      // Create a client connection
      EthernetClient client = server.available();
      if (client) {
        while (client.connected()) {   
          if (client.available()) {
            char c = client.read();
    
            //read char by char HTTP request
            if (readString.length() < 100) {
              //store characters to string
              readString += c;
              //Serial.print(c);
             }
    
             //if HTTP request has ended
             if (c == '\n') {          
               Serial.println(readString); //print to serial monitor for debuging
    
               client.println("HTTP/1.1 200 OK"); //send new page
               client.println("Content-Type: text/html");
               client.println();     
               client.println("<HTML>");
    
               client.println("<HEAD>");
               client.println("<TITLE>Smarthome Control</TITLE>");
               client.println("<meta charset='utf-8'>");
               client.println("<meta name='viewport' content='width=device-width, initial-scale=1'>");
               client.println("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>");
               client.println("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js'></script>");
               client.println("<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>");
               client.println("</HEAD>");
    
               client.println("<BODY>");
               client.println("<div class='container'>");
               client.println("<div class='jumbotron'>");
               client.println("<h1><b>Smarthome Control</b></h1>");
               client.println("<br><br>");
    
               client.println("<div class='featurette' id='control'>");
               client.println("<h2 class='featurette-heading'>Control");
               client.println("<span class='text-muted'>Panel</span>");
               client.println("</h2>");
               client.println("<p class='lead'>");
    
               client.println("<div id='lights' ><br>");
               client.println("Wohnzimmerdecke<br><br>");
               client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerdeckenlichton\"\"> <button type='button' class='btn btn-success' <font color='white'> An </font> </button> </a>");
               client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerdeckenlichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a> ");
               client.println("<br><br>");
               client.println("Wohnzimmerwand<br><br>");
               client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerschranklichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
               client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerschranklichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button></a> ");
               client.println("<br><br>");
               client.println("Bürodecke<br><br>");
               client.println("<a style='text-decoration: none;' href=\"/?buerodeckenlichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
               client.println("<a style='text-decoration: none;' href=\"/?buerodeckenlichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a>");
               client.println("<br><br>");
               client.println("Büroschrank <br><br>");
               client.println("<a style='text-decoration: none;' href=\"/?bueroschranklichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
               client.println("<a style='text-decoration: none;' href=\"/?bueroschranklichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a>");
               client.println("<br></div>");
    
               client.println("</p></div>");
               client.println("</div>");
    
               client.println("</BODY>");
               client.println("</HTML>");
    
               delay(2);
               //stopping client
               client.stop();
               //controls the Arduino if you press the buttons
    
               if (readString.indexOf("?buerodeckenlichton") >0){
                   knx.groupWriteBool(GA_INTEGER(0,4,1), true);
               }
               if (readString.indexOf("?buerodeckenlichtoff") >0){
                   knx.groupWriteBool(GA_INTEGER(0,4,1), false);
               }
               if (readString.indexOf("?bueroschranklichton") >0){
                   knx.groupWriteBool(GA_INTEGER(0,4,0), true);
               }
               if (readString.indexOf("?bueroschranklichtoff") >0){
                   knx.groupWriteBool(GA_INTEGER(0,4,0), false);
               }
               if (readString.indexOf("?wohnzimmerdeckenlichton") >0){
                   knx.groupWriteBool(GA_INTEGER(0,1,0), true);
               }
               if (readString.indexOf("?wohnzimmerdeckenlichtoff") >0){
                   knx.groupWriteBool(GA_INTEGER(0,1,0), false);
               }
               if (readString.indexOf("?wohnzimmerschranklichton") >0){
                   knx.groupWriteBool(GA_INTEGER(0,1,2), true);
               }
               if (readString.indexOf("?wohnzimmerschranklichtoff") >0){
                   knx.groupWriteBool(GA_INTEGER(0,1,2), false);
               }
                //clearing string for next read
                readString="";  
    
             }
           }
        }
    }
    }
    Ach ja und: Sollte ich eventuell einen eigenen Thread dafür eröffnen?
    This project is all about using an Arduino with an Ethernet shield. I'll be controlling one LED and a servo,...

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    Hallo WagoKlemmen,

    na dann viel Spaß und gute Erholung.



    Mit freundlichen Grüßen

    Mag Gyver

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Hallo Mag Gyver,

    nein, das ist nicht der Sketch.
    Da ich heute Nacht in Urlaub fahre, kann ich dir den Sketch erst Ende nächster Woche schicken.
    Danke für deine Hilfe !

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    Hallo WagoKlemme,

    erstmal muss ich verstehen warum es zu diesem Phänomen kommt und ob ich dies bei mir reproduzieren kann. Den von dir verwendeten Sketch, ist das der den du hier schon vor kurzen gepostet hast?

    Damit ich mir dies zusammen mit der Library anschauen kann, man arbeitet mit mehr Input einfach leichter.



    Mit freundlichen Grüßen

    Mag Gyver

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Hallo Mag Gyver,

    nein, im Sketch ist kein einziges Delay.
    Wenn Du dir das Thema vorknöpfst, kann ich das so verstehen, dass Du eine Queue in der Lib planst ?
    Denn im Sketch laufe ich ja wieder in das selbe (Timing-)Loch, wenn die Answers eh schon in der Loop stehen. Mehr geht eigentlich nicht.
    Danke für dein Interesse.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    Hallo WagoKlemme,

    ist schon sehr seltsam. Eigentlich hätte er dies auf jeden Fall locker beantworten können und müssen. Hast du noch zusätzliche

    Code:
    delay()
    irgendwo eingebaut oder verbirgt sich in einer von dir eingebundenen Library noch das Ein oder Andere

    Code:
    delay()
    ?

    Da ich deinen grundsätzlichen Sketch nicht kenne und die darin zusätzlich eingebundene Libraries ebenfalls nicht, könnte eine Queue schon bei deinem Projekt von entscheidenden Vorteil sein.

    Schaden kann es auch nicht, einen Versuch ist es auf jeden Fall wert. Ich werde mir bei Gelegenheit, dieses Thema mal vorknöpfen, aber derzeit nicht, da steht noch Viel Anderes auf meiner Liste mit höherer Priorität.



    Mit freundlichen Grüßen

    Mag Gyver
    Zuletzt geändert von Mag Gyver; 31.07.2017, 21:51.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Hallo Mag Gyver,

    Danke.
    Also, Umbau mit Bool in Loop und Serial_Write_Delay_MS auf 50.

    2017-07-31 20_14_32-192.168.2.16_data_log_MONLOG_2017-07-31.htm_20170731191616.png

    Leider nicht befriedigend, 2 Werte blieben aus.
    Eine Queue hätte den Vorteil, dass die Performance des Arduino nicht so entscheidend ist. Er liefert halt dann einzelne Werte wie er kann. Hier hätte er für die 4 Werte 14s Zeit gehabt. Das müsste doch ausreichen einzelne Werte zu liefern.
    Wie siehst Du das ?

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    Hallo WagoKlemme,

    ja ich meine pro Gruppenadresse ein Triggervariable vom Typ "BOOL" im void serialEvent () setzen. Wenn diese Triggervariable der jeweiligen Gruppenadresse wahr ist (Bedingung im void loop() prüfen), dann die Antwort auf die Gruppenadresse versenden und natürlich die Triggervariable wieder zurücksetzen. Damit die nächste Leseanfrage auch erkannt werden kann.

    Des kann man nicht lernen, dass muss man können -> Stichwort "Timing" !


    Mit freundlichen Grüßen

    Mag Gyver

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Zitat von Mag Gyver Beitrag anzeigen
    Code:
    void serialEvent()
    aus? Würde dann vorschlagen, hier nur das Wesentliche zu tun. Die Leseanfrage pro Gruppenadresse in einer Variable speichern und dann den Rest in

    Code:
    void loop()
    zu erledigen -> z.B.: Antworten auf deine Leseanfrage. Dann könnte man noch den Schreibtimeout der KNX-Library von Standard

    Mit freundlichen Grüßen

    Mag Gyver
    Meinst Du eine Bool zu setzen bei GA-Abfrage ?
    Und dann die Bool in der Loop abfragen ?

    Einen Kommentar schreiben:

Lädt...
X