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

    Danke, Thorsten.
    Ich denke, wenn ich es mit den Spannungsteilern mache, wie oben, ist es auch einfach aufgebaut mit 3.3V. Das Risiko möchte ich jetzt nicht mehr eingehen, nachdem ich den Post von hismastervoice auf deine Frage gelesen habe.
    >>Smelly One<<
    >> BURLI <<
    Grüße Armin

    Kommentar


      Achtung, ich glaube hier werden zwei unterschiedliche Modelle von AMS verwechselt:

      Der "Erste" VOC von AMS hieß IAQ-Engine und lief mit 5V (https://media.digikey.com/pdf/Data%2...ine_Manual.pdf), der "Neue" IAQ-Core hat 3,3V-Versorgung (http://ams.com/eng/content/download/...1787697/348216). Aussehen tun beide gleich.
      Viele Grüße,
      Stefan

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

      Kommentar


        Ich hab gerade den Lieferschein herausgesucht: ich habe einen "IAQ-CORE C-ND" - wie im Link am Anfang des Threads bei Digikey bestellt...
        Geliefert im Oktober 2015... läuft bis heute :-)
        @Wagoklemme: kann dich verstehen... und bin Froh das wir hier im Forum ein anderes Niveau haben B-)

        Gruß
        Thorsten

        Kommentar


          Das ist seltsam...vielleicht hat AMS ja einen internen Spannungsregler zur Sicherheit verbaut (um genau das Szenario zu verhindern, schließlich sind die IAQ-Engine seit 2016 abgekündigt und es kommt vielleicht jemand auf die Idee, den Core als drop-in-replacement zu benutzen).

          Vielleicht ist es aber halt auch nur Glück und irgendein Schutzmechanismus im Innern greift...ich würde das jedenfalls nicht so lassen. Halbleiter sind nunmal extrem undankbar, was ein Betrieb außerhalb der Spec angeht (Lebensdauer)....normalerweise geht ein für maximal 3,3V (bzw. 3,4V) spezifiziertes Bauteil innerhalb kürzester Zeit defekt, wenn man da 5V draufbrät. Der IAQ kostet ja immerhin um die 40€.
          Viele Grüße,
          Stefan

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

          Kommentar


            Braucht der iAQ tatsächlich 6h bis es losgeht ? Seit ner Stunde kommt nur VOC 0ppb und CO2 450ppm, obwohl ich mir schon die Lunge leergeblasen habe.
            >>Smelly One<<
            >> BURLI <<
            Grüße Armin

            Kommentar


              Nicht das ich mich erinnern könnte. Für den "automatischen Abgleich" braucht er ne weile ... währenddessen spuckt aber aber schon werte aus...

              Kommentar


                Inzwischen sind es 4h. Das Einzige was sich geändert hat ist von Status OK auf Status WARMUP zu gehen und TVoc statt 0, 125 anzuzeigen. 2017-06-01 20_22_19-COM10.png
                2017-06-01 20_27_50-COM10.png


                Edit: jetzt fängt er an. Puh, ich dachte schon ich habe gleich 2 gehimmelt.
                Zuletzt geändert von WagoKlemme; 01.06.2017, 19:29.
                >>Smelly One<<
                >> BURLI <<
                Grüße Armin

                Kommentar


                  Das ist nicht normal. Von OK auf Warmup darf der nicht springen, eigentlich geht das umgekehrt :-)

                  Hört sich nach einem Spannungsproblem an (kurze Unterbrechung oder nicht stabil), denn dann geht er erstmal in die Aufwärmphase...Du betreibst ihn aber an 3,3V, gelle? :-)
                  Viele Grüße,
                  Stefan

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

                  Kommentar


                    Ist auch nur ein Testaufbau, vielleicht wars ein Wackler. Wenn ich ihn jetzt anblase, geht er schön rauf und wieder runter (Fenster offen). Nun scheint alles ok zu sein.
                    Das Projekt reisst mich echt vom Hocker !
                    >>Smelly One<<
                    >> BURLI <<
                    Grüße Armin

                    Kommentar


                      Inzwischen ist der iAQ auf Lochraster und auf Siemens.
                      Leider funktioniert der Bus nicht. Es kommt mir so vor als ob die Kummunikation zwischen dem Pro Mini 3.3V und der Siemens BCU irgendwie gestört läuft.
                      Es geht damit los, dass er erstmal das Senden des VOC-Werts komplett unterschlagen hat. Der Serialevent scheint anzuspringen, aber es wurde keine Leseanforderung abgeschickt. Nehme ich den SerialEvent komplett raus, dann kommen nur Statuswerte und nach einiger Zeit gar nix mehr, der Kommunikation steht:

                      2017-06-04 10_33_09-ETS5™ - Test Jung.png

                      Der code ist wie folgt:
                      Code:
                      #include "I2Cdev.h"
                      #include "IAQ2000.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            10000    // Messintervall alle 30 sekunden
                      #define KNX_SEND_INTERVAL_MS_STATUS         10000  // senden des Status mindestens alle 30 minuten
                      #define KNX_SEND_INTERVAL_MS_CO2            10000  // senden des CO2 Werts mindestens alle 30 minuten
                      #define KNX_SEND_INTERVAL_MS_TVOC           10000  // senden des VOC Werts mindestens alle 30 minuten
                      #define watchdog_time                       3600000  // Watchdog = 1 Stunde
                      const int ledpin = 13;
                      //Initialize KNX
                      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;
                      unsigned long watchdog;
                      unsigned long sendTimeStatus;
                      unsigned long sendTimeCO2;
                      unsigned long sendTimeVOC;
                      uint16_t oldairQuality;
                      uint8_t oldiAQstatus = 255;
                      uint16_t oldairTvoc;
                      
                      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();
                      
                        // initialize device
                      
                        delay(1000);
                        iaq.initialize();
                        iaq.testConnection() ? result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, 2) : result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, 3);
                        delay(1000);
                        // VOC Status
                        // 0 = OK
                        // 1 = BUSY
                        // 2 = VOC Verbunden (*)
                        // 3 = VOC nicht verbunden (*)
                        // 16 = WARMUP
                        // 127 = Neustart / Reset (*)
                        // 128 = ERROR
                        // (*) = Status 2, 3 und 127 kommen vom Sketch
                      
                        ADCSRA = ADCSRA & B01111111; // Disable ADC, ADEN bit7 to 0
                        ACSR = B10000000; // Disable analog comparator, ACD bit7 to 1
                        DIDR0 = DIDR0 | B00111111; // Disable digitale inputbuffer, set analoge input pins 0-5 to 1
                      
                        // Lese-Addressen registrieren
                      //  knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_STATUS);
                      //  knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_CO2);
                      //  knx.addListenGroupAddress(KNX_WRITE_GROUPADRESS_TVOC);
                      }
                      
                      void loop() {
                      
                        // Wenn unterhalb des messintervalls: nichts tun
                        if (millis() - startTime < KNX_MEASSURE_INTERVAL_MS) {
                          delay(1);
                          return;
                        }
                        startTime = millis();
                        digitalWrite(ledpin, HIGH); // Set LED State to visualize progess  
                        delay(1000);
                        digitalWrite(ledpin, LOW);
                        // 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
                        iAQstatus = iaq.getIaqstatus();
                        if (iAQstatus != oldiAQstatus) {
                          oldiAQstatus = iAQstatus;
                          result = knx.groupWrite1ByteInt(KNX_WRITE_GROUPADRESS_STATUS, iAQstatus);
                          sendTimeStatus = millis();      // define last Status send time
                          watchdog = millis();            // set Watchdog
                       }
                        delay(100);
                      
                        // read seansor TVoc
                        airTvoc = iaq.getIaqtvoc();
                        if (airTvoc >= (oldairTvoc + 10) || airTvoc <= (oldairTvoc - 10)) {
                          oldairTvoc = airTvoc;
                          result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_TVOC, airTvoc);
                          sendTimeVOC = millis();         // define last VOC send time
                          watchdog = millis();            // set Watchdog
                        }
                        delay(100);
                      
                         // read seansor CO2
                        airQuality = iaq.getIaqpred();
                        if (airQuality >= (oldairQuality + 10) || airQuality <= (oldairQuality - 10)) {
                          oldairQuality = airQuality;
                          result = knx.groupWrite2ByteInt(KNX_WRITE_GROUPADRESS_CO2, airQuality);
                          sendTimeCO2 = millis();       // define last CO2 send time
                          watchdog = millis();          // set Watchdog
                        }
                        delay(100);
                      }
                      
                      void reboot() {
                      
                      }
                      Achja, ich habe hier zwei Setups. 1 auf Breadboard und 1 siehe oben. Verhalten ist bei Beiden gleich.
                      Kann es an dem Spannungsteiler liegen. Ich hatte statt dem 2kohm nur einen 2.2kohm da ?
                      Der iAQ-Testcode funktioniert perfekt. Ich habe nur ein Problem auf der KNX-Seite.
                      2017-06-04 10_41_48-COM10.png
                      Zuletzt geändert von WagoKlemme; 04.06.2017, 09:42.
                      >>Smelly One<<
                      >> BURLI <<
                      Grüße Armin

                      Kommentar


                        Hallo WagoKlemme,

                        vielleicht hilft das ja dabei etwas.

                        https://bitbucket.org/MagGyver/intervall/downloads/

                        Ich weis nur nicht was du mit dem

                        Code:
                        result =
                        vor hast?

                        Zum Versenden ist dies nicht zwingend notwendig, nur wenn du eine Rückmeldung haben möchtest, ob der ARDUINO dies intern verarbeitet hat. Der Rückgabewert funktioniert aber nicht immer, weil der Kompilierer diesen gerne wegoptimiert.

                        Mit dieser "Library" mache ich wiederkehrende Abläufe. Die Genauigkeit hängt von der inneren "Uhr" des ARDUINO ab.

                        Nachtrag:

                        Zum Senden von Daten aus dem ARDUINO auf den KNX brauchst du kein

                        Code:
                        serialEvent()
                        , dass benötigst du nur zum Empfangen von Daten vom KNX her. Natürlich auch um auf eine Leseanfrage, den aktuellen Status der Gruppenadresse schicken zu können. Ich glaube du bringst da etwas durcheinander oder täusche ich mich?

                        Viel Spaß damit.
                        Zuletzt geändert von Mag Gyver; 04.06.2017, 14:11.

                        Kommentar


                          Hallo Mac Gyver,

                          danke.
                          Ich vermute inzwischen der Spannungsteiler ist das Problem. Habe mal den 3. Pro mini (einen Anderen von Robotdyn) dafür geopfert.

                          2017-06-04 15_05_26-ETS5™ - Test Jung.png

                          Gleich am Anfang gehts - zweimal. Dann nicht mehr, gleiches Ergebnis. Und jetzt geht gar nix mehr.
                          Als ob die serielle Schnittstelle stirbt. Ist sie aber nicht, da der FTDI nach wie vor Sketsche laden kann und Monitor geht auch, natürlich ohne KNX. Dann kann sie doch nicht zerschossen sein. Bin ratlos.
                          Und wenn ich dann das Testprogramm von iAQ runterspiele, geht alles perfekt. Problem ist also die KNX-Seite.

                          Exakt so ists verdrahtet:
                          image_61934.png
                          Zuletzt geändert von WagoKlemme; 04.06.2017, 14:18.
                          >>Smelly One<<
                          >> BURLI <<
                          Grüße Armin

                          Kommentar


                            Hallo WagoKlemme,

                            ach du hast den Spannungsteiler an der UART-Schnittstelle.

                            Ich habe noch etwas im ersten Post von mir geändert, vielleicht hilft dies ja.


                            Aber auch eine mögliche Ursache sind die enorm vielen

                            Code:
                            delay()
                            in deinem Sketch.


                            Sehr komisch, ich habe leider keinen iAQ-Sensor. Aber dafür läuft bei mir eine RTC an I2C/TWI und sendet erfolgreich Datum und Uhrzeit an den KNX.

                            Nur ich benütze zwei Optokoppler, zwei Kondensatoren (optional) und vier Widerstände für die Trennung 5V <-> 3,3V an der UART-Schnittstelle.

                            Für Anschaltung über Optokoppler siehe:

                            ARDUINO am KNX Post #827 (Kondensatoren nicht eingezeichnet!)
                            Zuletzt geändert von Mag Gyver; 04.06.2017, 14:52.

                            Kommentar


                              Nur wird mir das zu eng auf Lochraster, da ich auch noch einen BME280 später draufmachen wollte. Dann warte ich lieber auf Platinen zum Aufstecken. Bin schon mit Stefan in Kontakt.
                              Ich hatte mal was von Störungen der Bus-Kommunikation beim Pro mini aus China gelesen, finds aber nicht mehr. Vielleicht ist das die Ursache, zumindest passts zum Fehlerbild. Der Pro mini stört, kommt aus dem Tritt und Kommunikation bleibt stehen - passt.

                              Das mit dem SerialEvent hatte ich testweise herausgelöscht, da die Störung per Geisterhand einen Serialevent regelmässig ausgelöst hatte. Auch hierin ist die Kommunikationsstörung zu erkennen. Eine Leseanfrage hat es nie gegeben.

                              Ich danke dir und danke für die Lib-Pflege !
                              >>Smelly One<<
                              >> BURLI <<
                              Grüße Armin

                              Kommentar


                                Mit dem ARDUINO NANO gibt es auch Probleme, aber nur beim Empfangen. Liegt daran das der FTDI-Chip direkt über Widerstände an der UART-Schnittstelle hängen und nur nach mechanischer Trennung oder den FTDI-Chip über Pin 19 des FTDI-Chips im Reset halten, solange man die UART-Schnittstelle nicht zum Upload braucht. Also Faktum für Bastler ungeeignet.

                                Bei Klonen allgemein sollte man darauf achten, dass kein CH340 ... -Chip für die USB-Kommunikation verbaut ist, ansonsten auch nicht brauchbar. Nur eine mechanische Endlösung möglich.

                                Am besten geeignet ist der ARDUINO PRO MINI, der ARDUINO UNO und der ARDUINO MEGA.

                                Kommentar

                                Lädt...
                                X