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.
Achja, wenn alles passt, dann sieht das so aus:
Die Werte x100 und alles ist gut.
2017-06-06 19_44_12-ETS5™ - Test Jung.png
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]); }
Die Werte x100 und alles ist gut.
2017-06-06 19_44_12-ETS5™ - Test Jung.png
Kommentar