VOC-Mischgas-Sensor / Luftqualität + Feuchte- und Temperatursensor

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • MightyLox
    LoxBus Spammer
    • 22.10.2015
    • 208

    #16
    Hm, mein Kamin arbeitet raumluftunabhängig und daher brauche ich den CO Sensor eigentlich nicht. Da wäre doch ein selbst gebauter CO Sensor besser als keiner.

    hismastersvoice
    Hast du Erfahrung mit digitalen CO und/oder Methan Sensoren?

    Zum Humidity HTU21D Sensor habe ich folgendes gefunden:

    Connections: Breakout board to Arduino
    • VCC → 3.3V
    • GND → GND
    • SDA → A4
    • SCL → A5

    Quelle: https://learn.sparkfun.com/tutorials.../hooking-it-up
    Die Seite scheint insgesamt sehr interessant zu sein, gerade bzgl. Arduino und Sensoren.

    Kann ich diesen Sensor parallel zum CO2 Sensor an SDA/SDL betreiben? Dazu:

    Disabling I2C Resistors

    There are two 4.7k resistors on the breakout board that pull-up the SDA and SCL lines. If you’ve got other devices on the I2C bus you may need to disable the on-board resistors.

    Also wenn mit 2 Sensoren am I2C Bus, dann keine Pullups.


    Ich werde auf jeden Fall mal CAT7 Kabel in die betroffenen Zimmer zusätzlich ziehen, dann kann man später noch nachrüsten.

    Grüße
    Martin
    Zuletzt geändert von MightyLox; 26.11.2015, 08:52.
    Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
    Loxone: 1x MS, 2x Ext, 1x DMX
    KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
    Licht: DMX LED Beleuchtung (24V/230V)
    Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
    Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

    Kommentar


    • MightyLox
      MightyLox kommentierte
      Kommentar bearbeiten
      Dazu noch folgendes:
      Note: The 330Ω resistors are used in line withe I2C lines since we are using a 5V Arduino to talk to a 3.3V device.

      Sollte man das immer machen? Der Nano ist ja auch ein 5V Arduino.

      Beim MPL3115A2 :
      Note: This breakout board has built-in 1kΩ pull up resistors for I2C communications. If you’re hooking up multiple I2C devices on the same bus, you may need to disable the other resistors on the bus.

      Da keine Jumper auf dem Board, Widerstände brücken? Oder meint das die 4,7k Pullups?
  • Gast

    #17
    Hi
    @MightlyLox: es gibt 100 Beispiele wie sensoren angeschlossen werden. Üblich ist Plus/minus und SDA/SCL oder plus/minus und einen "general I/O Pin".
    Die Librarys üblichweiße sagen "sensor angeschlossen an pin xyz" - und fertig.

    @hismastervoice: zuerst scheibst du "wer Datenblätter lesen kann ist klar im Vorteil" - dann schreibst du "steht da nicht... das ist ein wenig in konsistent.
    Dazu hast Du im WIKI die VOC-Grafiken (z.B. Zigrattenrauch geht über VOC besser als über CO2) - argumentierst aber das du VOC nicht nutzt. Das könnte man in dem WIKI-Artikel sauberer Darstellen ;-)
    Nichtsdestotrotz: ich habe auch vom WIKI-Artikel profitiert. Daher ein dankeschön.

    Gruß
    Thorsten

    Kommentar

    • hismastersvoice
      Supermoderator
      • 25.08.2015
      • 7318

      #18
      Ist es nicht... Grund...
      Wird nicht exlizit eine Spannung für I2C angegeben nehme ich immer die 5V des Arduino, bis jetzt ohne Probleme
      Es gibt auch Datenblätter die die Spannung des I2C Bus angeben.

      Versuch mal ein Parfüm in der Nähe des Sonsors zu versprühen, du wirst sehen das der CO2 Wert steigt.
      Jetzt fragt man sich was Parfüm mit CO2 zu tun hat? Nichts, aber da der Sensor CO2 aus den VOCs berechnet steigt der Wert, und das ist genau so bei Zigarettenrauch usw.
      Es ist also richtig was ich im Wiki geschrieben habe.

      CO2 nutze ich da es im Inet überall Bewertungen gibt die dem Laien sagen wie gut oder schlecht die Luft ist.
      Ist viel einfacher zu verstehen.

      Du siehst also egal ob du nun VOC oder CO2 nutzen willst spielt keine Rolle.
      Kein Support per PN!

      Kommentar

      • MightyLox
        LoxBus Spammer
        • 22.10.2015
        • 208

        #19
        Zitat von thorstengehrig
        @MightlyLox: es gibt 100 Beispiele wie sensoren angeschlossen werden. Üblich ist Plus/minus und SDA/SCL oder plus/minus und einen "general I/O Pin".
        Die Librarys üblichweiße sagen "sensor angeschlossen an pin xyz" - und fertig.
        Es wäre schön, Antworten auf meine Frage in etwas konstruktiver Form zu erhalten. Das alles irgendwo steht, weiß man seit etlichen hundert Jahren.
        Ich denke, die Fragen waren konkret, daher hätte ich auch gerne konkrete Antworten. Oder eben keine.

        Grüße
        Martin
        Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
        Loxone: 1x MS, 2x Ext, 1x DMX
        KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
        Licht: DMX LED Beleuchtung (24V/230V)
        Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
        Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

        Kommentar

        • Gast

          #20
          Es gibt eben nicht "eine Antwort" - wenn der Arduino im schnitt 14 digitale I/O und 6 analoge I/O ports hat. Das ist so ähnlich als wenn du Fragst in welche Steckdose muss ich meinen Föhn anschließen - bei einer 6-fach Steckdose.
          Die Antwort ist "in irgendeine die Frei ist". Allerdings musst du beim Arduino noch Angeben an welcher Stelle man den Sensor angegeben hat.
          Beispiel: 1-wire: http://playground.arduino.cc/Learning/OneWire-DE
          Dort wird initalisiert mit "OneWire ds(10); // an pin 10" - wenn man seinen 1-Wire an PIN 10 angeschlossen hat.
          Hat man ihn an 11 muss das eben OneWire ds(11); sein - wenn man an bin 8 ist eben OneWire ds(8);

          Hat man sensoren die I2C "sprechen" muss man an SDA/SCL ran - hier die PIN-Definitionen: https://www.arduino.cc/en/Reference/Wire

          Hat man mehrere I2C sensoren - spricht man diese als Bus an. Dazu muss man die Addressen "kennen" und ansprechen.
          Hier ein Beispiel: http://www.learningaboutelectronics....controller.php

          Empfehlung: schau die mal diese Tutorial-Videos an: https://www.youtube.com/channel/UCzw...mfvriHDXYo1nBw

          Viel Erfolg.

          Gruß
          Thorsten

          Kommentar


          • MightyLox
            MightyLox kommentierte
            Kommentar bearbeiten
            @Thorsten
            Danke, damit kann ich schon was anfangen.
        • hismastersvoice
          Supermoderator
          • 25.08.2015
          • 7318

          #21
          Hab jetzt Software umgeschrieben... Ist gerade im Testlauf...

          Es wird jetzt CO2 / VOC / Status per UDP an Loxone übermittelt.

          Wenn alles OK ist werde ich am Sonntag das Wiki ändern.
          Kein Support per PN!

          Kommentar

          • MightyLox
            LoxBus Spammer
            • 22.10.2015
            • 208

            #22
            Zitat von hismastersvoice
            Wenn alles OK ist werde ich am Sonntag das Wiki ändern.
            Hat's geklappt? Spricht eigentlich etwas dagegen, gleich einen 3.3V Arduino Nano zu nehmen?
            Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
            Loxone: 1x MS, 2x Ext, 1x DMX
            KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
            Licht: DMX LED Beleuchtung (24V/230V)
            Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
            Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

            Kommentar

            • hismastersvoice
              Supermoderator
              • 25.08.2015
              • 7318

              #23
              Ja hat geklappt, nur momentan wenig Zeit...
              Ich versuche ob ich es heute Abend noch schaffe.

              Es spricht nichts dagegen ich nutze die 3,3V vom Nano
              Kein Support per PN!

              Kommentar

              • MightyLox
                LoxBus Spammer
                • 22.10.2015
                • 208

                #24
                Reichen der 3.3V Ausgang auch zum Betrieb von 2 Sensoren? Der HTU21D braucht zum Heizen? 5.5mW. Muss ich mal recherchieren.
                Ich denke, ich nehme auch den normalen Nano (bei 2.89€) und teste da jetzt einfach mal. Wenn er abraucht... shit happens. Den beiden Sensoren wird hoffentlich nichts passieren. ;-)
                Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
                Loxone: 1x MS, 2x Ext, 1x DMX
                KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
                Licht: DMX LED Beleuchtung (24V/230V)
                Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
                Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

                Kommentar

                • hismastersvoice
                  Supermoderator
                  • 25.08.2015
                  • 7318

                  #25
                  150mA kann die 3.3V
                  900mA bei 5V (externes Netzteil, USB nur 400mA)
                  Kein Support per PN!

                  Kommentar


                  • MightyLox
                    MightyLox kommentierte
                    Kommentar bearbeiten
                    Vielen Dank für's Nachsehen. Das sollte ja locker reichen.
                • Gast

                  #26
                  Hallo Leute,
                  ich möchte ein Problem mit euch teilen.
                  Ich habe die Aufbauanleitung aus dem Wiki haarklein umgesetzt.

                  Leider bekam ich dort per UDP an Loxone immer unplausible Werte gesendet diese änderten sich aber auch nicht.

                  Daraufhin habe ich den Aufbau immer weiter verschlankt um den Fehler zu finden. Nichts führte zum Erfolg.

                  Den Sensor habe ich von Mouser
                  http://www.mouser.de/ProductDetail/a...H3NEdlLQ%3D%3D

                  Ich nutze Ardurino 1.6.4 aber auch bei den neusten Versionen gab es diese Schwierigkeiten.
                  Betriebssystem WinXP
                  Ausprobiert habe ich Arduino Nano und auch UNO.

                  Die Libraries habe ich von Github.

                  Dort die ZIP-Datei runtergeladen und die Unterordner „IAQ2000“ und „I2Cdev“ bei ..\EigeneDateien\Arduino\libraries\ hineinkopiert.

                  Zur Fehlereingrenzung habe ich dann mit der Testdatei weitergearbeitet.
                  Genauer die ..\i2cdevlibmaster\Arduino\IAQ2000\examples\IAQ200 0\IAQ2000.ino ausprobiert.

                  Dort wird eine Messung mit der LED13 angezeigt und die Werte über den SerialMonitor angezeigt.
                  Im angefügten Screenshot sieht man das die Werte außerhalb der Toleranz liegen und sich auch über einen längeren Zeitraum nicht verändern.
                  Klicke auf die Grafik für eine vergrößerte Ansicht

