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
Ankündigung
Einklappen
Keine Ankündigung bisher.
Arduino-Sensor für CO² bzw. VOC
Einklappen
X
-
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:
-
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:
-
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:
-
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:
-
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:
-
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
in deinem Sketch.Code:delay()
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:
-
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.pngZuletzt geändert von WagoKlemme; 04.06.2017, 14:18.
Einen Kommentar schreiben:
-
Hallo WagoKlemme,
vielleicht hilft das ja dabei etwas.
https://bitbucket.org/MagGyver/intervall/downloads/
Ich weis nur nicht was du mit dem
vor hast?Code:result =
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
, 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?Code:serialEvent()
Viel Spaß damit.
Zuletzt geändert von Mag Gyver; 04.06.2017, 14:11.
Einen Kommentar schreiben:
-
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:
Achja, ich habe hier zwei Setups. 1 auf Breadboard und 1 siehe oben. Verhalten ist bei Beiden gleich.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() { }
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.pngZuletzt geändert von WagoKlemme; 04.06.2017, 09:42.
Einen Kommentar schreiben:
-
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:
-
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:
-
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:
-
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:
-
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:

Einen Kommentar schreiben: