HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 06.10.2020, 19:10

Zwei Dateien hatte ich vergessen anzufügen:

1. CSV Datei des CCU Historian:
historian.csv
(238.78 KiB) 36-mal heruntergeladen
2. bash Skript zur Anpassung obiger CSV Datei (Linux OS):
csv_convert_historian.bsh.txt
(398 Bytes) 40-mal heruntergeladen
Grüße

Ewald

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 06.10.2020, 23:02

FUEL4EP hat geschrieben:
06.10.2020, 19:03
Hallo Zusammen,

Jérômes Ratschlag folgend wandte ich mich an 'funkleuchtturm' im Forum, um Erfahrungen bezüglich der Variation zwischen verschiedenen BME680 Sensoren auszutauschen, siehe auch viewtopic.php?f=31&t=60671#p603732.
Eugen gab ein paar gute grundsätzliche Hinweise, Details und Erfahrungswerte seiner AirSniffer Lösung teilte er leider nicht.

Drum habe ich meine alten Statistikkenntnisse ausgegraben und zuerst mal mit Python viel Statistik betrieben.
Ziel war es herauszufinden,
1. ob für den BME680 Sensor eine Korrektur der Luftfeuchtigkeit notwendig und möglich ist
2. ob für den BME680 Sensor eine Korrektur der Temperatur notwendig und möglich ist
3. ob eine logarithmische Umrechnung der Luftgüte zu einer verständlicheren Darstellung führt

Alle drei Punkte sind von 'funkleuchtturm' als notwendig postuliert worden. Ergebnis ist, dass diese drei Punkte Sinn machen.

Für die beiden Punkte 1. und 2. wende ich die Methode der multiplen linearen Regression an:

https://de.wikipedia.org/wiki/Multiple_ ... Regression

In Python gibt es dazu sehr mächtige Analysewerkzeuge im Modul 'sklearn'. Falls ihr in Details interessiert seid, fragt bitte.

Nun ein wenig Mathematik und Statistik:

Für die Estimierung des BME680 Gaswiderstands Rprediction wird ein linearer Zusammenhang von der absoluten Luftfeuchtigkeit aH und der Temperatur Temp angenommen:

multiple_linear_regression_formulas.png

Der korrigierte Gaswiderstand ergibt sich als Differenz des gemessenen Rohgaswiderstands und der Estimierung.

Danach wird der korrigierte Gaswiderstand normalisiert auf den Wertebereich 0..100.

Schließlich wird die Luftgüte (air quality level) durch Logarithmusbildung aus dem normalisierten korrigierten Gaswiderstand berechnet.

Nun zu den Ergebnissen:

Bisher hat der Sketch 'HB-UNI-Sen-IAQ' nur normalisierte Rohgaswiderstände ohne Korrektur des Einflusses der Luftfeuchtigkeit und der Temperatur ausgegeben:

air_quality_level_org.png

Alle drei Sensoren liegen direkt nebeneinander auf einer Fensterbank im ersten Stock meines Hauses. Ursache für schlechte Luftqualität sind:
Öffnen des Fensters, 'Mief' der Innenräume wird nach draußen gelüftet, Holzofenbrand in der Nachbarschaft, Kochgerüche aus einem darunter liegenden Mauerkastenablüfter der Küche.

Nach der Korrektur der Einflüsse von der absoluten Luftfeuchtigkeit und der Temperatur und logarithmischer Berechnung ergeben sich Luftgüten (air quality level) mit dem kontinuierlichen Wertebereich 0..4:


air_quality_level.png

Dadurch dass die Korrektur der Einflüsse von der absoluten Luftfeuchtigkeit und der Temperatur für jeden BME680 Sensor individuell gemacht wird, liegen die Kurven für die logarithmischen Luftgüten viel besser aufeinander als die nicht korrigierten bisherigen Kurven. Die hier gezeigten Kurven sind von Messwerten über 48 Stunden abgeleitet.

Die Analysen und Berechnungen mit Python wurden in einem interaktiven JupyterLab Notebook

https://jupyterlab.readthedocs.io/en/stable/

durchgeführt.
Hier der Bildschirmabzug davon als PDF:


Multiple linear regression for BME680 gas readings.pdf

Die verwendete Jupyter Notebook Datei ist hier (Suffix txt bitte entfernen)

Multiple linear regression for BME680 gas readings.ipynb.txt

Die absolute Luftfeuchtigkeit läßt sich innerhalb eines Arduino Sketches aus Temperatur und relativer Luftfeuchtigkeit berechnen.
Damit haben wir alles zusammen, um die oben beschriebenen Korrekturberechnungen in der Arduino MCU durchzuführen.

Ich werde die Statistiken noch ein paar Tage verfolgen und auf Konsistenz prüfen.
Dann werde ich den bisherigen Sketch HB-UNI-Sen-IAQ nur für eine ATMega1284P MCU mit den obigen Formeln anpassen und dann Euch zum Test zur Verfügung stellen. Wie bereits mehrfach diskutiert, hat die 328P Lösung zu wenig Speicherplatz. Daher verwende ich den Tindie Pro Mini XL - v2 - ATmega 1284p
https://www.tindie.com/products/promini ... ega-1284p/

Fragen, Anregungen und konstruktive Rückmeldungen sind willkommen.
Grüße

Ewald

hmpatman
Beiträge: 64
Registriert: 13.04.2016, 19:06
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 7 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von hmpatman » 29.11.2020, 17:30

Hallo!

Wie ist denn der Status von dem Projekt? Ich hab hier noch 2 BME680 an einem ATmega328p liegen und frage mich gerade ob ich da zu einem brauchbaren Sensor komme. Hab den ganzen Thread nochmal gelesen, bin mir aber nicht sicher, was jetzt der Letztstand (was die Library angeht) ist und ob jemand schon brauchbare Messwerte erzielt hat. Ich wollte als vergleich mal die BSEC library nehmen, aber die gibt es für den 328p nicht.
Ich helfe gerne mit, aber wenn der Schwung draußen ist, überlege ich ein Breakout board mit SGP40 zu organisieren, da der die Werte schon korrigiert liefert (für Dummies B-))

Danke,
Patrick

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 29.11.2020, 18:11

Hallo hmpatman,

nachdem ich viel Zeit mit der gestern Abend erfolgreichen Suche nach einer kalten Lötstelle in einem meiner 3 Sensoren verbracht habe, kann es jetzt weiter gehen. Bisher hatte sich der Sensor mit der kalten Lötstelle immer beim Lüften bedingt durch den Temperatursprung selbst zurückgesetzt.

Nun kann es endlich weiter gehen :D

Der aktuelle Status ist wie folgt:

Software für einen Atmega1284P (328P wird nicht mehr unterstützt!!) ist gerade fertig geworden, aber in der neuesten Version noch nicht voll geprüft. Ich habe die Genauigkeit der Luftfeuchtigkeitsausgabe auf 0.1% erhöht. Der Sensor gibt das her. Die absolute Luftfeuchte aLF wird nun im Sensor direkt aus T und rLF berechnet.
Die Parameter der multilinearen Regression können nun über das WebUI eingegeben werden. Der Kalibrierprozessalgorithmus wurde verbessert und es ist jetzt nur noch notwendig den Sensor a) guter Luft und b) schlechter Luft, z.B. Schnaps, auszusetzen. Alles weitere Kalibrierschritte sind nun automatisch und können z.B. im CCU Historian verfolgt und kontrolliert werden.

Ein dediziertes Addon ist fertig, auch hier muss die letzte Version noch validiert werden.

Die iPython Skripte für die Multilineare Regression müssen noch von 3 Sensoren auf 1 Sensor angepasst werden. Das ist nur Arbeit :D
und die Ergebnisse zu bewerten.

Ich plane dann, zuerst mal 1 Woche Daten zu sammeln und dann die multilineare Regression durchzuführen.
Nach erfolgreicher Validierung werde ich ein Repository unter Github zur Verfügung stellen.

Meine Zwischenergebnisse sehen vielversprechend aus und ich bin zuversichtlich, dass wir nun vernünftige Sensorwerte für die Luftgüte bekommen.
Meine drei Sensoren zeigen nun einen weitgehend synchronen relativen Widerstandsverlauf, wenn sich auch die absoluten Werte deutlich unterscheiden.

Es wird zwei interpretierte Messwerte als Ausgabe geben:

1. Skalierter Gaswiderstandswert (0..100%) ohne Korrektur der Einflüsse von Temperatur und absoluter Luftfeuchte (=Beladung)
2. Logarithmierter (LOG10) (0.0..4.0) Luftgüteindex MIT Korrektur der Einflüsse von Temperatur und absoluter Luftfeuchte durch multilineare Regression.

Wer will, kann auch noch LEDs zur Signalisierung anbringen. Das geht dann aber sehr auf den Stromverbrauch und ein Batteriebetrieb ist dann nicht mehr möglich.

Die ClosedCube BME680 Bibliothek braucht auch noch einen Update, da Bosch in dem BME680 Datenblatt V 1.4 im Juni 2020 noch Fehler in den Integer Formeln korrigiert hat. Das habe ich bereits in meiner lokalen ClosedCube BME680 Bibliothek nachgezogen. Release steht noch aus.

Ich bin mir nicht sicher, ob beim SGP40 auch eine Korrektur der Einflüsse von Temperatur und absoluter Luftfeuchte (=Beladung) notwendig ist und gemacht wird. Ich habe, glaube ich, einen SGP40 Sensor in der Bastelkiste ..

P.S.: Ich habe auch noch vor, Korrelation des VOC Werts mit dem CO2 Wert gemessen mit einem Sensirion SCD30, siehe viewtopic.php?f=76&t=60067&hilit=SCD30, zu machen. Der SCD30 Sensor steht direkt neben meinen drei BME680 Sensoren.
Auch für diesen Sensor wird es ein Update geben.
Zuletzt geändert von FUEL4EP am 29.11.2020, 18:17, insgesamt 1-mal geändert.
Grüße

Ewald

hmpatman
Beiträge: 64
Registriert: 13.04.2016, 19:06
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 7 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von hmpatman » 29.11.2020, 18:17

Hallo Ewald!
FUEL4EP hat geschrieben:
29.11.2020, 18:11
Nun kann es endlich weiter gehen :D
Ok, cool, kann ich irgendwie helfen? Wie gesagt, ich hab 2 AskinPP Boards mit BME680 herumliegen, denen fad ist. :)

EDIT:
Hab übersehen, dass du geschrieben ahst, dass der 328p nicht mehr unterstützt wird. Speicherplatzproblem oder Supportproblem?
Der SGP40 hat laut https://github.com/Sensirion/embedded-s ... /tag/7.1.0 eine Funktion

Code: Alles auswählen

sensirion_measure_voc_index_with_rh_t
die

Code: Alles auswählen

This command ... also returns the measured ambient humidity and temperature used for compensation.

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 29.11.2020, 18:34

Hallo Patrick,

ja gerne. Du kannst Dich an der Validierung beteiligen. Wie gesagt, ich unterstütze aus Speicherplatzgründen nur noch die Atmega1284P MCU. Konkret nutze ich den Pro Mini XL - v2 - ATmega 1284p von Tindie: https://www.tindie.com/products/promini ... ega-1284p/, da das mit dem Löten bei mir nicht mehr so gut klappt :D

Hier der Speicherbedarf des aktuellen Sketches:

Code: Alles auswählen

Der Sketch verwendet 37760 Bytes (29%) des Programmspeicherplatzes. Das Maximum sind 130048 Bytes.
Globale Variablen verwenden 1518 Bytes (9%) des dynamischen Speichers, 14866 Bytes für lokale Variablen verbleiben. Das Maximum sind 16384 Bytes.
Ich könnte Dir auf Github in den nächsten Tagen eine Vorabversion zur Verfügung stellen. Ist das OK für Dich?

Es wäre prima, wenn mir mehr Erfahrungswerte mit der statistischen Streuung der BME680 Sensoren gewinnen könnten.

Eine multilineare Regression in einem Sensor durchzuführen, halte ich wegen der dafür notwendigen HW-Resourcen für nicht darstellbar. Aber ich lass mich gerne vom Gegenteil überzeugen ..

Übrigens lässt sich die multilineare Regression einfach online durchführen. Unter https://hub.gke2.mybinder.org/user/jupy ... wyyqgl/lab steht eine online JupiterLab Installation zur Verfügung. Dorthin muss 'nur' der CCU Historian CSV File und der der iPython Script hochgeladen werden. Eine eigene, manchmal nicht ganz einfache Installation von Jupyterlab entfällt damit :D . Die 3 Regressionsparameter können aus den Ergebnisdaten einfach entnommen werden und dann im WEBUI eingegeben werden. Dazu wird es eine ausführliche Anleitung geben ..

Weiterhin ist geplant, zu testen, ob eine Geruchserkennung möglich ist, z.B. mit https://towardsdatascience.com/an-intro ... 17f314aa79. Das ist aber noch eine lange Strecke des Wegs dahin .. Wer Interesse hat, kann da auch gerne mitmachen.
Grüße

Ewald

hmpatman
Beiträge: 64
Registriert: 13.04.2016, 19:06
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 7 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von hmpatman » 30.11.2020, 07:45

FUEL4EP hat geschrieben:
29.11.2020, 18:34
Wie gesagt, ich unterstütze aus Speicherplatzgründen nur noch die Atmega1284P MCU.
Ok, verstanden, ich schau mir das mal mit meinen Knoten an, sonst muss ich mir glaube ich einen neuen basteln, da ich so tmStamp von TomMajor habe und das ist so klein, dass ich glaube ich den ATmega nicht zerstörungsfrei tauschen kann.
FUEL4EP hat geschrieben:
29.11.2020, 18:34
Ich könnte Dir auf Github in den nächsten Tagen eine Vorabversion zur Verfügung stellen. Ist das OK für Dich?
Passt perfekt!
FUEL4EP hat geschrieben:
29.11.2020, 18:34
Es wäre prima, wenn mir mehr Erfahrungswerte mit der statistischen Streuung der BME680 Sensoren gewinnen könnten.
Ich habe übrigens seit Jahren so einen AMS IAQ core in Betrieb https://de.rs-online.com/web/p/luftgute ... n/1024162/ da spart man sich jede Umrechnung, allerdings bin ich mir nicht sicher, ob der nicht Luftfeuchte abhängig ist. Manchmal hab ich den Eindruck. Bin dem aber nie nachgegangen.
FUEL4EP hat geschrieben:
29.11.2020, 18:34
Eine multilineare Regression in einem Sensor durchzuführen, halte ich wegen der dafür notwendigen HW-Resourcen für nicht darstellbar. Aber ich lass mich gerne vom Gegenteil überzeugen ...
Übrigens lässt sich die multilineare Regression einfach online durchführen.
Kann ich nicht sagen, aber ich schau mir auch den Code vom SGP40 Treiber mal an und dann deine Methode mit Messwerten!
FUEL4EP hat geschrieben:
29.11.2020, 18:34
Weiterhin ist geplant, zu testen, ob eine Geruchserkennung möglich ist, z.B. mit https://towardsdatascience.com/an-intro ... 17f314aa79. Das ist aber noch eine lange Strecke des Wegs dahin .. Wer Interesse hat, kann da auch gerne mitmachen.
Uuuh, nice! Das klingt nach einer Aufgabe! :-D

Viele Grüße,
Patrick

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 30.11.2020, 11:17

Hi Patrick,

OK, lass uns das gemeinsam angehen :D

Leider hat sich mein dritter Sensor heute Morgen beim Querlüften wieder selbst zurückgesetzt. Offensichtlich habe ich die Fehlerursache noch nicht beseitigt. Die zur Zeit tiefen Außentemperaturen erlauben, den Effekt durch wechselweises Platzieren des Sensors draußen und drinnen zu reproduzieren:

[Edit 30. Nov 15:38] Fehler gefunden: Es war die Lötstelle eines Batteriehalters. Der Batteriehalter war nicht plan mit Spannung eingelötet worden. Das ist nun korrigiert. Der Reset erklärt sich durch kurzfristigen Spannungsausfall. Nun übersteht der Sensor mehrerer Wechsel von +30Grad (Ofen) auf ca. 1 Grad (außen).
Autoreset.png
Dargestellt sind hier der Gaswiderstand und die mit Spitzendetektoren bestimmten Minimal- und Maximalgaswiderstände. Die Minimal- und Maximalgaswiderstände klingen mit einer Zeitkonstante von 2 Wochen auf 30% / 70% der absolut gemessenen Min/Max-Widerstände ab. Das ist Teil des Autokalibriervorgangs. Ein Autoreset kann daran erkannt werden, dass der Minimumgaswiderstand gleich dem Maximalgaswiderstand gesetzt wird. Das passiert in der Software nur beim init-Prozess.

Ich werde nun mit den beiden 'guten' Sensoren fortfahren und beim dritten Sensor weiter versuchen, die Ursache für den Autoreset zu finden.

Das Validierungsprogramm kann nun wie geplant fortgeführt werden :D

Sobald eine Vorabversion der Software auf github hochgeladen sein wird, werde ich mich wieder melden.
Grüße

Ewald

FUEL4EP
Beiträge: 436
Registriert: 01.11.2017, 17:26
Hat sich bedankt: 64 Mal
Danksagung erhalten: 52 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von FUEL4EP » 29.12.2020, 18:17

Hallo Zusammen,

auf Github gibt es nun ein Release des Luftqualitätssensors HB-UNI-Sensor1-AQ-BME680:

README.md

Github Repository

Benötigtes Addon hb-ep-devices-addon

Dieses Release hat viele neue Features, siehe README.md.

Die Kompensation des Einflusses von Temperatur und Luftfeuchte wird noch mit einer externen Multiplen Linearen Regression gemacht. In einem bald folgenden Derivat wird die lineare Regression dann intern im ATmega1284P mit einem Kalman Filter berechnet werden. Den Python Code könnt Ihr Euch schon mal anschauen.

Der Sensor ist autokalibrierend: Außer regelmäßigem Lüften ist keine weitere Kalibrierung notwendig, kann aber optional gemacht werden. Nach mehreren Tagen sollte der Sensor sich selbst kalibriert haben. Die Autokalibrierung kann z.B. im CCU Historian verfolgt werden.

Alle Kalibrierparameter werden regelmäßig im EEPROM des ATmega1284P gespeichert. Bei Batteriewechsel werden die Parameter aus dem EEPROM restauriert und bleiben damit erhalten.

Ein Teil der Dokumentation ist auf Englisch, da ich das so gewohnt bin. Ich hoffe, dass das so OK ist.

Ich bin interessiert an Euren Erfahrungen mit dem Sensor, entweder im Forum oder auch gerne als PN.

Viel Spaß beim kontrollierten Lüften.
Grüße

Ewald

guny74
Beiträge: 46
Registriert: 22.01.2017, 18:08
Hat sich bedankt: 2 Mal

Re: HB-UNI-Sen-IAQ - Luftgütemessung mit BME680

Beitrag von guny74 » 22.12.2021, 08:35

Hallo,

ich habe bei diesem DIY Projekte https://technikkram.net/blog/2018/05/30 ... -eigenbau/ mit Tausch des Sensors zu einem BME680 mit dem Sketch von Jerome ebenfalls einen Luftgüte Sesnsor gebaut.

Jetzt hat dein Sketch ja noch eine paar mehr feature und Autokorrekturen / offsets etc.

1. Da bei mir ja ein Arduino Pro Mini zum Einsatz kommt, kann Dein Sketch dennoch verwendet werden ?
2. Sollte man dann die "neuere" Variante mit Kalman Filter nehmen ?

Vielen Dank

Gruss
Thorsten

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“