Jetzt warst Du schneller...schön, dass es bis hierher schonmal funzt :-)
Ankündigung
Einklappen
Keine Ankündigung bisher.
ARDUINO am KNX
Einklappen
X
-
Das mit der Lib ist normal. Das "Event unknown" wird ja nur bei serieller Konsole geschrieben, kostet im Normalbetrieb also keine Zeit. Eine if-Abfrage kostet auch nur ein paar µs. Insgesamt ist die Performance am KNX aber begrenzt, das musste ich auch schon feststellen, gerade wenn man nur 8MHz hat :-(
In der Lib gibts auch einige delay(), die erstmal alles für kurze Zeit zum Stillstand bringen.
Kommentar
-
Das habe ich mir schon gedacht. Irgendwo muss ja unterschieden werden zwischen relevanten und nicht relevanten Telegrammen.
Die Funktion sieht jetzt erstmal so aus
Code:{ const long interval = 200; // time between blinks in ms. static bool switchState = true; static byte sequencePosition = 0; static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (sequencePosition < numberOfBlinks * 2) { // blink switchState = !switchState; sequencePosition++; digitalWrite(LED, switchState); } else { blinkEnd = true; sequencePosition = 0; } } }
Der Großteil ist von Peterich hier aus dem Forum übernommen. Für Verbesserungen bin ich immer offen (bin nur Code Copy-Paster).
Es geht darum einen Wiegand-Reader an den Bus anzubinden. Ich habe das nur um ein paar Kleinigkeiten für meinen Reader (34bit) und Status sowie Abschaltung für die Leseeinheit ergänzt.
Falls Interesse besteht, kann ich nach Fertigstellung dazu ein eigenes Thema zur Dokumentation machen.
Ziel war es möglichst günstig (50€ all incl.) einen optisch vertretbaren, wetterfesten Reader zu haben, der ohne Zusatzversorgung auskommt und direkt über den Bus kommuniziert.Angehängte Dateien
- Likes 1
Kommentar
-
Das Problem besteht vom Bus Richtung Arduino.
Eine hohe Auslastung des Arduino ist ja (vermutlich?) mit hoher Buslast immer gegeben. Es werden, soweit ich das verstehe, ja alle Telegramme empfangen (versucht zu empfangen) und dann quasi gefiltert welches für den Arduino/das Gerät von Relevanz ist und ausgewertet.
Kommentar
-
Moin zusammen,
bin gerade etwas frustriert beim Rumprobieren mit ersten KNX-Tests...
Senden geht, Empfangen nicht.
EDIT: OK ich habe beim UNO den Jumper nicht gesetzt, statt RTFM nur ÜTFM gemacht...
Aber kurz zum Abgleich: wo gibt es die aktuelle KnxTpUart.h die ihr benutzt? Im Netz gibt es diverse verschiedene
LG TobiasZuletzt geändert von tooooooobi; 10.11.2019, 12:51.
Kommentar
-
Hier mal ein kurzer Zwischenstand, Lesen und Schreiben auf den Bus:
Klappt am UNO (mit dem Jumper)
Klappt am (original-) NANO (Ohne Jumper)
Klappt nicht am Nachbau-Nano (ch340g) - egal ob mit oder ohne Jumper
Hat jemand eine Idee wie sich die beiden Nanos unterscheiden? Liegt das am ch340g-Chip? Den Trick mit Pin 19 habe ich nicht probiert...
LG
Tobias
Kommentar
-
Zitat von tooooooobi Beitrag anzeigenLiegt das am ch340g-Chip?
Kommentar
-
Zitat von jentz1986 Beitrag anzeigenMini pro clone habe ich viele am laufen...
Kommentar
-
Hallo zusammen,
ich probiere seit ein paar Tagen, einen Arduino Mega an den KNX Bus zu bekommen. Geht auch rudimentär mit der Bibliothek von Thorsten Gehrig. Mit digitalWrite schalte ich ne kleine LED an und aus. Allerdings habe ich das Problem, dass der Arduino keine Empfangsbestätigung 'LL_ACK' zurücksendet. Deshalb sendet der Absender stets nochmals drei Telegtamme hinterher. Stört nicht bei wenig Buslast, ist aber nicht schön. Hat jemand eine Idee? Hier mal der minimale Code:
Code:#include <KnxTpUart.h> KnxTpUart knx(&Serial1, "1.1.149"); void setup() { Serial.begin(9600); Serial1.begin(19200, SERIAL_8E1); Serial1.println(UCSR0C, BIN); knx.uartReset(); knx.addListenGroupAddress("2/1/10");//schalten knx.addListenGroupAddress("2/1/11");//Dimmen relativ knx.addListenGroupAddress("2/1/12");//Dimmen absolut } void loop() { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == KNX_TELEGRAM) { KnxTelegram* telegram = knx.getReceivedTelegram(); String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); Serial.println(target); if (target == "2/1/10") { Serial.println(telegram->getBool()); if (telegram->getBool()) { digitalWrite(9, 255); } else { digitalWrite(9,0); } } } }
Unbenannt.PNG
Kommentar
-
Hallo Hubiflieger,
eventuell mal eine kleine Hilfestellung.
Code:#include <KnxTpUart.h> KnxTpUart knx(&Serial1, "1.1.149"); void setup() { Serial1.begin(19200, SERIAL_8E1); knx.uartReset(); knx.addListenGroupAddress("2/1/10"); knx.addListenGroupAddress("2/1/11"); knx.addListenGroupAddress("2/1/12"); } void loop() { } void serialEvent1() { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == KNX_TELEGRAM) { KnxTelegram* telegram = knx.getReceivedTelegram(); String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); if (target == "2/1/10") { int received_2_1_10 = telegram->getBool(); if (received_2_1_10) { digitalWrite(9, 255); } else { digitalWrite(9, 0); } } } }
Mit freundlichen Grüßen
Mag Gyver
Kommentar
Kommentar