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

    #91
    Hi,
    alte männer soll man nicht Löten lassen!
    Ich hab den Pegelwandler 180 Grad gedreht verwendet - damit passte natürlich nichts mehr.
    Kein Wunder das nichts ging - und ein wunder das es noch geht.
    Jetzt läuft alles wie es soll. Die IAQ2000-Library hatte noch einen Bug - den ich aber korrigiert habe. Das commit ist auf Github und vermutlich morgen bestätigt.
    Hier mein Link: https://github.com/thorsten-gehrig/i2cdevlib

    Jetzt muss ich meinen Code noch verschöndern - und vermutlich alles nochmal sauber aufbauen (derzeit sieht das "übel" aus).

    Gruß
    Thorsten (ich muss zum Optiker mir ne Lesebrille besorgen)

    Nachtrag: noch ein BUG oder Programmierfehler?
    Wenn ich mir die Werte Seriell ausgeben lasse sieht alles gut aus - aber auf dem Bus kommen falsche werte :-(
    Code:
     uint16_t airQuality;
    airQuality = iaq.getIaqpred();
      result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_CO2, airQuality);
     Serial.print("CO2 = ");
     Serial.print(airQuality);
    Laut Doku sind Pred und Tvoc ja beides uint16.
    Wie geschrieben werden mir seriell gültige Werte ausgegeben.
    Auf dem HS habe ich 16 Bit / EIS10 (0-65535) angegeben... die Werte sind aber nicht die selben...
    Hier ein eibd:
    2015-11-17 21:13:52.326,A_GroupValue_Write,1.1.77,7/0/202,1E 27,,,,0,low,6,T_DATA_XXX_REQ,0
    2015-11-17 21:14:22.343,A_GroupValue_Write,1.1.77,7/0/202,1E 1B,,,,0,low,6,T_DATA_XXX_REQ,0

    Ich vermute mal "knx.groupWrite2ByteInt" passt nicht? Ist ja meine Lib - aber ich habe schon lange nicht mehr drann geschraubt. Eigentlich ist "2 byte Int (DTP 7 - 0…65 535])" und DTP8 (-32768 bis +32768) == EIS10.... arg.

    Ein simples "knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_ CO2, 450);" zeit mir am Homeserver aber keine 450 an....

    Gruß
    Thorsten
    Zuletzt geändert von ThorstenGehrig; 17.11.2015, 21:34.

    Kommentar


      #92
      Gefunden und Gefixt!
      Die (zumindest meine alte) Arduino Lib hatte die groupWrite2ByteInt nicht richtig implementiert.
      Meine Lib ist nun gefixt - die Werte passen jetzt :-)

      Kommentar


        #93
        Hi Thorsten,

        freut mich dass es jetzt läuft!
        Viele Grüße,
        Stefan

        DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

        Kommentar


          #94
          So - der Sensor läuft und liefert schön Werte. Letzte Nacht mal den "Luftverbrauch" im Schlafzimmer gemessen - liefert eine schöne Kurfe (siehe Anhang).
          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;
                }
              }
            }
          }
          Mann kann sicherlich erkennen das ich ein "copy&paste programmierer" bin... aber es läuft.
          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)) {
          Gruß
          Thorsten
          Angehängte Dateien
          Zuletzt geändert von ThorstenGehrig; 19.11.2015, 20:51.

          Kommentar


            #95
            Fixe 10 gehen sicher. Besser wäre das ganze relativ anzugeben, 10% oder so. Machen die MDT Lichtsensoren bei mir in den PMs auch. Die Senden bei einer Änderung von (ist einstellbar) 10%.

            Kommentar


              #96
              Warum sollen % besser sein als ein fixer wert?
              Über die 10 kann man a "diskutieren" - je nach erfahrungswerten.... aber ich finde das sinninger als 5% - von 2000 oder von 450 sind das doch recht unterschiedliche differenzen bis man wieder was sendet...

              Kommentar


                #97
                Geschmackssache.

                Bei 2000 könnte eine Änderung von 10 weniger interessant sein/wichtig sein als sie's bei 450 ist. Und 10 bei 2000 könnte u.U. auch ein zu häufiges, unnötiges Senden auslösen.
                Hab da mit dem VOC noch nicht ausreichend Erfahrungswerte wie stark der mit seinen Messwerten umherzuckelt. Sagte ja nur dass andere KNX Geräte da eine %-Einstellung haben.

                Kommentar


                  #98
                  @Thorsten:

                  Welche Werte vom AMS-Sensor nimmst Du denn als "Luftgüteindikator"?

                  Ich bin da noch nicht wirklich schlau draus geworden...der AMS liefert ja sowohl CO2- als auch TVOC-äquivalente Werte...für die CO2-Werte gibt's schöne Tabellen, wieviel ppm denn nun gut oder schlecht sind. Allerdings sind die TVOC-Werte viel interessanter, da diese viel empfindlicher auf "Gerüche" sensibilisieren. In den Schaubildern gibt es nur dort entsprechende "Peaks", wenn man den Sensor z.B. auf einer Toilette verbaut oder wenn Zigarettenrauch im Spiel ist.

                  Nur...absolute Werte bei TVOC als Indikator für gut/schlecht finde ich nirgends.

                  Hast Du da etwas?

                  VOC.jpg
                  Viele Grüße,
                  Stefan

                  DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                  Kommentar


                    #99
                    VOC ppm .....

                    450-1000 = grün

                    1001-1500 = orange

                    >1500 = rot

                    So macht es velux mit dem Raumluft Fühler. Und das deckt sich auch mit meinen Erfahrungswerten welche Luft wie gut ist.

                    Tvoc hatte ich mir auch angeschaut. Aber so Kurven wie in deiner Grafik hab ich nicht hin bekommen.
                    Zuletzt geändert von tuxedo; 07.01.2016, 22:51.

                    Kommentar


                      Das wären wohl die CO2-Werte...sowas in der Art habe ich auch gefunden.

                      Der AMS liefert aber folgendes über I2C:

                      CO2: 450-2000 ppm
                      TVOC: 125-600 ppb

                      Nimmt man die (üblichen) CO2-Werte, würde man die Peaks der VOC nicht mitbekommen....in irgendeinem Datenblatt eines IAQ habe ich den Hinweis gefunden, dass die Umrechnung zwischen den Werten in der Firmware des Sensors verankert ist. Beim "Anpusten" des Sensors merke ich auch, dass die beiden Werte unterschiedlich schnell wieder auf normale Werte herunterkommen...

                      Viele Grüße,
                      Stefan

                      DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                      Kommentar


                        So ist es. Wenn der tvoc wert tatsächlich feinfühliger ist, ist die Frage ob das was bringt? Gehts nur um die Anzeige? Dann vielleicht ja. Gehts um eine Regelung: dann vielleicht nein. Vorschlag: überlasse es dem Anwender wie er es haben möchte und richte 3-5 schwellwert-ko's ein die man parametrisieren kann. Jeweils für co2 equivalent und tvoc.

                        Kommentar


                          Muss die Messwerte mal ein paar Tage beobachten...ansonsten gebe ich Dir Recht...erstmal alle Werte "sammeln", auswerten kann man immer noch :-)





                          Viele Grüße,
                          Stefan

                          DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

                          Kommentar


                            Zitat von tuxedo Beitrag anzeigen
                            Der iaq ist mit seinen 32EUR + Versand ja recht teuer.

                            [update]
                            *gefunden*
                            http://www.seeedstudio.com/depot/Gro...or-p-1065.html

                            Knapp 10EUR. Wurde aber eingestellt. Ist vielleicht nicht ganz so präzise wie der IAQ, aber deutlich günstiger. Müsste mal schauen ob es einen Nachfolger gibt.

                            ich habe in einem anderen Shop gefunden: 10,60€ + 3,50 Versand

                            Kommentar


                              Hi,
                              welchen Shop hast du den? Hinweiße? Links?
                              Gruß
                              Thorsten

                              Kommentar


                                Übrigens: zur Diskussion CO2 oder VOC:
                                Ich schreibe die Werte schon eine ganze weile mit - und die Garphen zeigen keine Unterschiede in der Praxis - beide Kurven verlaufen ziemlich Identisch.

                                Kommentar

                                Lädt...
                                X