Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

  • dreamy1
    antwortet
    Auf jeden Fall potentialfrei bleiben...ich würde über einen Transistor/Mosfet/Optokoppler ein Relais schalten. Gibts fertige Bausteine in der Bucht.

    Einen Kommentar schreiben:


  • Golfer
    antwortet
    ich meinte an der Siemens BCU

    edit: hab^s ..... mein fehler

    edit 2:
    Noch eine Frage wenn ich einmal da bin und im thema stecke. Ich habe gelesen das nicht alle Arduinos auf "Anfragen" antworten können.
    Ich habe einen Pro-Mini im Einsatz und würde gern ein Relais daran betreiben und der Schaltbefehl kommt via KNX.
    Würde das gehen oder oder doch lieber Schaltaktor? Der Strom übers Relais ist auch nicht so groß (12V Türsummer für 5sek.)

    Danke
    Zuletzt geändert von Golfer; 20.12.2020, 22:07.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Das dürfte die Standardbeschaltung sein, siehe Datenblatt vom TPUART2....-> Pin 21 am TPUART2.
    Zuletzt geändert von dreamy1; 20.12.2020, 20:25.

    Einen Kommentar schreiben:


  • Golfer
    antwortet
    Hallo alle miteinander, habe wiedermal ein kleines problemchen. habe seit etlichen monaten die Siemens BCU mit ProMini und nem DHT22 am laufen und wollte nun endlich die geschichte in ein gehäuse basteln. Aus Platzmangel habe ich den Busankoppler zerlegt und wollte den Connector ablöten und habe dabei den TX zerstört :-(.
    Hat jemand einen Schaltplan davon oder weiß jemand an welcher stelle ich TX abgleifen kann.

    Danke im Vorfeld

    Einen Kommentar schreiben:


  • Delta6400
    antwortet
    Zitat von Kunkrab Beitrag anzeigen
    Ok, wenn niemand antwortet, muss ich das selber tun 😉
    Mein Problem war, dass Uno und Nano beide ihr USB auf den RX/TX pins haben. Der USB chip hat offensichtlich soviel vom Eingangssignal "weggefressen", dass es nicht mehr für die Signalerkennung ausreichte. Ich hatte das dann mit dem Oszi auch gemessen, da blieben nur noch knapp 3 Volt übrig, von den 4.5V, die das TPUART liefert. Jetzt habe ich zwei Inverter eines 7404 TTL chips vor den RX input gehängt, und jetzt geht es. Das ist nicht wirklich eine praktikable Lösung, aber fixt das Problem. Die Lösung sind hoffentlich die Arduino Pro Minis, die demnächst kommen ...
    Hey,
    ich bin aktuell auch dabei mich mit dem Thema zu beschäftigen. Senden auf den Bus klappt, jedoch das Empfangen nicht.
    Ich hab einen Arduino Nano (5V), bei hm geht die RX LED an, jedoch anwtortet er nicht auf die Telegrame.
    Aus deinem Post oben und dem von Mag Gyver heißt es, dass der Arduino Nano von "Natur" aus nicht auf Leseanfragen antworten kann, da der USB-Chip dies verhindert?
    Und ma kann dies lösen indem man entweder einen 7404TTL vor dem RX hängt oder den CH340 auslötet und dann mit Hilfe eines USB-zu-TTL Konverter Moduls den Arduino beschreibt?
    Ein einfaches Ja reicht mir

    Einen Kommentar schreiben:


  • netzlaff
    antwortet
    Habe ich testweise, bringt aber leider keine Besserung.

    EDIT:
    Ich werde die Libraries mal auf den neusten Stand bringen und nochmal testen. Vielleicht fällt jemanden noch was ein, woran es liegen könnte.
    Zuletzt geändert von netzlaff; 11.11.2020, 15:43.

    Einen Kommentar schreiben:


  • Sonnengruesser
    antwortet
    funktioniert es wenn du den Schreibvorgang der Status_GA mal testweise auskommentierst?

    Einen Kommentar schreiben:


  • netzlaff
    antwortet
    Ok, habs gar nicht hinbekommen. Aktuell ist loop() leer, alles wird über void serialEvent1() abgefragt, so wie in meinem letzten Sketch. Nach wie vor ist es so, dass der auf das zweite WRITE einer Listener-GA nicht reagiert, beispielsweise R4_ONOFF_GA und R5_ONOFF_GA. R4 wird geschaltet, R5 nicht.

    Einen Kommentar schreiben:


  • Sonnengruesser
    antwortet
    Ich gebe zu ich kenne diesen Stack nicht richtig, hab nur 1x kurz damit rum gespielt, aber einige andere Stacks hab ich intensiver in Verwendung.
    Ich glaub ich hab dich in die falsche Richtung geschickt mit der Auslagerung in den loop, mach das mal wieder rückgängig...

    Einen Kommentar schreiben:


  • netzlaff
    antwortet
    Ok, verstehe.

    Wie würde eine Aufbau der if (Rx_state) im loop aussehen? Müsste ich dort das target wieder genauso aufbauen wie in SerialEvent1?


    case auf target funktioniert leider nicht, klappt wohl nur bei int und char.
    Habe die Schleifen dann alle umgebaut auf if...elseif...
    Debug auf Serial ist nun auch komplett raus.
    Leider keine Besserung. Ich habe testweise mal die den ganzen KNX_COMMAND_READ rausgenommen, da ich noch nicht weiß, wie ich diesen im Loop() unterbringe. Hat aber auch nichts gebracht.

    Code:
    void serialEvent1() {
    KnxTpUartSerialEventType eType = knx.serialEvent();
    if (eType == TPUART_RESET_INDICATION) {
    //Serial.println("Event TPUART_RESET_INDICATION");
    }
    else if (eType == UNKNOWN) {
    //Serial.println("Event UNKNOWN");
    }
    else if (eType == KNX_TELEGRAM) {
    //Serial.println("Event 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());
    
    // KNX READ
    if (telegram->getCommand() == KNX_COMMAND_READ) {
    int R = 0;
    String R_STATE_GA = "";
    
    if ( target == R1_STATE_GA ) {
    R = R1;
    R_STATE_GA = R1_STATE_GA;
    }
    else if ( target == R2_STATE_GA ) {
    R = R2;
    R_STATE_GA = R2_STATE_GA;
    }
    else if ( target == R3_STATE_GA ) {
    R = R3;
    R_STATE_GA = R3_STATE_GA;
    }
    else if ( target == R4_STATE_GA ) {
    R = R4;
    R_STATE_GA = R4_STATE_GA;
    }
    else if ( target == R5_STATE_GA ) {
    R = R5;
    R_STATE_GA = R5_STATE_GA;
    }
    else if ( target == R6_STATE_GA ) {
    R = R6;
    R_STATE_GA = R6_STATE_GA;
    }
    //else if ( target == R7_STATE_GA ) {
    // R = R7;
    // R_STATE_GA = R7_STATE_GA;
    //}
    else if ( target == R8_STATE_GA ) {
    R = R8;
    R_STATE_GA = R8_STATE_GA;
    }
    
    if (digitalRead(R) == HIGH) {
    knx.groupAnswerBool(R_STATE_GA, false);
    }
    else {
    knx.groupAnswerBool(R_STATE_GA, true);
    }
    }
    
    
    // KNX WRITE
    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
    int R = 0;
    String R_STATE_GA = "";
    
    if ( target == R1_ONOFF_GA ) {
    R = R1;
    R_STATE_GA = R1_STATE_GA;
    }
    else if ( target == R2_ONOFF_GA ) {
    R = R2;
    R_STATE_GA = R2_STATE_GA;
    }
    else if ( target == R3_ONOFF_GA ) {
    R = R3;
    R_STATE_GA = R3_STATE_GA;
    }
    else if ( target == R4_ONOFF_GA ) {
    R = R4;
    R_STATE_GA = R4_STATE_GA;
    }
    else if ( target == R5_ONOFF_GA ) {
    R = R5;
    R_STATE_GA = R5_STATE_GA;
    }
    else if ( target == R6_ONOFF_GA ) {
    R = R6;
    R_STATE_GA = R6_STATE_GA;
    }
    //else if ( target == R7_ONOFF_GA ) {
    // R = R7;
    // R_STATE_GA = R7_STATE_GA;
    //}
    else if ( target == R8_ONOFF_GA ) {
    R = R8;
    R_STATE_GA = R8_STATE_GA;
    }
    
    int R_state = telegram->getBool();
    if (R_state) {
    digitalWrite(R, LOW);
    knx.groupWriteBool(R_STATE_GA, true);
    }
    else {
    digitalWrite(R, HIGH);
    knx.groupWriteBool(R_STATE_GA, false);
    }
    }
    }
    }
    Zuletzt geändert von netzlaff; 06.11.2020, 10:46.

    Einen Kommentar schreiben:


  • Sonnengruesser
    antwortet
    Zitat von netzlaff Beitrag anzeigen
    Ich gehe ganz stark davon aus, dass mein Code für diesen Zweck etwas suboptimal ist.
    Richtig, ich vermute die Debug-ausgabe bremst stark. Erst mal die Baudrate des Serial auf 38400 (oder so was) hochschrauben. Wenns noch zu langsam ist die "Serial print" aus der Auswertung auskommentieren.
    Ein Durchlauf der Funktion SerialEvent1 muss so kurz wie möglich sein.
    Dann würde ich die ifs auf ein switch case ändern (oder else if). Und die "if (Rx_state)" in den loop verschieben.

    Einen Kommentar schreiben:


  • netzlaff
    antwortet
    Hallo. Genau dieses Beispiel-Sketch dient meinem Projekt auch als Vorlage, nur dass ich auch auf COMMAND_WRITE reagieren will/muss.
    Ich habe das Sketch mal schnell etwas verschlankt, weil es immer 8x das gleiche macht, nur mit unterschiedlichen GAs:

    Code:
    #include <KnxTpUart.h>
    
    #define PHYSICAL_ADDRESS "1.1.100" /
    
    // Gruppen Adressen
    // Schalten
    #define R1_ONOFF_GA "0/4/0"
    #define R2_ONOFF_GA "0/4/1"
    #define R3_ONOFF_GA "0/4/2"
    ...bis R8_ONOFF_GA
    // Status
    #define R1_STATE_GA "0/4/20"
    #define R2_STATE_GA "0/4/21"
    #define R3_STATE_GA "0/4/22"
    ... bis R8_STATE_GA
    
    const int R1 = 2;
    const int R2 = 3;
    const int R3 = 4;
    ...bis R8
    
    KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS);
    
    void setup() {
    Serial.begin(9600);
    Serial.println("TP-UART Test");
    
    Serial1.begin(19200, SERIAL_8E1);
    
    Serial.print("UCSR1A: ");
    Serial.println(UCSR1A, BIN);
    
    Serial.print("UCSR1B: ");
    Serial.println(UCSR1B, BIN);
    
    Serial.print("UCSR1C: ");
    Serial.println(UCSR1C, BIN);
    
    knx.uartReset();
    
    // listen ON/OFF command
    knx.addListenGroupAddress(R1_ONOFF_GA);
    knx.addListenGroupAddress(R2_ONOFF_GA);
    knx.addListenGroupAddress(R3_ONOFF_GA);
    ...bis R8_ONOFF_GA
    // listen Status reads
    knx.addListenGroupAddress(R1_STATE_GA);
    knx.addListenGroupAddress(R2_STATE_GA);
    knx.addListenGroupAddress(R3_STATE_GA);
    ...bis R8_STATE_GA
    pinMode(R1, OUTPUT);
    pinMode(R2, OUTPUT);
    pinMode(R3, OUTPUT);
    pinMode(R4, OUTPUT);
    pinMode(R5, OUTPUT);
    pinMode(R6, OUTPUT);
    pinMode(R7, OUTPUT);
    pinMode(R8, OUTPUT);
    
    digitalWrite(R1, HIGH);
    digitalWrite(R2, HIGH);
    digitalWrite(R3, HIGH);
    digitalWrite(R4, HIGH);
    digitalWrite(R5, HIGH);
    digitalWrite(R6, HIGH);
    digitalWrite(R7, HIGH);
    digitalWrite(R8, HIGH);
    knx.groupWriteBool(R1_STATE_GA, false);
    knx.groupWriteBool(R2_STATE_GA, false);
    knx.groupWriteBool(R3_STATE_GA, false);
    knx.groupWriteBool(R4_STATE_GA, false);
    knx.groupWriteBool(R5_STATE_GA, false);
    knx.groupWriteBool(R6_STATE_GA, false);
    knx.groupWriteBool(R7_STATE_GA, false);
    knx.groupWriteBool(R8_STATE_GA, false);
    }
    
    void loop() {
    }
    
    void serialEvent1() {
    KnxTpUartSerialEventType eType = knx.serialEvent();
    if (eType == TPUART_RESET_INDICATION) {
    Serial.println("Event TPUART_RESET_INDICATION");
    }
    else if (eType == UNKNOWN) {
    //Serial.println("Event UNKNOWN");
    }
    else if (eType == KNX_TELEGRAM) {
    //Serial.println("Event 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());
    
    // KNX READ
    if (telegram->getCommand() == KNX_COMMAND_READ) {
    
    // R1
    if (target == R1_STATE_GA) {
    Serial.print("R1:State Read");
    if (digitalRead(R1) == HIGH) {
    knx.groupAnswerBool(R1_STATE_GA, false);
    }
    else {
    knx.groupAnswerBool(R1_STATE_GA, true);
    }
    }
    
    // R2
    if (target == R2_STATE_GA) {
    Serial.print("R2:State Read");
    if (digitalRead(R2) == HIGH) {
    knx.groupAnswerBool(R2_STATE_GA, false);
    }
    else {
    knx.groupAnswerBool(R2_STATE_GA, true);
    }
    }
    
    // R3
    if (target == R3_STATE_GA) {
    Serial.print("R3:State Read");
    if (digitalRead(R3) == HIGH) {
    knx.groupAnswerBool(R3_STATE_GA, false);
    }
    else {
    knx.groupAnswerBool(R3_STATE_GA, true);
    }
    }
    
    ...bis R8, immer identischer Ablauf
    }
    
    
    // KNX WRITE
    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
    // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
    
    // R1
    if (target == R1_ONOFF_GA) {
    int R1_state = telegram->getBool();
    Serial.print("R1:");
    Serial.println(R1_state);
    if (R1_state) {
    digitalWrite(R1, LOW);
    knx.groupWriteBool(R1_STATE_GA, true);
    }
    else {
    digitalWrite(R1, HIGH);
    knx.groupWriteBool(R1_STATE_GA, false);
    }
    }
    
    // R2
    if (target == R2_ONOFF_GA) {
    int R2_state = telegram->getBool();
    Serial.print("R2:");
    Serial.println(R2_state);
    if (R2_state) {
    digitalWrite(R2, LOW);
    knx.groupWriteBool(R2_STATE_GA, true);
    }
    else {
    digitalWrite(R2, HIGH);
    knx.groupWriteBool(R2_STATE_GA, false);
    }
    }
    
    // R3
    if (target == R3_ONOFF_GA) {
    int R3_state = telegram->getBool();
    Serial.print("R3:");
    Serial.println(R3_state);
    if (R3_state) {
    digitalWrite(R3, LOW);
    knx.groupWriteBool(R3_STATE_GA, true);
    }
    else {
    digitalWrite(R3, HIGH);
    knx.groupWriteBool(R3_STATE_GA, false);
    }
    }
    
    ...bis R8, Ablauf immer identisch
    }
    }
    }
    }

    Sicher könnte man sich die ganzen IF-Abfragen sparen und ggf. mit CASE oder sowas arbeiten, vielleicht liegt es auf daran?


    EDIT:

    Meint Test-Pro-Micro war heute in der Post. Habe ihn mal mit diesem Sketch beladen und an ein Steckboard mit zwei Test-LEDs gesteckt. Habe dann mal zwei der GAs über KNX gleichzeitig geschaltet. Und auch hier ist es so, dass die erste LED geschaltet wird, die zweite aber nicht. Wenn der Zeitabstand größer ist, klappt es. Ich gehe ganz stark davon aus, dass mein Code für diesen Zweck etwas suboptimal ist.
    Wie könnte man dies schöner, bzw. funktionaler gestalten. Unter Umständen möchte ich alle 8 Ausgänge gleichzeitig schalten und mich schon darauf verlassen, dass nicht "vergessen" wird.
    Zuletzt geändert von netzlaff; 05.11.2020, 18:01. Grund: Test-Aufbau mit gleichem Ergebnis

    Einen Kommentar schreiben:


  • magenbrot
    antwortet
    Zitat von netzlaff Beitrag anzeigen
    Testweise habe ich mal versucht zwei Listen-GAs zu schalten - funktioniert nicht, das zweite wird anscheinend übersehen.
    Kannst du deinen Sketch einmal posten?

    Zitat von netzlaff Beitrag anzeigen
    Gibt es ein gutes Example, wie man auf mehrere GAs liest, dann reagiert ohne das etwas verloren geht? Mir geht es um den Programmablauf. Zusätzlich soll das Skretch auch auf Status-Abfragen der Relais antworten.
    In ThorstenGehrigs Repository ist ein Beispiel dabei, das auf mehrere GA-ReadRequests reagiert. In ähnlicher Form läuft es auch bei mir in einem Projekt.

    Einen Kommentar schreiben:


  • netzlaff
    antwortet
    Reicht die Arbeitsgeschwindigkeit eines Pro Micros nicht aus, um zwei Telegramme, die auf den Bus gelegt werden "gleichzeitig" zu verarbeiten? Hintergrund meiner Frage ist, ich habe ein 8-fach-Relais-Modul an meinem Pro Micro mit Siemens Koppler. Kommt ein passendes Telegram, schaltet ein Ausgang und das Relais und es wird auf eine Status-GA geschrieben. Testweise habe ich mal versucht zwei Listen-GAs zu schalten - funktioniert nicht, das zweite wird anscheinend übersehen.

    Gibt es ein gutes Example, wie man auf mehrere GAs liest, dann reagiert ohne das etwas verloren geht? Mir geht es um den Programmablauf. Zusätzlich soll das Skretch auch auf Status-Abfragen der Relais antworten.

    Wisst ihr, was wie ich das meine?

    Einen Kommentar schreiben:


  • peterpux
    antwortet
    Hi Thorsten.

    Versuche grade, von meinem ESP8266 Telegramme abzuschicken. Allerdings bekomme ich beim Kompilieren einen Fehler in der Library-Datei \Arduino\libraries\KnxTpUart\KnxTelegram.cpp angezeigt. Sagt: In member function 'void KnxTelegram::set2ByteFloatValue(float)' --> line 357:23: error: invalid operands of types 'double' and 'int' to binary 'operator&' long m = round(v) & 0x7FF;

    Hast du zufällig irgendeine Idee?

    Einen Kommentar schreiben:

Lädt...
X