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.
Blöde Frage: warum nimmst Du den Wert nicht gleich im Code *100? Dann hast Du gleich den realen Wert im KNX und bauchst dort keine Rechnung mehr machen.
Hi Stefan,
das ist nur ein Problem mit ETS, da ich DPT9 genommen habe. Dann macht ETS ein Float draus. In Edomi oder sonst was, dann den Wert x100 nehmen und schon passts.
Im Code geht es nicht, weil es zwei einzelne Bytes sind, die zusammen ein Int ergeben. Das wollte/muss ich so lassen.
Leider enthielt er einen Fehler. VOC wurde nicht ausgelesen. Die Datenbytes waren die von CO2.
Hmmm...sicher? Bei mir hat der aber 1a funktioniert und es kamen auch unterschiedliche Werte für CO2 und VOC raus...die Register werden ja nacheinander aus dem IAQ ausgelesen. Aber: möglicherweise war es nicht der richtige, ich hatte leider einige Varianten davon :-(
Aber egal, hauptsache es funzt :-)
Blöde Frage: warum nimmst Du den Wert nicht gleich im Code *100? Dann hast Du gleich den realen Wert im KNX und bauchst dort keine Rechnung mehr machen.
Für die Mini-Anhänger unter uns habe ich einen Sketch erstellt. Wenn der Setup stimmt, müssen nur die Adressen eingestellt und an KNX angebunden werden, so sollte es sofort funktionieren. Der Sketch beinhaltet keine Leseanfrage, da mir das Schreiben auf den Bus - bei Änderung der Werte - reicht.
Ausserdem funktioniert der Sketch OHNE iAQ-Lib, da die Lib bei mir heikel war. Danke an Stefan für den Code. Leider enthielt er einen Fehler. VOC wurde nicht ausgelesen. Die Datenbytes waren die von CO2.
Deshalb habe ich hier gespickt. Die LIB finde ich sehr gut und enthält auch noch den Code für einen Kombisensor VOC/BME280. Einfach den Beispielsketch zum Test nehmen.
Code:
// Pro Mini Version
#include "Wire.h"
//KNX
#include <KnxTpUart.h>
#define KNX_PHYSICAL_ADRESS "1.1.2"
#define KNX_WRITE_GROUPADRESS_STATUS "7/0/200"
#define KNX_WRITE_GROUPADRESS_CO2 "7/0/201"
#define KNX_WRITE_GROUPADRESS_TVOC "7/0/202"
#define KNX_MEASSURE_INTERVAL_MS 30000 // Messintervall alle 30 sekunden
#define KNX_SEND_INTERVAL_MS_STATUS 1800000 // senden des Status mindestens alle 30 minuten
#define KNX_SEND_INTERVAL_MS_CO2 1800000 // senden des CO2 Werts mindestens alle 30 minuten
#define KNX_SEND_INTERVAL_MS_TVOC 1800000 // senden des VOC Werts mindestens alle 30 minuten
#define watchdog_time 3600000 // Watchdog = 1 Stunde
const int ledpin = 13;
#define iaqaddress 0x5A
//Initialize LNX
KnxTpUart knx(&Serial, KNX_PHYSICAL_ADRESS);
int32_t iAQ_Res;
uint16_t airQuality;
uint8_t iAQstatus;
uint16_t airTvoc;
unsigned long startTime;
unsigned long watchdog;
unsigned long sendTimeStatus;
unsigned long sendTimeCO2;
unsigned long sendTimeVOC;
uint16_t oldairQuality;
uint8_t oldiAQstatus = 255;
uint16_t oldairTvoc;
#define uns8 uint8_t
#define uns16 uint16_t
#define sn32 int32_t
uns8 data[9];
bool result;
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
//initialize connection to KNX BCU
Serial.begin(19200);
while (!Serial) {
; // wait for serial port to connect
}
UCSR0C = UCSR0C | B00100000;
// Reset UART
knx.uartReset();
startTime = millis();
watchdog = millis();
// VOC Status
// 0 = OK
// 1 = BUSY
// 16 = WARMUP
// 128 = ERROR
}
void loop() {
readRegisters();
delay(1000); //sonst geht immer wieder mal Status auf Busy
// Wenn unterhalb des messintervalls: nichts tun
if (millis() - startTime < KNX_MEASSURE_INTERVAL_MS) {
delay(1);
return;
}
startTime = millis();
// Wenn überhalb des sendeintrvalls
if (millis() - sendTimeStatus > KNX_SEND_INTERVAL_MS_STATUS) {
oldiAQstatus = 255; // undefinierter wert - damit beim nächsten befehl gesendet wird
}
// Wenn überhalb des sendeintrvalls
if (millis() - sendTimeCO2 > KNX_SEND_INTERVAL_MS_CO2) {
oldairQuality = 10; // undefinierter wert - damit beim nächsten befehl gesendet wird
}
// Wenn überhalb des sendeintrvalls
if (millis() - sendTimeVOC > KNX_SEND_INTERVAL_MS_TVOC) {
oldairTvoc = 10; // undefinierter wert - damit beim nächsten befehl gesendet wird
}
// Wenn über Watchdog-time: Fehler auf BUS senden, reboot
if (millis() - watchdog > watchdog_time) {
// result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, 127);
delay(1000);
asm volatile (" jmp 0");
return;
}
// read sensor status
if (iAQstatus != oldiAQstatus) {
oldiAQstatus = iAQstatus;
result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, iAQstatus);
sendTimeStatus = millis(); // define last Status send time
watchdog = millis(); // set Watchdog
//Serial.print("Status: ");
//Serial.println(iAQstatus);
}
// read seansor CO2
if (airQuality >= (oldairQuality + 50) || airQuality <= (oldairQuality - 50)) {
oldairQuality = airQuality;
result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_CO2, airQuality);
sendTimeCO2 = millis(); // define last CO2 send time
watchdog = millis(); // set Watchdog
//Serial.print("CO2: ");
//Serial.println(airQuality);
}
// read seansor TVoc
if (airTvoc >= (oldairTvoc + 30) || airTvoc <= (oldairTvoc - 30)) {
oldairTvoc = airTvoc;
result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_TVOC, airTvoc);
sendTimeVOC = millis(); // define last VOC send time
watchdog = millis(); // set Watchdog
//Serial.print("VOC: ");
//Serial.println(airTvoc);
}
// Serial.print("Widerstand: : ");
// Serial.println(iAQ_Res);
}
void readRegisters() {
int i = 0;
Wire.requestFrom(iaqaddress, 9);
while(Wire.available()) {
data[i] = Wire.read();
i++;
}
airQuality = (uns16)((data[0] << 8) + data[1]);
iAQstatus = data[2];
//iAQ_Res = (sn32)(data[3] << 24) + (sn32)(data[4] << 16) + (sn32)(data[5] << 8) + (sn32)data[6]; //Widerstand in OHM
airTvoc = (uns16)(data[7] << 8) + (uns16)(data[8]);
}
Achja, wenn alles passt, dann sieht das so aus:
Die Werte x100 und alles ist gut.
Ich danke EUCH ! War halt ein Problem, mit dem man nicht rechnet...
Bin vor allem sehr happy, weil nichts kaputt gegangen ist. Ich habe gefühlt 100mal programmiert und umgesteckt.
Der Sketch hat nur noch 20 Zeilen. Ich bau das wieder um auf "Version Thorsten" und stell ihn hier rein.
Meine Platine war aber damals beim Test bei Alex und da hat alles sauber funktioniert, da war auch der serielle 1k drauf. Also daran liegts nicht.
Beim TPUART2 sind es übrigens 0,7*VIF, dass wären dann 3,5V als minimaler Pegel (allerdings im worst case). Darunter steht im Datenblatt aber auch VIF/2, das wären dann 2,5V und dann kommt die Hysterese drauf, die zwischen 0,25V...1V betragen kann. Egal, jedenfalls funktionieren die 3,3V minus Spannungsabfall am 1k bisher ohne Probleme.
Ihr werdet es nicht glauben, aber ich habe den Fehler gefunden. Ich konnte es nicht lassen und habe den Sketch immer weiter reduziert. -> immer gleiches Problem
Dann habe ich IAQ2000 iaq; VOR KnxTpUart knx(&Serial, KNX_PHYSICAL_ADRESS); gesetzt -> BINGO
Bin zwar heilfroh, das mein Setup von Anfang gepasst hat, aber erklären kann ich mir das nicht. Der Sketch ist von Thorsten und bei ihm funktioniert er ja.
Zuletzt geändert von WagoKlemme; 05.06.2017, 18:20.
ehrlich gesagt glaube ich inzwischen nicht mehr an ein Problem mit dem Spannungsteiler. Der Status und CO2 kommen einwandfrei, nur TVOC nicht. Wenn ich TVOC zuerst auslese, kommt gar nix mehr, auch CO2 und Status nicht. Deshalb habe ich den Sketch, in gefühlt 10 Varianten getestet. Immer das gleiche Ergebnis.
Wenn der Spannungsteiler nicht passen würde, kämen doch auch CO2 und Status nicht stabil. So meine Logik. Vielleicht ein Timeout-Problem.
Du hattest doch mal geschrieben, manche Minis stören den Busverkehr. Passt mein Problem zu deinen Erkenntnissen ? Zwei verschiedene Minis verhalten sich jedenfalls gleich.
Hatte ich auch erst gedacht, aber:
Auch beim minimalen internen Pulldown am BCU (150k) und seriellem 1k fallen an diesem lediglich 22mV ab, das dürfte eigentlich nichts ausmachen (zulässig sind 0,8*3,3V=2,6V als minimaler High-Pegel, also "meilenweit" weg). Allerdings steht im Datenblatt des BCU nichts über den gesamten Eingangswiderstand und ob da ggf. noch Kapazitäten im Spiel sind.
EDIT: Rechnung oben stimmt nicht...siehe Post #177. EDITOFF
Ich glaube eher an einen Fehler im Code oder bei den Arduino-Clones ist was faul...die Übertragung findet ja anfangs sauber statt und da wird die serielle Schnittstelle ja schon gefordert in Form von zig hundert Pegeländerungen. Wenn das einmal ohne jegliche Fehler funktioniert, müssen die Pegel i.O. sein.
Nur zur Sicherheit: den FTDI hast Du aber wieder abgezogen?
WagoKlemme, lass doch den Schutzwiderstand zwischen TXD ARDUINO und RXD BCU für den Test weg oder minimiere diesen auf den Wert den dreamy1 vorgeschlagen hat. Anbei ein paar Details zum BCU PIN RXD.
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.
Einen Kommentar schreiben: