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

    #31
    Der 3,3V-Ausgang liefert das schon, der ist als unabhängiger Längsregler einfach auf der Platine kostenlos mit drauf. Ein 5V-Arduino läuft dann aber trotzdem intern mit 5V, seine ganzen Ports dann natürlich auch....
    Viele Grüße,
    Stefan

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

    Kommentar


      #32
      Ach so, ja. Man braucht ja auch passende I/O Ports mit passendem 3,3V Pegel .... Hmmpf. OK. Danke gut die Erleuchtung.

      Kommentar


        #33
        Hi
        ich sehe schon so ganz alleine war ich mit der Frage nicht :-)
        Also 3,3V Arduino kostet ja "nichts" - welchen 5V/3,3V-Stepdown-Converter kannst du empfehlen?
        Ach ja - die 3,3V Arduinos haben alle keinen microUSB - also braucht man noch eiinen USB-to-TTL Serial (3,3V) pegelwandler... ich geh mal nach ebay und shoppe.
        Dauert ja sicherlich vieeel länger als die IAQ´s

        Gruß
        Thorsten

        Kommentar


          #34
          Zum Glück gibts heute ja schon vieles als plug&play:

          Ich setze zur Pegelwandlung gerne diesen kleinen Racker hier ein: http://www.exp-tech.de/sparkfun-pege...ional?___SID=U
          Viele Grüße,
          Stefan

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

          Kommentar


            #35
            Und als Stepdown den hier: http://www.exp-tech.de/pololu-3-3v-3...regler-d24v3f3

            USB-to-TTL müsste der hier passen: http://www.exp-tech.de/sparkfun-ftdi...-breakout-3-3v

            Ich habe hier einen, der sich zwischen 5V und 3,3V per Jumper umstellen lässt. Müsste ich mal nachschauen wo ich den her hatte...ist auf jeden Fall FTDI, was anderes würde ich nicht nehmen.

            EDIT: so einer wars: http://www.ebay.de/itm/FT232RL-3-3V-...AAAOSwd0BVxNxc
            Viele Grüße,
            Stefan

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

            Kommentar


              #36
              Okay - den Pegelwandler zwischen BCU und Arduino - klar.
              Wegen dem Step-Down: was bringt der eigentlich? Der Arduino kann ja Eingangsspannung bis 12V - hat also schon einen Spannungsregler an Bord.
              Sorgt der Step-Down für mehr Effizienz - und wie oben genannt mehr Leistung?
              Ich hab mir mal alles bestellt :-) - danke für die "Teille-Liste"

              Gruß
              Thorsten

              Kommentar


                #37
                Genau, nur wegen der Effizienz. Der Arduino hat nur einen simplen Längsregler an Bord - d.h. er lässt die "zuviel" angelegte Spannung einfach am Längsregler in Form von Wärme abfallen...quasi ein veränderbarer Widerstand.

                Beispiel: Du legst 12V an einen 5V-Arduino an und der benötigt für sich und die angeschlossenen Sensoren 50mA. Auf 5V-Seite werden also rund 250mW benötigt. Die 50mA fließen dann aber prinzipbedingt auch direkt an den 12V, also werden rund 600mW aus den 12V gezogen. Das Delta wird in Form von Wärme im Längsregler umgesetzt (satte 350mW), der in diesem Fall nach ein paar Sekunden durchbrennt. Der Wirkungsgrad eines Linearreglers beträgt ca. Uaus/Uein=5V/12V=41%

                Bei einem Schaltnetzteil (hier: Stepdown) sind Wirkungsgrade von bis 95% oder sogar noch mehr möglich. Prinzipbedingt sind auf der Sekundärseite andere Ströme als auf der Primärseite möglich, deshalb ist hier die Wandlung von z.B. 5V auf 3,3V viel effizienter, da praktisch kaum Wärme erzeugt wird.

                Bezüglich der notwendigen Pegelwandlung an den Ports:
                Wenn man jetzt wüsste, was der IAQ intern für einen µC hat....und vor allem, ob dieser interne Clamp-Dioden an den I/Os hat...könnte man diese ggf. in Verbindung mit mit einem simplen Widerstand zur Strombegrenzung zur Pegelwandlung nutzen. Dann bräuchte man o.g. Wandler nicht. Wäre aber quick&dirty...aber, wenn ich drüber nachdenke...neee, machen wir besser nicht. Bitte wieder vergessen, sonst ist das teure Teil am Ende doch defekt und die 3€ für den Wandler sind ja verkraftbar.
                Zuletzt geändert von dreamy1; 23.10.2015, 22:51.
                Viele Grüße,
                Stefan

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

                Kommentar


                  #38
                  Hm - Effizienz kapiert - danke für die gute Erklärung.
                  Aber: wenn der Arduino 3,3V hat brauche ich doch keinen Wandler. Den Wandler brauche ich doch zwischen BCU (5V) und dem Arduino (3,3V), richtig?

                  Weitere Frage: Laut IAQ-Doku (http://www.loxwiki.eu/download/attac...2261000&api=v2) Seite 13 sind 2 4K7 Ohm Widerstände eingezeichnet (SCA und SCL gegen VCC). In dem Loxwiki (wo auch einfach mit 5V gearbeitet wird) sind diese wohl nicht verwendet worden. Irgendwelche Kommentare dazu?

                  Gruß
                  Thorsten

                  Kommentar


                    #39
                    Bei einem 3,3V-Arduino benötigst Du zwischen diesem und dem IAQ keinen Pegelwandler (nur bei einem 5V-Arduino und Verwendung dessen 3,3V-Ausgang zur Versorgung des IAQ). Aber leider zwischen BCU und 3,3V-Arduino...die BCU ist ja der dritte µC im Bunde und hat leider 5V, dessen Ports dann wiederum auch 5V und die passen dann wieder nicht zum 3,3V-Arduino.

                    Ein Pegelwandler wird also immer benötigt, je nach Lage der 3,3V-Schiene aber an unterschiedlichen Stellen.

                    Die 4,7kOhm-Widerstände sind sog. Pull-Ups an der I2C-Leitung. Die I2C-Leitung ist low-aktiv, hat also im Ruhezustand VCC (3,3V bei einem 3,3V-Arduino) und wird durch die Teilnehmer am Bus aktiv nach GND (0V) gezogen, um das Telegramm loszuwerden. Wenn nun kein Teilnehmer etwas zu senden hat, verhalten sich deren I/O-Ports hochohmig und die Leitung könnte eine beliebige Spannung annehmen....was dann irrtümlich z.B. als Start einer Übertragung interpretiert werden könnte (alle Teilnehmer am Bus "lauschen" ja nach Telegrammen). Deshalb werden diese Leitungen mit den Widerständen an VCC "gepinnt", es muss also ganz bewusst etwas Strom fließen um diese Leitungen störsicher für ein Telegramm nach GND zu ziehen.

                    Die Atmegas haben an ihren Ports intern bereits Pull-Up-Widerstände integriert (sind jedoch deutlich hochohmiger als 4,7kOhm und normalerweise ausgeschaltet), bei Verwendung der Wire.h im Programm werden diese an der SCA- und SDL-Leitung automatisch aktiviert. Man kann deshalb einen einzelnen Busteilnehmer an einer kurzen Leitung meist ohne Probleme auch ohne weitere (externe) Pull-Ups betreiben (so wie es wohl im Loxwiki gemacht wird). Besser für die Stabilität der Verbindung sind jedoch die externen Widerstände am I2C-Bus gegen VCC, hier sind 4,7k- oder 10k-Ohm gängig.

                    EDIT: Ergänzung: an der Wire.h muss bei der Verwendung von externen Pullups nichts geändert werden.
                    Zuletzt geändert von dreamy1; 23.10.2015, 23:00.
                    Viele Grüße,
                    Stefan

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

                    Kommentar


                      #40
                      Verstanden. Und da du vorher erklärt hast das der Step-Down zwischen BCU und dem Arduino effektiver ist - plane ich natürlich den 3,3V Arduino - und der Pegelwandler kommt zwischen BCU und Arduino.
                      Einen 5V Arduino und den Pegelwandler zum IAQ ginge auch - aber weniger effizient...
                      Die Pull-Ups spare ich mir dann auch. Jedes Bauteil mehr macht die Integration auf minimaler Größe schwieriger.
                      Bin schon gespannt ob dieses "Plug & Play Puzzle für Erwachsene" so unproblematisch Klappt wie es bisher aussieht :-)

                      Kommentar


                        #41
                        Funktionieren werden beide Versionen - wenn nur der VOC und nichts anderes mehr angeschlossen und ein 5V-Arduino verwendet wird, bleibt der Längsregler noch im gesunden Bereich (66mW@3,3V des VOC sind 20mA, dann würden am Längsregler 1,7V@20mA, also "nur" 34mW an Wärme "verbraten"). Du nimmst Dir halt die Möglichkeit, weitere Sensorik/TFT usw. an die 3,3V zu hängen, da dann immer mehr Wärme am Längsregler erzeugt wird und es kommt dann z.B. bei einer gleichzeitigen Temperaturmessung in der Dose zu ungünstigen Voraussetzungen.

                        Viele Grüße,
                        Stefan

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

                        Kommentar


                          #42
                          Hi,

                          hab grad den Thread hier durchgelesen und möchte meinen Senf dazugeben, da ich gerade dasselbe zusammenbastle. Ich habe mir einen Arduino Nano v3 Klon von dx.com gekauft (siehe Link) und mit der Siemens BCU auf dem 5v Input des Arduinos verbunden. SCL und SDA gehen auf TX/RX des Arduinos. Zusätzlich habe ich einen HTU21 Sensor (ebenfalls 3.3v) auf A4 und A5 (I2C Ports) sowie auf den 3.3v Output PIN des Arduino gelegt. Ich habe das ganze ein paar Minuten getestet und keine Probleme festgestellt - die Daten aus dem Temperatursensor werden problemlos auf den Bus geschickt. Kann es sein, dass der Arduino Nano hier den Pulldown integriert hat oder kommen die Probleme erst über einen längeren Zeitraum?


                          Only €5.96, buy Nano V3.0 for Arduino (Works with Official Arduino Boards) from DealExtreme with free shipping now.

                          Kommentar


                            #43
                            In Deinem Fall hat der HTU21D ja die Pullups onboard (sofern Du das Breakout von Sparkfun einsetzt) - diese hängen dann intern an den 3,3V an der angeschlossenen Versorgung. Die SCL und SDA hängen jedoch auch am 5V-Arduino und dessen interne Pullups der Ports ziehen die Leitungen dann auf 5V. Ist vermutlich unkritisch da alles low-aktiv ist und die Widerstände strombegrenzend wirken, aber es fließen dann permament Ausgleichsströme.

                            Magst Du uns Dein Programm mal zeigen?
                            Viele Grüße,
                            Stefan

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

                            Kommentar


                              #44
                              Danke für die Info. Dann hatte ich quasi bis jetzt Glück. Ich werds so wie Thorsten machen und mir auch einen 3.3V Arduino mit dem Sparkfun Pegelwandler zulegen. Gottseidank habe ich meine Fritzing PCB Bestellung noch nicht losgeschickt :-). Ich zeig euch natürlich gern das Programm. Da ist übrigens der HTU21D und auch schon der IAQ-Core miteingebaut:

                              Code:
                               #include <Wire.h>
                              #include "Adafruit_HTU21DF.h"
                              #include "I2Cdev.h"
                              #include "IAQ2000.h"
                              #include <KnxTpUart.h>
                              #include <SoftwareSerial.h>
                                 
                                // DEFINES
                              #define KNX_BAUDRATE                        19200
                              #define KNX_SEND_INTERVAL_MS                5000
                              #define KNX_PHYSICAL_ADRESS                 "1.1.255"
                              #define KNX_WRITE_GROUPADRESS_TEMPERATURE   "5/2/51"
                              #define KNX_WRITE_GROUPADRESS_HUMIDITY      "5/2/52"
                              #define KNX_WRITE_GROUPADRESS_CO2           "5/2/53"
                              unsigned long startTime;
                              float oldhumidity = 0;
                              float oldtemp = 0;
                              uint16_t oldco2 = 0;
                                 
                                // Initialize software serial (Arduino Uno)
                              SoftwareSerial Serial1(2, 3); // RX, TX
                                 
                                // Initialize the KNX TP-UART on the serial port of Arduino Pro Mini
                              KnxTpUart knx(&Serial, KNX_PHYSICAL_ADRESS);
                                 
                                // Initialize HTU21 temperature sensor
                              Adafruit_HTU21DF htu = Adafruit_HTU21DF();
                                 
                                // Initialize IAQ-Core voc sensor
                              IAQ2000 iaq;
                                 
                                void setup() {
                                Serial.begin(KNX_BAUDRATE);
                                while (!Serial) {
                                  ; // wait for serial port to connect
                                }
                               
                                Serial1.begin(9600);
                                Serial1.println("TP-UART Test");
                                 
                                  // Even Parity
                                UCSR0C = UCSR0C | B00100000;
                               
                                Serial1.print("UCSR0C: ");
                                Serial1.println(UCSR0C, BIN);
                                 
                                  // Reset UART
                                knx.uartReset();
                               
                                startTime = millis();
                               
                                if (!htu.begin()) {
                                  Serial1.println("Couldn't find temperature/humidity sensor!");
                                  while(1);
                                }
                                 
                                  iaq.initialize();
                                if (!iaq.testConnection()) {
                                  Serial1.println("Couldn't find voc sensor");
                                }
                              }
                                 
                                void loop() {
                                if (abs(millis() - startTime) < KNX_SEND_INTERVAL_MS) {
                                  delay(1);
                                  return;
                                }
                                 
                                  startTime = millis();
                               
                                float temp = getTemp();
                                if (temp != oldtemp) {
                                  Serial1.print("Sending temp: ");
                                  Serial1.println(temp);
                                  bool result_temperature = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_TEMPERATURE, temp);
                                  Serial1.print("Temperature sent successfully: ");
                                  Serial1.println(result_temperature);
                                }
                                oldtemp = temp;
                                 
                                  float humidity = getHumidity();
                                if (humidity != oldhumidity) {
                                  Serial1.print("Sending humidity: ");
                                  Serial1.println(humidity); 
                                  bool result_humidity = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_HUMIDITY, humidity);
                                  Serial1.print("Humidity sent successfully: ");
                                  Serial1.println(result_humidity);
                                }
                                oldhumidity = humidity;
                                 
                                  uint16_t co2 = getCO2();
                                if (co2 != oldco2) {
                                  Serial1.print("Sending CO2: ");
                                  Serial1.println(co2); 
                                  bool result_co2 = knx.groupWrite2ByteFloat(KNX_WRITE_GROUPADRESS_CO2, co2);
                                  Serial1.print("CO2 sent successfully: ");
                                  Serial1.println(result_co2);
                                }
                                oldco2 = co2;
                              }
                                 
                                float getTemp() {
                                return  htu.readTemperature();
                              }
                                 
                                float getHumidity() {
                                return htu.readHumidity();
                              }
                                 
                                float getCO2() {
                                return iaq.getIaq();
                              }

                              Kommentar


                                #45
                                Wow....klasse, danke für den Code!!! Sieht super aus.

                                Jetzt muss ich nur noch schauen, wie ich den auf dem Arduino Pro Mini mit 8 MHz ans Laufen bekomme....ich habs leider mehr mit Hardware als mit Software :-)
                                Viele Grüße,
                                Stefan

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

                                Kommentar

                                Lädt...
                                X