Funksensor mit Bosch sensortec BME680 / Luftgüte

Begonnen von juergs, 28 Oktober 2017, 18:05:43

Vorheriges Thema - Nächstes Thema

juergs

Hallo Peter,
vielen Dank , war wirklich ein hartes Stück Arbeit!

Muß noch mit mehr Debugausgaben schauen wie sich das PlugIn bezüglich Daten verhält ...
Aber bin erst mal froh, ein gelungenen Compile fabriziert zu haben.

Hauptproblem: Im Laufe der Zeit sammeln sich so einige Libs im \libraries-Ordner von Arduino an.
Das gibt bei Arduino nur Ärger mit gleichen Lib-Header-Namen, wie in meinem Fall ...

Aber mit der gezeigten Methode kann man sich die Libs ja passend zurechtbiegen ...  ;)

Grüße,
Jürgen

juergs

#496
Nur Tracing eingebaut und ein paar kleine Änderungen:
INIT : Booting version: (custom) (ESP82xx Core 2_5_0, NONOS SDK 3.0.0-dev(c0f7b44), LWIP: 2.1.2)
13054 : INIT : Free RAM:35616
13055 : INIT : Warm boot #2 Last Task: Background Task - Restart Reason: External System
13061 : FS   : Mounting...
13088 : FS   : Mount successful, used 75802 bytes of 957314
13101 : CRC  : No program memory checksum found. Check output of crc2.py
13145 : CRC  : SecuritySettings CRC   ...OK
js_bme680.cpp:435: void JS_BME680Class::do_begin()
js_bme680.cpp:488: void JS_BME680Class::do_begin()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:231: bme680VocValid = 0
js_bme680.cpp:235: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:268: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:283: void JS_BME680Class::getBme680Readings()
js_bme680.cpp:295: tVoc = 228.04
js_bme680.cpp:306: str_tVoc = 228
js_bme680.cpp:331: str_ratio = 1.0859

:D

Benutze das Ocotpus-Board mit BME280 auf Adresse 0x77 (!), deshalb der BME680 mit pemue's Sensor-Platine (ohne Pullups, vielleicht auf Board ...).
Die Trace-Lib von: https://github.com/bblanchon/ArduinoTrace
Lasse das mal länger laufen und schaue mal auf die "Langzeitstabilität", bzw. der neue Sensor braucht  auch 4 Tage um sich einzubrennen...   ;)

Da könnte ich mir in Verbindung mit Neopixel auch etwas vorstellen ...  ;)


juergs

#497
Die lauffähige ESPEasy-Version mit BME680 und TVoc-Ausgabe !
Wenige Debug-Ausgaben sind aktiv.

ESP12E-----------BME680 @ 0x76 (SDO = GND)
GND------------>GND
3.3V------------>3.3V
D2------------>SDA
D1------------>SCL


Falls jemand mit testen möchte ...  und die Implementierung in FHEM schildern möchte (MQTT ?)... ;)

Infos zu ESPEasy: https://waschto.eu/easyesp/ . HowTo ESPEasy Konfiguration und Live-Demo.

PeMue

#498
Hallo Jürgen,

da könnte man doch mal folgende Kombinationen testen:
- nanoLGW mit BME680
- mapleMini mit BME680 und Thommy's Sketch
- WeMosD1 mini mit BME680 und Deinem Sketch
- wenn ich MQTT eingerichtet bekomme, dann noch locutus' TVOC Sensor von AMS (CCS811)
Muss mal schauen, was ich davon hinbekomme.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#499
Hallo Peter,

gerne, die nanoLGW ohne den RFM69 wäre mir auch in den Sinn gekommen ;-)

Wenn's klappt wäre das super.  Mit der Lib würde das aber auch auf dem 328er gehen, ggf. mit CC1101 etc. (Dirks Universal-Sensor...)
Der Maple mit dem Air602-WiFi-Sender ... oho!

Thommy's Sketch? Ist mir entgangen ...

Die jetzige Binary ist als Target: "Wemos D1 und D2 mini" compiliert... allerdings nur Adresse: 0x76.
Das Umschalten auf 0x77  müsste in  ESPEasy auch klappen, wenn ich es eingebaut bekomme  ...

Wenn ich am WoE mehr Zeit habe, liefere ich die Sourcen dazu ...

