Ankündigung
Einklappen
Keine Ankündigung bisher.
ARDUINO am KNX
Einklappen
X
-
Auf jeden Fall potentialfrei bleiben...ich würde über einen Transistor/Mosfet/Optokoppler ein Relais schalten. Gibts fertige Bausteine in der Bucht.
-
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.)
DankeZuletzt geändert von Golfer; 20.12.2020, 22:07.
Einen Kommentar schreiben:
-
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:
-
Hey,Zitat von Kunkrab Beitrag anzeigenOk, 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 ...
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:
-
funktioniert es wenn du den Schreibvorgang der Status_GA mal testweise auskommentierst?
Einen Kommentar schreiben:
-
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:
-
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:
-
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:
-
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.Zitat von netzlaff Beitrag anzeigenIch gehe ganz stark davon aus, dass mein Code für diesen Zweck etwas suboptimal ist.
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:
-
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.
Einen Kommentar schreiben:
-
Kannst du deinen Sketch einmal posten?Zitat von netzlaff Beitrag anzeigenTestweise habe ich mal versucht zwei Listen-GAs zu schalten - funktioniert nicht, das zweite wird anscheinend übersehen.
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.Zitat von netzlaff Beitrag anzeigenGibt 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.
Einen Kommentar schreiben:
-
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:
-
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:


Einen Kommentar schreiben: