Man kann schön erkennen dass ich um 22 Uhr ins Bett bin - ab ca. 6Uhr keiner mehr auf der Etage war - und ab 8 Uhr die KWL die Luft komplett ausgetauscht hat.
Interessant ist auch am ende - heute 19 Uhr - sind die Kinder auf der Etage und due Luftqualität ist bis ins Schlafzimmer "beeinträchtigt".
Mal schauen wie ich damit die KWL steuern kann. Ich werde auch mal versuchen einen VOC in die KWL Zuluft reinzuhängen um schlechte Luft von außen zu detektieren (Nachtbar Grillt etc.)
Zum Lesen gebe ich auch mal meinen aktzellen Code.
Hier wird sowohl periodisch gesendet (derzeit alle 30 Sekunden) wenn sich der Wert geändert hat - als auch das Lesen über KNX unterstützt.
Ich hab noch einige "delay" zwischen den Lesebefehlen zur sicherheit eingebaut...
Code:
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#include "Wire.h"
// I2Cdev and IAQ2000 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"
#include "IAQ2000.h"
//KNX
#include <KnxTpUart.h>
#define KNX_PHYSICAL_ADRESS "1.1.77"
#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_SEND_INTERVAL_MS 30000
KnxTpUart knx(&Serial, KNX_PHYSICAL_ADRESS);
// class default I2C address is 0x5A
// specific I2C addresses may be passed as a parameter here
// but this device only supports one I2C address (0x5A)
IAQ2000 iaq;
uint16_t airQuality;
uint8_t iAQstatus;
uint16_t airTvoc;
unsigned long startTime;
uint16_t oldairQuality;
uint8_t oldiAQstatus;
uint16_t oldairTvoc;
bool result;
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
Serial.begin(19200);
while (!Serial) {
; // wait for serial port to connect
}
UCSR0C = UCSR0C | B00100000;
// Reset UART
knx.uartReset();
startTime = millis();
delay(1000);
iaq.initialize();
// test of IAQ. Send a to STATUS-KO a 2 if all is fine - and a 3 if the iaq does not work
iaq.testConnection() ? result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, 2) : result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, 3);
delay(1000);
// Register Addresses for read-requests
knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_STATUS);
knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_CO2);
knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_TVOC);
}
void loop() {
if (abs(millis() - startTime) < KNX_SEND_INTERVAL_MS) {
delay(1);
return;
}
startTime = millis();
// read sensor status
iAQstatus = iaq.getIaqstatus();
if (iAQstatus != oldiAQstatus) {
result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, iAQstatus);
}
oldiAQstatus = iAQstatus;
delay(1000);
// read seansor CO2
airQuality = iaq.getIaqpred();
if (airQuality != oldairQuality) {
result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_CO2, airQuality);
}
oldairQuality = airQuality;
delay(1000);
// read seansor TVoc
airTvoc = iaq.getIaqtvoc();
if (airTvoc != oldairTvoc) {
result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_TVOC, airTvoc);
}
oldairTvoc = airTvoc;
}
void serialEvent() {
//Get Serial Event
KnxTpUartSerialEventType eType = knx.serialEvent();
//Check Serial Event
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());
//result = knx.groupWrite14ByteText("0/0/130", target );
// Auswertung der Gruppenadresse des empfangenen Telegrammes und Zwischenspeicherung in Variable target
if (telegram->getCommand() == KNX_COMMAND_READ) {
if (target == KNX_WRITE_GROUPADRESS_TVOC) {
airQuality = iaq.getIaqpred();
result = knx.groupAnswer2ByteInt(KNX_WRITE_GROUPADRESS_TVOC, airQuality);
oldairTvoc = airTvoc;
}
if (target == KNX_WRITE_GROUPADRESS_CO2) {
airTvoc = iaq.getIaqtvoc();
result = knx.groupAnswer2ByteInt(KNX_WRITE_GROUPADRESS_CO2, airTvoc);
oldairQuality = airQuality;
}
if (target == KNX_WRITE_GROUPADRESS_STATUS) {
iAQstatus = iaq.getIaqstatus();
result = knx.groupAnswer1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, iAQstatus);
oldiAQstatus = iAQstatus;
}
}
}
}
Danke an alle Code-Spender :-)
Nachtrag: was man noch ändern könnte/sollte: bisher wird alle "send-intervall"-Sekunden die Werte gesendet - wenn Sie sich denn verändert haben.
Manchmal springt der CO2 oder VOC-Wert nur +-1... das muss man nicht unbedigt senden.
Daher könnte man auch nur senden wenn die Variablen mehr als 10 kleiner oder gößer sind...
Müsste so gehen, oder?
Code:
if ((airQuality >= oldairQuality+10) || (airQuality <= oldairQuality-10)) {
Thorsten

Einen Kommentar schreiben: