Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
int get3ByteWeekdayValue();
int get3ByteHourValue();
int get3ByteMinuteValue();
int get3ByteSecondValue();
int get3ByteDayValue();
int get3ByteMonthValue();
int get3ByteYearValue();
Aufnahme und Änderungen in Readme:
siehe oben und
Code:
bool groupRead(String);
Danach ein bisschen sortieren und gruppieren, damit man beim Lesen keine Augenkrämpfe bekommt.
Anpassung und Prüfung der Examples mit neuem Code.
Mit freundlichen Grüßen
Mag Gyver
Zuletzt geändert von Mag Gyver; 21.02.2016, 18:49.
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.
int get4BitIntValue();
bool get4BitDirectionValue();
byte get4BitStepsValue();
in die Library aufgenommen.
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
Näheres hierzu finden man im ReceiveKNXTelegrams.ino
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
Code:
Serial.print( OneWire::crc8( data, 8), HEX);
auch kaltstelle, erhalte ich die tollsten Temperaturwerte. Woran liegt das oder habe ich hier einen Denkfehler?
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(" ");
}
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:
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.
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:
Code:
for ( i = 0; i < 9; i++) { // 9 bytes
data[i] = ds.read();
}
dummy = ( OneWire::crc8( data, 8), HEX);
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 :-)
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
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
Dinge die man halt nicht mehr vermissen möchte, wenn man Diese erst einmal hat.
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:
http://forum.arduino.cc/index.php?topic=333923
Code-Schnipsel können ein gute Basis sein, um die Sache aus einem anderen Winkel zu betrachten.
Mit freundlichen Grüßen
Mag Gyver
Zuletzt geändert von Mag Gyver; 02.03.2016, 19:27.
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:
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);
}
}
}
}
}
Jetzt sollte ich im ETS-Gruppenmonitor mittels beschreiben der GA 15/0/0 die eingebaute LED schalten können - dies klappt aber nicht !?
Zum Test mal ein kleines Sende-Sketch geladen:
Code:
// 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);
}
... und OK, die GA schaltet im Gruppenmonitor abwechseld zwischen 0 und 1
... 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.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar