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

  • Mag Gyver
    antwortet
    Ich benütze für den Spannungsteiler 680 Ohm und 1,0 Kiloohm.

    Pegelwandler sind auch sehr gut auf dieser Seite erklärt.

    https://www.mikrocontroller.net/articles/Pegelwandler
    Zuletzt geändert von Mag Gyver; 04.06.2017, 17:14.

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Du kannst den 1k zum Rx des Siemens mal verkleinern (z.B. 100 Ohm), vielleicht liegt hier das Problem wenn der Siemens zu niederohmig ist. Dann kommt evtl. kein sauberer high/low-Pegel zustande.

    Einen Kommentar schreiben:


  • Mag Gyver
    antwortet
    SPARKFUN PRO MINI (DEV-11113) 5V 16Mhz oder

    SPARKFUN PRO MINI (DEV-11114) 3,3V 8Mhz

    sollten problemlos laufen.



    SPARKFUN PRO MICRO (DEV-12640) 5V 16Mhz oder

    SPARKFUN PRO MICRO (DEV-12587) 3,3V 8Mhz

    sollten auch problemloslaufen, nur hierbei Serial 1 für Kommunikation BCU der ARDUINO Pins 0 und Pin 1 benützten !


    Nachtrag:

    Pegelanpassung muss natürlich auch extern erfolgen, also ADUM, OPTOKOPPLER oder ÄHNLICHES.

    Aber bei dem ProMini ATmega328P von RobotDyn ist kein CH340 verbaut, auch nicht auf den

    MegaPower ProMini ATmega328P von RobotDyn!

    Kann also nur an der Pegelanpassung liegen oder ein Teil des Sketches verhält sich nicht wie gedacht.


    Zuletzt geändert von Mag Gyver; 04.06.2017, 16:59.

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Ob der CH340 verbaut ist, kann ich selbst mit Lupe nicht erkennen.
    Weisst Du ob der Pro mini von Sparkfun hier problemlos ist ?

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    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? :-)

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:

Lädt...
X