Name: IAQ2000_Status.png
Ansichten: 509
Größe: 10,4 KB
ID: 27594

                  Habt Ihr eine Idee warum ich immer einen falschen Wert bekomme und dieser sich auch nicht ändert?
                  Auch wundert mich die Meldung Status = OK obwohl da offensichtlich etwas total falsch läuft.

                  Kommentar

                  • Gast

                    #27
                    Hallo Leute,
                    in meinem vorherigen Post habe ich mein Problem mit dem VOC-Sensor beschrieben. Nach langem Suchen konnte ich die Ursache beheben.

                    Im LoxWiki ist die Verkabelung falsch beschrieben.
                    IAQ-Core --> Arduino [FALSCH]
                    Pin6 --> 3,3V / Pin3 --> GND / Pin2 --> Analog4(SCL) / Pin4 --> Analog5(SDA)

                    IAQ-Core --> Arduino [RICHTIG]
                    Pin6 --> 3,3V / Pin3 --> GND / Pin2 --> Analog5(SCL) / Pin4 --> Analog4(SDA)

                    Aufgefallen ist mir das beim Adressen-Scan des I2C-Bus.

                    Desweiteren gibt es noch eine Abweichung in der Beipiel_Luftgüte.ino.
                    Dort wird zum Auslesen des Sensors der Befehl airQuality = iaq.getIaq(); verwendet.
                    Mit dem Befehl airQuality = iaq.getIaqtvoc(); kommt man weiter.
                    Ich kenne mich in Ardurino nicht besonders gut aus, aber vermutlich kommt diese Abweichung durch eine Änderung in der library. Deshalb wäre mein Vorschlag die dazugehörige (veraltete) Library ans Wiki anzuhängen.

                    Angehängt habe ich noch meine Logfile mit den VOC-Werten aus ein paar Tagen (falls es jemanden interessiert).
                    Angehängte Dateien

                    Kommentar

                    • hismastersvoice
                      Supermoderator
                      • 25.08.2015
                      • 7318

                      #28
                      Gast

                      Hast du recht... Habe es im Wiki geändert.
                      Habe meine Sensoren alle so angeschlossen, aber war wohl ein Schreibfehler. Danke für den Hinweis.

                      Du hast die neuste Version der Library geholt, dort sind einige Dinge anders.
                      Habe auch schon ein Programm dafür geschrieben und werde es bei Gelegeinheit hochladen.
                      Der größte Unterschied ist das nun VOC / CO2 und der Status zurück gegeben werden.

                      Wenn du die Lib aus dem Wiki nimmt geht es auch mit dem Code aus dem Wiki.

                      Mein neuer Code sieht so aus....

                      Wenn der Arduino per UDP 000 empfängt sendet er einen Wert an den MS zurück, somit kann man auch den Abfrage-Zyklus steuern.

                      uint16_t iAQCO2;
                      uint8_t iAQSTATUS;
                      uint16_t iAQVOC;

                      Code:
                      #include <SPI.h>
                      #include <Ethernet.h>
                      #include <EthernetUdp.h>
                      #include "Wire.h"
                      #include <I2Cdev.h>
                      #include <IAQ2000.h>
                      
                      IAQ2000 iaq;
                      
                      uint16_t iAQCO2;
                      uint8_t iAQSTATUS;
                      uint16_t iAQVOC;
                      
                      // Netzwerk-Einstellungen
                      // MAC-Adresse darf nur einmal im Netz vohanden sein
                      // Fuer jedes Geraet aendern!!
                      byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
                      
                      // Port fur Daten-Empfang
                      unsigned int localPort = 7006;
                      
                      // IP Adresse Loxone-MiniServer
                      IPAddress RecipientIP(192, XXX, XXX, XXX);
                      // Port Loxone-MiniServer... An diesen Port werden die Daten gesendet
                      unsigned int RecipientPort = 7006;
                      
                      // Buffer fuer Daten-Empfang
                      char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
                      
                      // Start der UDP-Instanz
                      EthernetUDP Udp;
                      
                      void setup() {
                        Wire.begin();
                        Serial.begin(9600);
                      
                        if (!Ethernet.begin(mac)) Serial.println("dhcp failed");
                        else {
                          Serial.print("IP is ");
                          Serial.println(Ethernet.localIP());
                        }
                        Udp.begin(localPort); // Start UDP
                        SPI.begin();
                        sendUDP("Raumluft - aktiv"); // send UDP Ready
                      
                        // initialize device
                        Serial.println("Initialisierung des Sensor...");
                        iaq.initialize();
                      
                        // verify connection
                        Serial.println("Verbindung zum Sensor testen...");
                        Serial.println(iaq.testConnection() ? "iAQ-2000 erfolgreich verbunden" : "iAQ-2000 Fehler bei der Verbindung");
                      
                        //Serial leeren
                        clearAll();
                      
                        Serial.println("Warte auf UDP-Befehl");
                      
                      }
                      
                      void loop() {
                      
                        // schaut on ein UDP Befehl empfangen wurde
                        checkUDP();
                      
                        if (!strcmp(packetBuffer, "000"))
                        {
                          getDataCO2();
                          delay(100);
                          getDataVOC();
                          delay(100);
                          getDataSTATUS();
                        }
                      }
                      
                      
                      //// Module ////
                      // Serial-Speicher loeschen
                      void clearAll() {
                        // Paket-Buffer leeren
                        for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = 0;
                      }
                      
                      // empfangene UDP-Befehle auswerten
                      void checkUDP()
                      {
                        // pruefen ob Daten vorhanden sind
                        int packetSize = Udp.parsePacket();
                        if (packetSize)
                        {
                          Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
                          Serial.print("Packet Content: ");
                          Serial.println(packetBuffer);
                        }
                        delay(10);
                      }
                      
                      // UDP-Befehl senden
                      void sendUDP(String text)
                      {
                        Udp.beginPacket(RecipientIP, RecipientPort);
                        Udp.print(text);
                        Udp.endPacket();
                        delay(10);
                      }
                      
                      // CO2 Daten vom Sensor holen
                      void getDataCO2()
                      {
                        iAQCO2 = iaq.getIaqpred();
                      
                        Serial.print("CO2 = ");
                        Serial.print(iAQCO2);
                        Serial.print(" ");
                        Serial.println("[ppm]");
                      
                        String ac = String (iAQCO2);
                      
                        // Wert wird auf 3000ppm begrnezt
                        if (iAQCO2 > 3000)
                        {
                          ac = "3000";
                          sendUDP ("CO2: " + ac);
                        } else {
                          sendUDP ("CO2: " + ac);
                        }
                        clearAll();
                      }
                      
                      
                      // VOC Daten vom Sensor holen
                      void getDataVOC()
                      {
                        iAQVOC = iaq.getIaqtvoc();
                      
                        Serial.print("VOC = ");
                        Serial.print(iAQVOC);
                        Serial.print(" ");
                        Serial.println("[ppb]");
                      
                        String av = String (iAQVOC);
                      
                        // Wert wird auf 1000ppb begrnezt
                        if (iAQVOC > 1000)
                        {
                          av = "1000";
                          sendUDP ("VOC: " + av);
                        } else {
                          sendUDP ("VOC: " + av);
                        }
                        clearAll();
                      }
                      
                      // Status vom Sensor holen
                      void getDataSTATUS()
                      {
                        iAQSTATUS = iaq.getIaqstatus();
                      
                        Serial.print("Status = ");
                        if (iAQSTATUS == 0)
                        {
                          Serial.print("OK");
                        }
                        if (iAQSTATUS == 1)
                        {
                          Serial.print("BUSY");
                        }
                        if (iAQSTATUS == 16)
                        {
                          Serial.println("WARUMUP");
                        }
                        if (iAQSTATUS == 128)
                        {
                          Serial.print("ERROR");
                        }
                      
                        String as = String (iAQSTATUS);
                        sendUDP ("STATUS: " + as);
                      
                        clearAll();
                      }
                      Kein Support per PN!

                      Kommentar

                      • miqa
                        MS Profi
                        • 03.06.2016
                        • 774

                        #29
                        Ich möchte das Thema noch einmal hoch holen.

                        Ich habe keine Ahnung von I²C und daher nach einer anderen Möglichkeit gesucht VOC zu messen. Bei Recherche im Netz (leider schon einige Zeit her, daher kann ich keine Quellen mehr angeben) gab es dezente Hinweise das der IAQ-engine (ich denke das ist der der hier verwendet wurde?) auch ein analoges Signal (0-5V) raus gibt. Obwohl es nicht dokumentiert ist kommt an PIN1 tatsächlich was raus, was in irgendeiner Art auf die Luftqualität reagiert. Das Signal hab ich dann über einen DS2438 per 1-Wire in die Lox gegeben. Allerdings habe ich das Problem das sich nach einiger Zeit (ein paar Tage) ein hoher Wert einstellt der dann relativ konstant erhalten bleibt. Erst wenn man einen einen Reset macht (Spannungsversorgung unterbrechen und wiederherstellen) gibt es anschließend wieder (vermeintlich) sinnvolle Werte. Hat jemand Lust das mal zu verifizieren und Messwerte von einer Analogen Messung und einer I²C Messung gegenüber zu stellen?

                        Kommentar

                        • hismastersvoice
                          Supermoderator
                          • 25.08.2015
                          • 7318

                          #30
                          Ich kann das am WE mal machen.
                          Da es aber auch extra analoge gibt (gab?) denke ich nicht das es wirklich einen Kombisensor gibt.
                          Bin mal gespannt.
                          Kein Support per PN!

                          Kommentar

                          Lädt...