nein passt schon, LED_BUILTIN ist eine vordefinierte Konstante
(ist evtl. nicht der richtige Name dafür, aber der Copiler meckert nicht und kanns richtig umsetzten - 13 stimmt z.B. beim Uno, ist evtl. bei anderen Arduinos oder dem ESP8266 anders definiert)
Ankündigung
Einklappen
Keine Ankündigung bisher.
ARDUINO am KNX
Einklappen
X
-
Hallo
Fehlt nicht noch vor void setup()
int LED_BUILTIN = 13;
Gruß NetFritz
Einen Kommentar schreiben:
-
... Danke Mag Gyver und Resümee:
mein Sketch aus #810 geht bei Dir
Dein Sketch aus #685 leicht modifiziert (PA, GA und interner LED) gibt:
Tipps aus #686ff ziehen nicht, da ich Arduino und PC trenne (keine USB-Verbindung); Stromversorgung des Arduino kommt aus der BCU.Code:#include <KnxTpUart.h> KnxTpUart knx(&Serial, "1.1.5"); boolean test; void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(19200); UCSR0C = UCSR0C | B00100000; knx.uartReset(); knx.addListenGroupAddress("15/0/0"); } void loop() { } void serialEvent() { 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 (telegram->getCommand() == KNX_COMMAND_WRITE) { if (target == "15/0/0") { test = telegram->getBool(); digitalWrite(LED_BUILTIN, (test) ? HIGH : LOW); } } } }
Ich habe jetzt nur den Uno genommen, um "kompatibel" zu bleiben ...
... und immer noch das gleiche Ergebnis:
Senden vom Arduino auf den Bus geht - Empfang vom Bus an den Arduino geht nicht
Ich habe das "unbestimmte Gefühl", dass "irgendwo anders" klemmt - nicht am/im Arduino sondern ab der BCU in Richtung Bus.
Ich fange mal an zu spinnen:
- Kann die BCU als "Einbahnstraße" arbeiten?
- Kann der Bus Telegramme "unterdrücken"?
Ist mir völlig rätselhaft. Hast Du (oder noch wer) Tipps, was / wie ich noch testen kann?
Danke Marco
Einen Kommentar schreiben:
-
Hallo mars,
ähm. Passt schon, habe ich nach dem Kopieren selber gelöscht.
Entschuldigung, mein Fehler. Man sollte die Taste "Entf" nur einmal drücken.
Aber doppelt hält manchmal besser!?
Update:
Dein Sketch im Post # 810 funktioniert auf dem Arduino Uno ohne Probleme.
Leider habe ich keinen Arduino ProMini 5V 16Mhz zum Testen.
Mit freundlichen Grüßen
Mag GyverZuletzt geändert von Mag Gyver; 07.03.2016, 21:37. Grund: Sketch tested with Arduino Uno and Siemens 5WG1 117-2AB12 -> O.K.
Einen Kommentar schreiben:
-
vielen Dank erst Mal und gleich noch eine Frage:
welchen Sketch meinst Du? Rauten sind doch vor dem "include" in beiden Sketches?...fehlt die Raute
Posts #685 bis #688 sehe ich mir gleich mal an und werde morgen mal probieren und ...
... das mit dem Nano ist mir klar / bekannt - darum der ProMini, der besser in ein kleines (REG-)Gehäuse geht.
Gruß Marco
Einen Kommentar schreiben:
-
Hallo mars,
zu deinen Problemen.
Dein Sketch kann so nicht funktioniert.
Vor dem
fehlt die Raute.Code:include <KnxTpUart.h>
Beachte hierbei bitte Post #685 bis Post #688 für den Arduino Uno.
In diesen Post befindet sich auch ein Sketch zum Empfangen der funktioniert garantiert.
Danach sollte auch das Empfangen mit dem Arduino Uno funktionieren.
Mit dem ProMini habe ich keine Erfahrung, diesen benütze ich nicht.
Nur zur Information:
Der Arduino Nano geht nur für das Senden, beim Empfangem stört der FTDI-Baustein.
Ja, beim nicht fehlerfreien Empfangen läuft die Library auch in den Zweig "eType == UNKNOWN".
Mit freundlichen Grüßen
Mag GyverZuletzt geändert von Mag Gyver; 07.03.2016, 20:45.
Einen Kommentar schreiben:
-
Empfang vom Bus klappt nicht
Aber erst mal "Hallo" in diesen Thread und vielen Dank für die Idee und die Arbeit zur Umsetzung.
Ich habe bisher mit der KnxTpUart-Library eine kleine Wetterstation gebastelt, die zyklisch die aktuellen Messwerte auf den Bus sendet. Das habe ich mit meiner copy&paste-Programmierung recht gut und zügig hinbekommen.
Jetzt wollte ich einen Schritt weiter gehen und per GA (Schalt-)Befehle an den Arduino senden.
Zum Test habe ich (auf Grundlage des Beispiels "ReceiveKNXTelegrams") ein kleines Sketch erstellt und geladen:
Jetzt sollte ich im ETS-Gruppenmonitor mittels beschreiben der GA 15/0/0 die eingebaute LED schalten können - dies klappt aber nicht !?Code:#include <KnxTpUart.h> // Initialize the KNX TP-UART library on the Serial port of Arduino Uno // and with KNX physical address 1.1.5 KnxTpUart knx(&Serial, "1.1.5"); int LED = LED_BUILTIN; void setup() { pinMode(LED, OUTPUT); digitalWrite(LED, LOW); Serial.begin(19200); UCSR0C = UCSR0C | B00100000; // Even Parity knx.uartReset(); knx.addListenGroupAddress("15/0/0"); } void loop() { // nothing in the loop. This example is only to receive telegrams } void serialEvent() { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == TPUART_RESET_INDICATION) { } else if (eType == UNKNOWN) { } else if (eType == 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()); // Here you have the telegram and can do whatever you want if (telegram->getCommand() == KNX_COMMAND_WRITE) { // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion if (target == "15/0/0") { int received_15_0_0 = telegram->getBool(); if (received_15_0_0) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } } } } }
Zum Test mal ein kleines Sende-Sketch geladen:
... und OK, die GA schaltet im Gruppenmonitor abwechseld zwischen 0 und 1Code:// EIN-/AUS-Schalten der GA 15/0/0 (DPT 1) #define GA "15/0/0" #include <KnxTpUart.h> // Bibliothek zur KNX-Anbindung // Initalisierung der KNX TP-UART library ... // ... mit der Physikal. Adresse "1.1.5" KnxTpUart knx(&Serial, "1.1.5"); void setup() { Serial.begin(19200); // init. serielle Schnittstelle UCSR0C = UCSR0C | B00100000; // Parität even knx.uartReset(); // UART initialisieren } void loop() { knx.groupWriteBool(GA, 1); delay (2500); knx.groupWriteBool(GA, 0); delay (2500); }
... also Verkabelung zwischen Arduino und BCU sowie Busverbindung usw. OK
dann noch
1) das erste Sketch auf verschiedener Hardware getestet:
- ich habe zwei verschiedene BCUs versucht
- zwei ProMinis und einen Uno ausprobiert
2) zur Sicherheit noch mal die neueste Version (am Sonntag / 6.3.16) runtergeladen und installiert
3) nochmals diesen Thread durchgelesen (und hoffentlich nichts übersehen ;-)
... und immer das gleiche Ergebniss: senden geht, empfangen nicht
Ich habe leider keinen Mega o.ä. da, um Serial1 zur Fehlersuche zu nutzen. So habe ich ein paar Sketche gebastelt, die mittels LEDs an diversen Ausgängen zeigen, sollen, in welchen Programmteil verzweigt wird. Hierdurch konnte ich herausfinden, dass das Sketch immer in den Zweig "eType == UNKNOWN" läuft, also keine gültigen KNX-Telegramme ankommen.
Sollte / muss ich mir noch einen Mega zum Testen bestellen? (Wollte ich vermeiden, da ich vermute, dass ich nur zum gleichen Ergebnis komme.)
Habt Ihr noch Tipps für mich, wo / wie ich weiter suchen kann (ich habe inzwischen wohl schon einen recht vernebelten Blick auf das Problem)?
Danke schon Mal.
Gruß Marco
Einen Kommentar schreiben:
-
Hallo ThorstenGehrig,
meine kleinen Projekte sind bei mir im Haus verbaut.- Digitales Schlüsselbrett mit I-Button´s
- Übergabe Zeit und Datum vom KNX-Bus an ein Fremdsystem mit Synchronisierungstelegram
- Synchronisierung und Ansteuerung einer Uhr mit 86 LED´s
- Erkennung einer akustischen Meldung zum Starten einer Schaltsequenz auf KNX
- Kopplung zwischen Siemens Logo 0BA7 und KNX
- Kopplung Heizung und KNX über einen eigenwilligen Heizungssteuerungsbus
- u.s.w
Eigentlich hat dein Code alles erst ins rollen gebracht.
Ich hatte schon lange nach einem Code für EIB/KNX auf dem ATmega 328P oder dieser ATmega-Reihe gesucht.
Eben für kleine Projekte, was es nicht zu kaufen gibt und/oder nie hergestellt werden wird.
@ intelligente Haustechnik
Rob Tillaart hat eine Library geschrieben (mit vielen Beispielen), vielleicht hilft dir davon etwas. Link siehe weiter unten.
Hat mir bei meinen I-Button´s auch geholfen.
Code-Schnipsel können ein gute Basis sein, um die Sache aus einem anderen Winkel zu betrachten.Code:http://forum.arduino.cc/index.php?topic=333923
Mit freundlichen Grüßen
Mag GyverZuletzt geändert von Mag Gyver; 02.03.2016, 19:27.
Einen Kommentar schreiben:
-
Hallo Thorsten,
danke für die Info und Codeunterstützung.
Ganz kurz noch dazu: Ist der von mir eingesetzte havesend-Code nicht dazu da, mehrfaches Senden zu verhindern?
Mit der Buslast hast Du natürlich recht, da gehen auch größere Zeitabstände, da man ja nicht wirklich aller 1 sek einen Temperaturwert braucht. Oder wie du schon richtig schreibst, senden bei Änderung...
Punkt 2 erledigt, da ohne mein Zutun der Fehler? von gestern nicht wieder aufgetreten ist
Punkt 3 erledigt
Jens
Einen Kommentar schreiben:
-
Hi,
@MacGyver: super. Genau so habe ich mir open source collaboration vorgestellt: nicht nur hinweise auf Bugs und "Anforderungen" - sondern auch eigene Implementierungen (auch wenn es manchmal Spaß macht sich durch die KNX spec durchzuwühlen...). Ich habe eben erst, beim nochmaligen durchlesen, gesehen das du im vorletzten commit schon neue Telegrammarten hinzugefügt hast (set3ByteDate) - und nun noch 4-Bit Dim-Telegramme.
Super! Verrätst du und noch deine Projekte wo du das Einsetzt?
Außerdem habe ich dir Admin/Commit rechte gegeben... die Code qualität passt und ein rollback ist ja jederzeit möglich.
@Jens: allzuviele deiner Fragen kann ich zwar nicht beantworten - da ich mich nicht mit 1Wire auf dem Arudino beschäftigt habe... trotzdem eine info:
du schreibst "float success = knx.group...." - dabei gibt es auf eiin knx.groupWrite ... nur ein 0 (fail) oder 1 (success) zurück.
Mit float definierst du die variable aber als float - int würde aber reichen.
(hat alles nichts mit deinen anderen Fragen zu tun).
... wenn ich mir den code genauer ansehe macht du das "doppelt gemoppelt" mit dem "haveSend".
Also eigentlich müsste auch statt das:
auch das gehen:Code:haveSent = false; if (!haveSent) { float success = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen haveSent = true; }
da du aber "haveSend" garnicht auswertest - kannst du auch noch einfacher:Code:haveSent = false; if (!haveSent) { haveSent = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen }
Weiterhin - wenn ich den code mal "trocken" lese: ich vermute mal der Loop liest jede sekunde den "nächsten" 1-Wire aus? Und anschließend schaust du ob es Schlafen/Bad/Wohnen ist - und schreibst den Wert auf den Bus.Code:haveSend = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen
Das würde jede Sekunde einen Wert bedeuten ... eine Ziemliche buslast.
Wenn das funktioniert solltest du die Werte speichern und nur bei änderung über x% erneut senden - oder nach Zeit y.
Falls man den "OneWire::crc8 (data, 8) HEX);" kannst du den auch ohne Serial.print ausführen.
Einfach "int test = Serial.print( OneWire::crc8( data, 8), HEX);" verwenden... so müsste der letzte Teil so aussehen:
Last but not least: ein solcher Demo code ist schön - aber bei der "arbeit" die noch vor dir liegt bist er sauber/final ist - macht ein eigener Thread vielleicht sinn :-)Code:for ( i = 0; i < 9; i++) { // 9 bytes data[i] = ds.read(); } dummy = ( OneWire::crc8( data, 8), HEX);
Gruß
Thorsten
Einen Kommentar schreiben:
-
Projektvorstellung 1-wire Sensoren über Arduino am Bus
Hallo,
ich habe mir die diversen 1-wire-Sketche im Netz zu Gemüte geführt und bin zu einer für mich akzeptablen Lösung gekommen, um möglichst viele Temperaturen auf den Bus zu bekommen.
Bauteile
Arduino R3
SIEMENS 5WG1117-2AB12
kleine zusammengelötete Adapterplatine mit 2 Optokopplern, um den Arduino mit dem Bus zu verbinden
Spannungsversorgung Arduino nicht vom Bus, betrachte ich aber nicht als Problem in meinem Fall
Als Sensoren verwende ich aktuell 3 DS18S20 mit einer Auflösung von 0,5K (ich weis, DS18B20 hat eine höhere Auflösung, die sind aber bei einer spontanen Pollinbestellung mal eben zum Testen mitbestellt worden...
Trotz das mein Sketch fleißig Werte auf den Bus bringt, habe ich noch ein paar ungelöste Fragen an die Programmierer unter Euch:
1. Die Adressen der Sensoren werden in ja 8 byte gesendet und empfangen. Der Einfachheit halber habe ich nur die letzten beiden byte verglichen, da sich meine Sensoren dort unterschieden haben. Kann man das so machen, wenn man den Überblick behält oder gibt es auch eine einfachere Lösung?
2. Für den Datenverkehr habe ich Pin 10 verwendet. Trotzdem blinkt die TX-LED munter im Sekundentakt mit, auch wenn ich den KNX-Teil komplett weglasse. Wenn der Serial-Monitor aus ist, dauert es gut 5 Minuten bis die TX-LED dauerhaft leuchtet. Die Temperaturen werden aber weiterhin fleißig gesendet. Wie ist dieses Verhalten zu erklären?
3. Die im gesamten Sketch enthaltenen Serial.print() sind nur zum Anschauen auf dem Serialmonitor der Arduino-Ide gedacht. Dachte ich. Und habe sie alle kaltgestellt, weil ich Sie nur am Anfang benötigt habe. Wenn ich das im Sketch ganz unten befindliche
auch kaltstelle, erhalte ich die tollsten Temperaturwerte. Woran liegt das oder habe ich hier einen Denkfehler?Code:Serial.print( OneWire::crc8( data, 8), HEX);
4. Wo zeigen sich hier die Grenzen hinsichtlich Anzahl der Sensoren und Performance, wenn man bedenkt, daß der Arduino nur diese Aufgabe hat. Ich glaube, Wintermute hatte sich in einem früheren Beitrag negativ dazu geäußert?
Letzte Frage an alle:
Ist diese Projektvorstellung einen eigenen Thread wert, um den Originalthread nicht noch mehr aufzublähen?
Gehören Sketche wie der Nachfolgende nicht genauso in die Rubrik Code-Schnipsel?
Jens
Code:#include <OneWire.h> #include <KnxTpUart.h> // Initialize the KNX TP-UART library on the Serial1 port of Arduino KnxTpUart knx(&Serial, "1.1.199"); // DS18S20 Temperaturchip i/o // DS18B20 Temperaturchip i/o OneWire ds(10); // an pin 10 int haveSent = 0; byte i; byte present = 0; byte data[12]; byte addr[8]; int HighByte, LowByte, TReading, SignBit; float Tc_100, a; void setup() { // inputs/outputs initialisieren // seriellen port starten Serial.begin(19200); UCSR0C = UCSR0C | B00100000; // Even Parity knx.uartReset(); } void loop() { // Sensoren suchen delay(1000); //alle 1sek eine Messung if ( !ds.search(addr)) { // Serial.print("Keine weiteren Addressen.\n"); ds.reset_search(); return; } // Hier stehen die Adressen der Temperatursensoren // Serial.print("Adresse ="); // for( i = 0; i < 8; i++) { // Serial.print(addr[i], DEC); // Serial.print(" "); // } // Serial.println(" "); // if ( OneWire::crc8( addr, 7) != addr[7]) { // Serial.print("CRC nicht gültig!\n"); // return; // } /* Hier wird die Gerätefamilie ermittelt if ( addr[0] == 0x10) { Serial.print("Gerät ist aus der DS18S20 Familie.\n"); } else if ( addr[0] == 0x28) { Serial.print("Gerät ist aus der DS18B20 Familie.\n"); } else { Serial.print("Gerätefamilie nicht erkannt : 0x"); Serial.println(addr[0],HEX); return; } */ // man sollte ein ds.depower() hier machen, aber ein reset tut das auch ds.reset(); ds.select(addr); ds.write(0x44,1); // start Konvertierung, mit power-on am Ende present = ds.reset(); ds.select(addr); ds.write(0xBE); // Wert lesen LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) {// negative //TReading = (TReading ^ 0xffff) + 1; // 2's comp TReading = !TReading + 1; TReading = (TReading * -1); } // Tc_100 = (6 * TReading) + TReading / 4; // mal (100 * 0.0625) oder 6.25 bei ds18B20 // Tc_100 = (TReading*100/2); //bei ds18s20 Tc_100 = (TReading*100/2); if (addr[6] == 0 && addr[7] == 135){ delay (100); haveSent = false; if (!haveSent) { float success = knx.groupWrite2ByteFloat("2/3/2", (Tc_100 / 100)); //Isttemp Schlafen haveSent = true; } } else if (addr[6] == 0 && addr[7] == 2){ delay (100); haveSent = false; if (!haveSent) { float success = knx.groupWrite2ByteFloat("5/3/2", (Tc_100 / 100)); //Isttemp Bad haveSent = true; } } else if (addr[6] == 0 && addr[7] == 252){ delay (100); haveSent = false; if (!haveSent) { float success = knx.groupWrite2ByteFloat("7/3/2", (Tc_100 / 100)); //Isttemp Wohnen haveSent = true; } } // Serial.println(" "); // Serial.print("P="); // Serial.print(present,HEX); // Serial.print(" "); for ( i = 0; i < 9; i++) { // 9 bytes data[i] = ds.read(); // Serial.print(data[i], HEX); // Serial.print(" "); } // Serial.println(" "); // Serial.print("CRC="); Serial.print( OneWire::crc8( data, 8), HEX); // Serial.println(); // Serial.println(" "); }
Einen Kommentar schreiben:
-
Hallo ThorstenGehrig,
habe auf Bitbucket noch einen weiteren pull requests gestartet.
Habe die Schreibfunktionen
und die Antwortfunktionen (Die Antwortfunktionen sind eigentlich nicht notwendig, aber man weis ja nie)Code:bool groupWrite4BitInt(String, int); bool groupWrite4BitDim(String, bool, byte);
sowie die dazugehörigen RückgabefunktionenCode:/* bool groupAnswer4BitInt(String, int); bool groupAnswer4BitDim(String, bool, byte); */
in die Library aufgenommen.Code:int get4BitIntValue(); bool get4BitDirectionValue(); byte get4BitStepsValue();
Aufnahme der neuen Funktionen in Readme.
Anpassung und Prüfung der Examples mit neuem Code.
Dadurch kann man 4 Bit Werte auf den KNX-Bus Senden oder Empfangen. Es stehen zwei grundsätzliche Funktionen zur Verfügung.- Senden + Empfangen + (Antworten) als gemeinsamer 4 Bit Wert bei Eingabe- und Rückgabe
- Senden + Empfangen + (Antworten) Richtung / Schritte getrennt Eingabe- und Rückgabe, jedoch wird immer der komplette 4 Bit Wert gesendet bzw. empfangen
Mit freundlichen Grüßen
Mag Gyver
Einen Kommentar schreiben:
-
Passt schon. Bei mir ist es nicht viel anders ;-)
Einen Kommentar schreiben:
-
Hallo ThorstenGehrig,
das mit den Rechten halte ich persönlich für nicht sinnvoll. Es sollte ja Jemand das noch gegenprüfen oder zumindest überfliegen.
Ich benütze deinen Code als Vorlage für meinen kleinen Projekte, deshalb versuche ich sinnvolle Sachen direkt zu integrieren.
Darüberhinaus könnten noch Andere davon profitieren.
Wie gesagt, Programmieren ist schon eine ganze Weile her. Mache dies nicht beruflich.
Viel Spaß in Barcelona auf der Handymesse !
Mit freundlichen Grüßen
Mag Gyver
Einen Kommentar schreiben:
-
Cheapau.
Danke :-)
Ich kann dir gerne commit rechte geben - die Qualität gefällt mir!
Grüße aus Barcelona (morgen fängt der MWC an)
Einen Kommentar schreiben:


Einen Kommentar schreiben: