Autor Thema: Funksensor mit Bosch sensortec BME680 / Luftgüte  (Gelesen 53401 mal)

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Funksensor mit Bosch sensortec BME680 / Luftgüte
« am: 28 Oktober 2017, 18:05:43 »
Seit einiger Zeit beobachte ich das Geschehen um CO2/VOC-Luftgüte-Sensoren, auch um den relativ neuen BME680 Sensor von Bosch sensortec,
mit diesen Eckdaten:
Zitat
    Bosch BME680 Integrated Environmental Sensor (Air Quality, Humidity, Pressure and Temperature)
    Temperature Sensor -40...85°C
    Pressure Sensor 300...1100hPa (+9000...-500m above/below sea level)
    Humidity Sensor 0...100%
        Accuracy tolerance: +/-3 % relative
        Hysteresis: <1.5% relative
    Gas Sensor for Air Quality (IAQ)
    SPI Interface (up to 10MHz)
    TWI/I2C Interface (address 0x76 when SDO=0 or 0x77 when SDO=1, CS=1 for I2C)
    3.3V - 5V Power Supply and Logic Level

Hardware: BME680-Breakout oder nur 3V3-Typ oshpark DIY

Da es aber Softwaremässig eher bescheiden um den Sensor bestellt ist, möchte ich Euch mein Projekt
schon in der Anfangsphase vorstellen.

Die von Sensortec vorgestellte Software BME680_driver ist durchaus etwas
zu "kompliziert", umfangreich und zu allgemein gehalten, um gleichzeitig auch in die Tiefen von I2C und dem Sensor einzusteigen.
Deshalb hier erst mal die "einfachere" Lösung mit Breakboard und Arduino NANO um in das Thema einzusteigen.

Software:

1. Schritt: Implementierung der Grundfunktionalität für das Breakout-Board.

Hardware setup:
VCC ----------------------- NANO.5V
SDA ----------------------- NANO.A4 = PC5
SCL ----------------------- NANO.A5 = PC4
CS ------------------------ High (select i2c-Interface)
GND ----------------------- NANO.GND

Erstes-Ergebnis:

Zitat
Opening port
Port open
Scanning...
Ok, I2C device found at address 0x77  !
done

BME680 I am: 61 I should be 61

Calibration coeficients:
dig_T1 =26583
dig_T2 =26571
dig_T3 =3
dig_P1 =35016
dig_P2 =-10322
dig_P3 =88
dig_P4 =5660
dig_P5 =17
dig_P6 =30
dig_P7 =19
dig_P8 =200
dig_P9 =-3762
dig_P10 =30
dig_H1 =773
dig_H2 =1011
dig_H3 =0
dig_H4 =45
dig_H5 =20
dig_H6 =120
dig_H7 =-100
dig_GH1 =-29
dig_GH2 =-13303
dig_GH3 =18
gas wait time = 0x59
resistance Heat = 20
CTRL_GAS_1 = 0x10
gas wait = 0x59
res heat = 0x20
New data in field 0!
Gas measurement Index = 0
gas range = 4
BME680:
Altimeter temperature = 21.84 C
Altimeter temperature = 71.31 F
Altimeter pressure = 1007.93 mbar
Altitude = 145.55 feet
Altimeter humidity = 49.0 %rH
Gas Sensor raw resistance = 0
Gas Sensor resistance = 806516.4 Ohm

New data in field 0!
Gas measurement Index = 0
Field 0 gas data valid

Gas measurement Index = 0
Field 0 gas data valid
gas range = 0
BME680:
temperature = 21.87 C
temperature = 71.37 F
pressure = 1007.85 mbar
Altitude = 147.74 feet
humidity = 48.9 %rH
Gas Sensor raw resistance = 0
Gas Sensor resistance = 12917166.0 Ohm


2. Schritt: Abwägen der existierenden Libraries.
Hier die Library für das Breakout-Board:
BME680_Library. Das ist der gesuchte Wrapper um den (original)  BME680_driver

In "BME680_V2" hab ich die BME680-Library zusammen gepackt und etwas "angepasst".

3.Schritt. Umschwenken auf BSEC mit dem ESP8266(nodeMCU)
macht noch Ärgen mit fiesem WDT-Fehler ... Erst mal ausgesetzt.