Allerdings muss ich noch Erfahrungen über das Timing-Verhalten des ESPEasy-Subsystems wie z.B. in Verbindung mit anderen Sensoren
sammeln.... und das interne Logging tiefer ergründen: z.B. für die Logausgabe im Browser.
Geht:
4923376: EVENT: Bme680#Temperature=23.23
4923403: EVENT: Bme680#Humidity=40.09
4923429: EVENT: Bme680#Pressure=1009.12
4923454: EVENT: Bme680#TVoc=201.09
4933763: EVENT: Bme680#Temperature=23.23
4933825: EVENT: Bme680#Humidity=40.09
4933856: EVENT: Bme680#Pressure=1009.12
4933881: EVENT: Bme680#TVoc=205.70
4934767: WD : Uptime 82 ConnectFailures 0 FreeMem 23776 WiFiStatus 3
4943373: EVENT: Bme680#Temperature=23.23
4943399: EVENT: Bme680#Humidity=40.09
4943424: EVENT: Bme680#Pressure=1009.12
4943451: EVENT: Bme680#TVoc=205.70


Grüße,
Jürgen

juergs

#500
.. und die Rules passend für Neopixel und TVoc ansteuern ...

Meine eigene Interpretation zum Testen ..  ;)
//--- red
on Bme680#TVoc>=400 do
TaskValueSet 3,1,0
TaskValueSet 3,2,0
TaskValueSet 3,3,1
if [Bme680#TVoc] < 500
   neopixel, 1,255,0,0
endif
endon

//--- orange
on Bme680#TVoc>=300 do
TaskValueSet 3,1,0
TaskValueSet 3,2,0
TaskValueSet 3,3,1
if [Bme680#TVoc] < 400
     neopixel, 1,255,102,204
endif
endon

//--- yellow
on Bme680#TVoc>=200 do
TaskValueSet 3,1,0
TaskValueSet 3,2,1
TaskValueSet 3,3,0
if [Bme680#TVoc] < 300
   neopixel, 1,255,96,0
endif
endon

//--- green
on Bme680#TVoc>=100 do
TaskValueSet 3,1,1
if [Bme680#TVoc] < 200
   neopixel, 1,0,255,50
endif
endon

//--- no TVOC activity
on Bme680#TVoc=0 do
TaskValueSet 3,1,0
neopixel, 1,255,255,255
endon


Auffallend die hohe Abweichung des BME280-Sensors, der auf der Octopusplatine sitzt.
Der BME680-Wert ist wahrscheinlicher ...  :)

ZitatLuftdruck
    1005,7 hPa (1023 bezogen auf NN)
Luftfeuchtigkeit
    54,9 %

Tobias

#501
Hi,
es gibt verschiedene Breakout Boards mit dem BME680. Macht das einen Unterschied?
Hier für 20€ aus Deutschland: https://shop.pimoroni.de/products/bme680-breakout
Für 12€ aus China: https://www.ebay.de/itm/CJMCU-680-BME680-Atmospheric-Pressure-Sensor-Temperature-Humidity-BMP280-SI7021/401739634718?hash=item5d898c581e

Die China-Variante hat noch zusätzlich einen SDO und CS Pin, die pirimoni Variante nicht.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

PeMue

Hallo Tobias,

Zitat von: Tobias am 07 September 2019, 08:33:25
es gibt verschiedene Breakout Boards mit dem BME680. Macht das einen Unterschied?
nein, es muss nur der Adress Pin mit rausgeführt sein.
Ich habe mal eines bei Waterott gekauft, das war relativ preiswert und schnell da.

Zitat von: Tobias am 07 September 2019, 08:33:25
Die China-Variante hat noch zusätzlich einen SDO und CS Pin, die pirimoni Variante nicht.
Der Baustein kann SPI und I2C, hier wird nur I2C verwendet, daher werden die extra Pins in unserer Anwendung nicht verwendet.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#503
Hallo Tobias,

den BME680 alleine bekommt man für ca. 9,45 € + Porto , dh. Breakboards < 20€ wären eigentlich preislich  vertretbar.
Lohnt sich dafür fast nicht ein Board selbst zu machen und zu bestücken ...
Reich-elt bietet auch ein Breakoutboard für den BME680 an ...


Zum Sensor selbst: Habe meiner Lib noch einen Kalman-Filter auf den tVoc-Rohwert spendiert.

Blau = tVOC (Rohwert)
Rot  = tVoc (Kalman gefiltert)
Grün = Temperatur
Orange = Luftfeuchte

In EspEasy sind leider nur 4 Sensorwerte möglich, so dass ich noch eine Möglichkeit in den Device-Konfigurationsdialog einbauen muss,
um den gefilterten Wert, statt dem tVoc-Rohwert anzuzeigen, bzw. zwischen beiden zu wählen.

Damit müssten auch noch zusätzlich I2C-Adress-Auswahl + T-Offset + H-Offset - Parametrierung hinzukommen.

juergs

#504
Gerade fast Off-Topic:  Basic setup for BME680 and NodeMCU (ESP12E) + platformIO ;)


Die bisher günstigste Methode zum Einsatz des BME680:   =>  gy-mcu680v1 (seriellle Anbindung, scheinbar mit BSEC). Dafür gibt es aber noch kein ESPEasy-Image/Plugin (aber eine Idee, Idee2 dafür...) 
Muss aber erst mal die Parametriermöglichkeiten in einem ESPEasy-Plugin verstehen und anwenden ... 

juergs

#505
Geschafft, die BME680-ESPEasy-Konfiguration des Devices steht!

juergs

#506
Hier die erste Version mit Allem  ;)

Der Debug-Output sieht sehr gut aus:

723 : BME680  : init
726 : BME680  : PLUGIN_READ initialized.
728 : BME680  : PLUGIN_READ-Settings: I2C: 118 Elevation: 180 Filter: 1 Toffs: 1 Hoffs: 1 Plot: 0 Debug: 1
*** JS_BME680Class started!
       JS_BME680.resitance beeing zero! First Reading?
       JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 277
  JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 267
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 257       
. . .
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 67
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 57
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 47
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 37
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 27
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 17
JS_BME680.bme680VocValid not ready! Wait about 300 sec (5 min) to warm up ... 7
--------------------------------------
Timestamp: 302.62
tVoc: 128.88
tVocEst:                   64.44
  Approx (tV): 128.88
Approx (tV2): 12.89
Ratio: 1.00
Ratio_log: 0.00
ABC_base: 8355825
Abs_Hum: 10.89
Resistance (raw): 109263
Resistance (filt.): 109263.00
Temp: 23.64
Hum: 10.89
Press: 1004.77
Dewpoint: 12.95
Alt:         25820.40
T-Offs: 1.00
H-Offs: 0.00
--------------------------------------


Bis auf die Berechnung der Höhe (die in ESPEasy nicht angezeigt wird ....)  ;)

