Ankündigung

Einklappen
Keine Ankündigung bisher.

Arduino-Sensor für CO² bzw. VOC

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • WagoKlemme
    antwortet
    Zitat von dreamy1 Beitrag anzeigen
    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.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Zitat von WagoKlemme Beitrag anzeigen
    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.
    Zuletzt geändert von dreamy1; 06.06.2017, 21:05.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Hallo Armin,

    saugeil...danke fürs Teilen!

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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.

    2017-06-06 19_44_12-ETS5™ - Test Jung.png
    Zuletzt geändert von WagoKlemme; 06.06.2017, 18:46.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    WagoKlemme,

    probieren geht eben über studieren!

    Herzlichen Glückwunsch und noch wie Spaß damit!
    Zuletzt geändert von Mag Gyver; 05.06.2017, 18:40.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    @Armin: klasse! Super, dass Du es hinbekommen hast!

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Mag Gyver : Ui...das stimmt natürlich :-)

    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.

    Platinen habe ich noch genug da, einfach PN :-)
    Zuletzt geändert von dreamy1; 05.06.2017, 18:39.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    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

    2017-06-05 19_17_15-ETS5™ - Test Jung.png

    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.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    dreamy1,

    nur so zur Information.

    Die BCU von SIEMENS arbeiten standartgemäß mit 5Volt, daher stimmt deine Rechnung nicht ganz.

    Aber Interesse hätte ich auch, wenn du die ein oder andere Platine übrig hast.

    WagoKlemme,

    wenn du den Sketch umstellst und dann mehr Probleme hast. Dann ist es doch eher wahrscheinlicher den Fehler bzw. das Fehlverhalten hier zu Suchen.

    Zuletzt geändert von Mag Gyver; 05.06.2017, 18:22.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    dreamy1
    klar.

    Ich warte lieber auf deine Platinen. Nicht dass ich noch mit der dauernden Umsteckerei die BCU oder der VOC hops geht.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Hallo Mac Gyver,

    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.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    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?
    Zuletzt geändert von dreamy1; 05.06.2017, 18:41.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    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.

    TPUARTRXPIN.PNG


    Datenblätter des IC innerhalb der BCU :

    http://www.opternus.com/de/siemens/k...t-fze1066.html

    und/oder

    http://www.opternus.com/de/siemens/k...eneration.html
    Zuletzt geändert von Mag Gyver; 05.06.2017, 16:52.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Den 1k habe ich durch einen 680 auf RX Siemens und den 1k auf TX und 2k auf GND durch 680 und 1k ersetzt.
    Ergebnis ist das Gleiche:

    2017-06-04 18_56_07-ETS5™ - Test Jung.png
    Statt dem TVoc Wert kommt immer Status 2.
    Es könnte also das Signal am Ende der Schleife (Tvoc) verdaddelt werden.

    Einen Kommentar schreiben:

Lädt...
X