4. Schritt: Datenübertragung mittels Standard- 433MHz-OOK-Sender an FHEM:
Der Prototyp mit 433 MHz Lacrosse Protokoll ist fertig.
Der Sender wird an D13 angeschlossen, wenn D10 gegen GND gejumpert wird dann zeigt der Serial-Output auch ein Timestamp an.
Der CO2-Wert pegelt sich bei mir um die 120.000 ein, deshalb teile ich dur 10.000 um in den übertragbaren Wertebereich zu kommen.
Die Datenübermittling wird per Interrupt alle 30 Sekunden übertragen, da sich heraus gestellt hat, dass der Sensor häufiger abgefragt werden muss,
wohl um seine Betriebstemperatur zu stablisieren...     

Der Sensor baut zwei Devices auf:
ID 100 - Kanal 1: Temperatur
             Kanal 2: Luftfeuchte
ID 101-  Kanal 1: CO2 Widerstand als Roh-Sensor-Wert
             Kanal 2: als gemittelter Sensorwert.

Hardware:
D13 => 433MHz-OOK-Modul-DATA-Pin
D10 => Jumper gegen GND = Debugausgaben mit Text, offen = nur Zahlen für Plotanzeige

Die Werte für Temperatur, Luftfeuchte sind nicht gemittelt. Den Luftdruck habe ich erst mal zu Gunsten
der CO2-Ausgabe geopfert. In Zukunft wird sich aber der gemittelte Wert eher anbieten.
Dann werde ich den Luftdruck mit übertragen.
Das ist mal die erste Variante mit einem Nano, bis ich den WDT-Fehler beim ESP gefunden habe.
Evtl. lassen sich dann auch die Relation Richtung IAQ und ppm finden ...
Verbesserte Variante in der Version 2.1.

Schritt 5: Einbindung AMS iAQ-core Sensor, der ebenfall Resistance, CO2 [ in ppm] und tvoc - nach intern implementierten Algorithmus schon überarbeitete Daten liefert.
Um die Ausgaben des BME680 korrelieren zu können. Ebenfalls Einbindung über TX3-LaCrosse-Protokoll bis dato.
Den passenden Code "iAQ-NANO-LACROSSE-TX3" dazu habe ich hier hier bei Github veröffentlicht.

Schritt 6: Überarbeitung des BME680-Codes und Anpassung auf den ESP8266, um die Ausreißer-Werte und das nervige WDT-Problem zu eliminieren ...

/edit 20181226: Implementierung als "UniversalSensor" mit RFM69CW/868Mhz und LaCrosseGateway: https://forum.fhem.de/index.php/topic,78619.msg876544.html#msg876544
« Letzte Änderung: 26 Dezember 2018, 17:49:55 von juergs »
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline HCS

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3024
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #1 am: 28 Oktober 2017, 18:45:05 »
Eventuell sollten wir uns zusammentun.
Ich bin gerade hier
https://forum.fhem.de/index.php/topic,78128.msg700815.html#msg700815
dabei, den BME680 in das LaCrosseGateway zu integrieren.

Das läuft so weit auch schon, nur die Umrechnung des Widerstandswerts in die IAQ, fehlt noch.
Die Formel verrät Bosch seltsamerweise nicht.

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #2 am: 28 Oktober 2017, 19:10:27 »
Hallo HCS,
Danke fürs Feedback.

Für mich war heute erst Mal die Anbindung über I2C wichtig.
Morgen schaue ich mir Mal die Driver_FW genauer zu dem Thema an.

Hast Du schon einen weiteren SW-Stand?
Da können wir gerne zusammen kommen.  :-)

Grüße
Jürgen

Online PeMue

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4848
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #3 am: 28 Oktober 2017, 19:41:28 »
Hallo zusammen,

ich bin gerade am Komplettieren meines nano LGWs. Dauer leider ein bisschen, weil zu viele (unversandte) Platinen und Zeugs rumliegen  :(

Gruß Peter
1x FB7170 (29.04.88) 5.7 1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F)
1x RPi BV2LCDCSM 1.63 5.7 2xMAX HKT, 1xMAX RT, V200KW1
1xFB 7490 (113.06.05) 5.7 1xCUL V3 1.63 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 1xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU 1xRFXtrx 90 1xWT440H 1xCM160 3xTFA30.3150 5xFA21

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #4 am: 28 Oktober 2017, 22:34:48 »
Hier die Arduino-Library für das Breakout-Board:
BME680_Library. Das ist der gesuchte Wrapper um den BME680_driver. Sowie Beispiele dazu.
Ebenfalls hier und hier.
« Letzte Änderung: 28 Oktober 2017, 22:57:41 von juergs »