Durch setzen des Filters wird der gefilterte/geglättete TVOC-Wert ausgegeben.
Das macht bei der Empfindlichkeit des Sensors auf Luftzug auch Sinn ....
Änderungen an Konfigurationen werden nach TOOLS -> Reboot übernommen.

Anleitung + Code: https://github.com/juergs/ESPEasy_BME680_TVOC

Mit Arduino compiliert (siehe auch Hinweise dazu auf github)!

Bei Fragen, fragen .... Verwendung ohne Gewähr  :D ;D

Anmerkung:
Die Aufwärmzeit ist auf 5 Minuten konfiguriert, in dieser Zeit kommt der Wert TVOC = 0.
Danach erst sollten TVOC Werte angezeigt werden!  Also etwas Geduld beim Anwerfen ...


Grüße + viel Spaß beim Testen.
Jürgen 

juergs

#507
BME680 vs. Dallas 18B20 (12Bit)

Falls die Dezimale eine Rolle spielen sollten ...  ;D ;)
Der BME war noch in der 5-Minuten Aufwärmphase ... deshalb kein TVOC-Wert.

juergs

#508
... und ein paar super Kurven ( nein, nicht 90-60-90)  ;D

IAQ (mit BSEC, nanoLGW) vs. TVOC (SLINK)...
Fehlt noch die MQTT-Bridge zu ESPEasy ... 

twenta

Zitat von: juergs am 08 September 2019, 17:07:01

Anleitung + Code: https://github.com/juergs/ESPEasy_BME680_TVOC

Mit Arduino compiliert (siehe auch Hinweise dazu auf github)!

Bei Fragen, fragen .... Verwendung ohne Gewähr  :D ;D

...
Grüße + viel Spaß beim Testen.
Jürgen

Hi,

vielen Dank für die tolle Arbeit, kommt gerade recht für meine China Lieferung des dfrobot bme680 boards:)
Leider blinkt mein D1 mini (azdelivery) nach dem flashen nur alle 6 Sekunden. Ich vermute mal, dass mein esp8266 nicht mit dem sketch klarkommt (leider habe ich keine Auflistung für das interpretieren blinkender LEDs gefunden). Daher habe ich mich auch (erstmals) an ein kompilieren gemäß Deiner github Anleitung getraut, leider mit dem selben Ergebnis. Mit welchen boards hast Du denn bisher positive Rückmeldung gehabt/bekommen?
Als Warnung, ich bin raspi veteran, aber noch esp Neuling...