Offline KölnSolar

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3499
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #5 am: 28 Oktober 2017, 23:25:05 »
Feines Projekt ! Freue mich auf Fortschritte und Endergebnis. Bin selber zu verhaftet in Betty, Samsung, Feinstaub.... und letzteres als Innensensor. Den BME680 direkt an den Wemos anschließen ?
Grüße Markus
RPi3/2 Stretch-STV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-CUL868-FS20A4-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty-Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #6 am: 29 Oktober 2017, 11:19:37 »
Hallo Markus,

Zitat
Den BME680 direkt an den Wemos anschließen
das wird gehen.

Habe mich aber noch nicht auf ein Transport-Medium festgelegt.
Hier gibt es z.B. ja auch noch: Vorgänger-Threads und hier AMS-IAQ
oder CUL_TX, Asksin, LGW, ESP etc. (mal schauen, zum gegebenen Zeitpunkt, was für FHEM mehr Sinn macht.)
« Letzte Änderung: 29 Oktober 2017, 12:03:19 von juergs »
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #7 am: 29 Oktober 2017, 11:49:51 »
Hier die Version mit der "Orginal"-Lib basierend auf dem sensortec-Code.
Habe alles in ein Verzeichnis gelegt um ein eigenständiges Projekt (ohne Arduino-Repository-Verweise) zu erzeugen.
In den Libs musste ich noch einiges anpasssen, dass sie unter VisualMicro compiliert werden können,
bzw. nicht dauernd Fehler (zB. int8_t unbekannt) anzeigen.

Zitat
Opening port
Port open
BME Initialization...Succeeded!
Configuring Forced Mode...Succeeded!
Temperature(degC),Relative_Humidity(%),Pressure(hPa),Gas_Resistance(Ohms)
22.57,51.37,1004.47,0
22.72,51.43,1004.21,121377
22.69,51.30,1004.25,125656
22.66,51.26,1004.29,127570
22.65,51.27,1004.35,128451
22.63,51.27,1004.37,128648
 
Einige Dinge kann klar noch noch verbessern: z.B. die Normalisierung des Luftdrucks auf Meereshöhe ...
Diese Lib scheint die bessere Version zu sein. Jetzt geht es erst ma wieder ans Datenblatt um wie HCS schon erwähnte
die Bedeutung der Widerstandswerte herauszufinden und ob der Forced-Mode die richtige Betriebsvariante ist.
« Letzte Änderung: 29 Oktober 2017, 12:06:14 von juergs »

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #8 am: 29 Oktober 2017, 14:09:57 »
Nach Durchlesen der BME680-Dokumentation, werden Lösungen mit zwei "Ausbaustufen" : IAQ + ALL
mit den entsprechenden Algorithmen als Arduino-Code. (siehe S.21, Datasheet)  :)

BSEC-code "Bosch Sensortec Environmental Cluster"

bsec_integration.c
bsec_integration.h
bsec_iot_example.c
bsec_iot_example.ino
doc_bsec_step_by_step.md

Zitat
C:.
├───algo
│   └───bin
│       ├───ARM_CORTEX
│       │   ├───ARMCC
│       │   │   └───IAQ_OUT
│       │   │       ├───Cortex_M0
│       │   │       ├───Cortex_M0+
│       │   │       ├───Cortex_M3
│       │   │       ├───Cortex_M4
│       │   │       └───Cortex_M4F
│       │   └───GCC
│       │       └───IAQ_OUT
│       │           ├───Cortex_M0
│       │           ├───Cortex_M0+
│       │           ├───Cortex_M3
│       │           ├───Cortex_M4
│       │           └───Cortex_M4F
│       ├───ESP8266
│       └───RL78
├───API
├───config
│   └───iot_lp_3_3v
├───Doc
└───example


Zitat
- Available binaries for download - ARM CortexM0+,M3,M4,M4F,x86,x64
... und Arduino mit ESP  ;)

@HCS:
Hier sollte die Vorgehensweise der Umrechnung beschrieben sein (siehe auch S.9 + 18ff. Datasheet) :

Zitat
[300345.00] T: 33.30| rH: 22.73| IAQ: 25.00 (3)
[303346.00] T: 33.30| rH: 22.76| IAQ: 26.30 (3)
[306346.00] T: 33.26| rH: 22.81| IAQ: 27.90 (3)
[309346.00] T: 33.26| rH: 22.84| IAQ: 19.72 (3)
[312346.00] T: 33.20| rH: 22.93| IAQ: 25.02 (3)
[315346.00] T: 33.19| rH: 22.94| IAQ: 20.70 (3)
[318346.00] T: 33.14| rH: 22.97| IAQ: 28.80 (3)

=>Widerstandswert
=> IAQ_Index [0-50,51-100,101-150,151-200,201,300,301-500] 
=> Air_Quality [good,average,little bad, bad, worse, very bad]

Aber: CO2-LED-Ampelanzeige: (bis 800 ppm: grün, 800-1200 ppm: gelb, über 1200 ppm: rot)

Mal schauen... und den "BSECIntegrationGuide" (PDF im \Doc-Verzeichnis) durchwälzen...
« Letzte Änderung: 29 Oktober 2017, 20:09:01 von juergs »

Offline HCS

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3024
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #9 am: 29 Oktober 2017, 18:09:57 »
... und Arduino mit ESP  ;)
Hast Du eine Idee, wie man die libalgobsec.a einbindet?
Meiner Meinung nach gibt es die Berechnung der IAQ nur in precompiled libs.
https://github.com/BoschSensortec/BME680_driver/issues/6#issuecomment-337134651

Hier sollte die Vorgehensweise der Umrechnung beschrieben sein (siehe auch S.9 + 18ff. Datasheet) :
Das beschreibt nur, wie man den Senosr heizt und den Widerstandswert ausliest und berechnet.
Aber nicht, wie die IAQ daraus berechnet wird.

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #10 am: 29 Oktober 2017, 18:33:10 »
Hallo HCS,

ja sieht in der Tat so aus:

Zitat
bsec_do_steps()
scheint nur in den precompiled libs zu existieren.
Dort werden die IAQ Berechnungen durchgeführt ...

Ich muss mich durch den "BSEC Integration Guide" duchkämpfen.
Was mich wundert ist, dass ein explizites Arduino-Beispiel mitgeliefert wird.

So eine adhoc Idee wäre, durch Referenzmessungen, sich einfach eine Funktion zu erstellen, welche
die Widerstandswerte in die IAQ-Kategorien umwandelt. (airco2ntrol)

Vielleicht hast Du da schon mehr Erfahrungswerte in Bezug auf der Widerstands-Ausgabe ?

Letztendlich kommt es da nicht auf den IAQ-Absolutwert an (?) ...


« Letzte Änderung: 06 November 2017, 08:52:15 von juergs »

Offline HCS

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3024
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #11 am: 29 Oktober 2017, 18:57:33 »
Vielleicht hast Du da schon mehr Erfahrungswerte in Bezug auf der Widerstands-Ausgabe ?
Ein wenig. Siehe hier: https://forum.fhem.de/index.php/topic,78128.msg700815.html#msg700815
Ich kann zumindest ablesen (angehängtes Chart), wann meine Frau gekocht hat und wann gelüftet wurde.
Ich müsste mal die Fenster zu lassen, bis ich umkippe, um den Grenzwert zu ermitteln  ;D ;D

Letzendlich kommt es da nicht auf den IAQ-Absolutwert an (?) ...
Denke ich auch. Wir brauchen ja nicht unbedingt eine "Bosch-Kompatible" IAQ, wenn die nicht verraten wollen, wie man sie berechnet.

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #12 am: 29 Oktober 2017, 19:00:44 »
Zitat
IAQ, wenn die nicht verraten wollen, wie man sie berechnet.

Ja, magic...  und ein riesen Aufwand für das Framework.
Die scheinen Angst vor den Chinesen zu haben ...  :( :( :(

Über den "gas_range" scheint die Werteausgabe  auch nicht kontinuierlich zu sein. (Siehe Seite 20, Tabelle 12) ...

Dann baue ich mal die Chart-Ausgabe für die Arduino-IDE ein und analysiere die Ergebnisse wie hier und hier mit Modul
vielleicht auch parallel mit dem IAQ-Sensor von AMS.
 
« Letzte Änderung: 29 Oktober 2017, 19:25:16 von juergs »

Offline KölnSolar

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3499
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #13 am: 29 Oktober 2017, 19:21:05 »
Zitat
Ich müsste mal die Fenster zu lassen, bis ich umkippe, um den Grenzwert zu ermitteln  
Beim CO2-Sensor(Velux etc.) genügen 1-2 Zigaretten  ;)
RPi3/2 Stretch-STV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-CUL868-FS20A4-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty-Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)

Offline juergs

  • Hero Member
  • *****
  • Beiträge: 1384
Antw:Funksensor mit Bosch sensortec BME680 / Luftgüte
« Antwort #14 am: 29 Oktober 2017, 19:26:14 »
Zitat
genügen 1-2 Zigaretten
Das beste Beispiel für VOCs (Organic Volatile Compounds)  :)

CO2-LED-Ampelanzeige: (bis 800 ppm: grün, 800-1200 ppm: gelb, über 1200 ppm: rot)
« Letzte Änderung: 29 Oktober 2017, 19:57:31 von juergs »