Forum: Mikrocontroller und Digitale Elektronik BME680 Druckberechnung viel zu hoch


von Tobias B. (technic)


Lesenswert?

Hallo,
ich verwende die Joy-It "SEN-BME680" Sensorplatine (IIC Schnittstelle) 
an einem Microchip PIC18F46K22 und programmier diesem per mikroC von 
mikroelektronika.
Die Programmierung ist stark angelehnt an das Datenblatt von BOSCH.

Die Temperatur gibt der Controller im Vergleich zu einem KLIMA Logg_Pro 
Sensor (Temp und Luftfeuchte) ok aus und die Luftfeuchte ist 
grundsätzlich etwa 6%RH zu hoch (auch noch ok). Den Luftdruck gibt er 
ziemlich hoch aus.
Hab die Berechnung der einfachheit halber mit float gemacht statt 
integer Variante.

Hat jemand von Euch diese Library aus dem Datenblatt erfolgreich in 
Betrieb genommen?
Kann auch gerne, den Quelltext posten.

Für weitere Tipps zur Fehlersuche bin ich offen

Gruss und Danke im Voraus
Tobias

: Verschoben durch Moderator
von Sascha W. (sascha-w)


Lesenswert?

Hallo,

der Luftdruck braucht ja immer eine Höhenkorrektur, ohne ist der 
angezeigte Wert zu niedrig - ist da in der Lib vielleicht standartmäßig 
was hinterlegt?

Sascha

von Wolfgang (Gast)


Lesenswert?

Tobias B. schrieb:
> Den Luftdruck gibt er ziemlich hoch aus.

Was heißt das?
Ein Faktor 10/100/1000 oder 10hPa?
Was verwendest du als Vergleichswert?

von Klaus R. (klara)


Lesenswert?

Sascha W. schrieb:
> der Luftdruck braucht ja immer eine Höhenkorrektur, ohne ist der
> angezeigte Wert zu niedrig

Höhenkorrektur, mußte ich auch erst einmal lernen. Der Deutsche 
Wetterdienst bietet hier Hilfe.

https://www.dwd.de/DE/service/lexikon/begriffe/B/Barometrische_Hoehenformel_pdf.pdf?__blob=publicationFile&v=4

Ich habe einen BME280 und konnte den Luftdruck gut nachvollziehen.

Nachtrag: Der Sensor liefert schon den richtigen, örtlichen Luftdruck. 
Die Wettervorhersagen beziehen sich immer auf Meereshöhe!

mfg Klaus

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Klaus R. schrieb:
> Sascha W. schrieb:
>> der Luftdruck braucht ja immer eine Höhenkorrektur, ohne ist der
>> angezeigte Wert zu niedrig
>
> Höhenkorrektur, mußte ich auch erst einmal lernen. Der Deutsche
> Wetterdienst bietet hier Hilfe.

Der Sensor soll mit dem im DB angegebenen Algorithmus den absoluten 
Druck auswerfen. Ich nehme nicht an, dass Tobias irgendwo am Toten Meer 
wohnt.

Tobias B. schrieb:
> Den Luftdruck gibt er ziemlich hoch aus.

von Klaus R. (klara)


Lesenswert?

Wolfgang schrieb:
> Der Sensor soll mit dem im DB angegebenen Algorithmus den absoluten
> Druck auswerfen.

Ich habe bei Joy-it im Datenblatt nachgeschaut. Da wird keine Formel auf 
geführt. In der Anleitung ebenfalls nicht.

Was ist denn der absolute Druck?

https://www.dwd.de/DE/fachnutzer/luftfahrt/download/produkte/runwaymap/06_luftdruck_und_standardatmoshaere.pdf?__blob=publicationFile&v=2

Schauen wir doch mal wieder beim DWD nach.
1
Reduktion des Luftdruckes
2
Der Luftdruck ist also höhenabhängig. Will man Luftdruckwerte, die am Boden  aber nicht zwangsläufig in Meereshöhe  gemessen worden sind, miteinander vergleichen, so muss man die Höhenabhängigkeit herausrechnen und den Luftdruck auf Meereshöhe reduzieren.  Nur damit  sind gemessene Luftdruckwerte vergleichbar.

Der Sensor weiß ja nicht wo er gerade ist. Er kann also nur den 
Luftdruck messen an dem er sich befindet.

Ich habe meine Werte des BME280 mit Wetterdaten eines Wetterdienstes 
vergleichen wollen. Erst als ich die barometrische Höhenformel angewandt 
habe näherten sich die Werte zu meiner Zufriedenheit.

Tobias sollte mal mit den Daten des Agrawetter - Dienstes vergleichen 
und natürlich die Höhenformel verwenden.

https://www.agrarwetter.net/

mfg klaus

von Wolfgang (Gast)


Lesenswert?

Klaus R. schrieb:
> Was ist denn der absolute Druck?

Das ist die Druckdifferenz zum Vakuum.

von J. -. (Gast)


Lesenswert?

Aus den Infos vom deutschen Wetterdienst habe ich folgende Prozedur für 
einen STM32 gemacht (Partialdruck H2O bzw. Luftfeuchte geht auch mit 
ein):
1
uint16_t DEV_GetPressureNN(uint16_t abspressure, int16_t temperature, uint16_t humidity, int16_t altitude)
2
// INPUT: [ zum Beispiel pNN = DEV_GetPressureNN(9946,273,446,240) = 10200 ]
3
{  // abspressure in Pa/10 (9946 <- 994.6mbar bzw hPa)
4
  // temperature in °C*10  (273 <- 27.3°C)
5
  // humidity  in %*10  (446 <- 44.6% rH)
6
  // altitude in m
7
  // OUTPUT: NN-pressure in Pa/10 (9946 -> 994.6mbar bzw hPa)
8
9
  uint16_t relpress=0;  //relative pressure (NN)
10
11
  float E,th,h,ph;
12
  th=((float)temperature)/10;    // °C
13
  h=(float)altitude;        // m
14
  ph=((float)abspressure)*10;    // Pascal
15
16
  if (humidity!=0)
17
  {
18
    float rH;
19
    rH=((float)humidity)/1000;  //100% -> 1.0
20
    E=rH*6.11213*exp(17.5043*th/(241.2+th));
21
  }else{
22
    if (temperature<91)  // <9.1°C
23
    {
24
      E = 5.6402*(-0.0916+0.06*th);
25
    }else{
26
      E = 18.2194*(1.0463-0.0666*th);
27
    }
28
  }
29
30
  relpress = (uint16_t)((ph*exp(9.80665*h/(287.05*(th+273.15+0.12*E+0.0065*h/2))))/10);  // in Pascal/10
31
  return relpress;//(uint32_t)(ph*exp(9.80665*h/(287.05*(th+273.15+0.12*E+0.0065*h/2))));  // Pascal
32
}
Die Höhe habe ich aus Google Earth.
Druckwerte stimmen sehr gut mit der lokalen Wetterwarte überein, 
üblicherweise < 1mbar Abweichung

von Klaus R. (klara)


Lesenswert?

Jürgen S. schrieb:
> Aus den Infos vom deutschen Wetterdienst habe ich folgende Prozedur für
> einen STM32 gemacht

Kannst Du uns die Quelle angeben?
mfg Klaus

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Klaus R. schrieb:
> Der Sensor weiß ja nicht wo er gerade ist. Er kann also nur den
> Luftdruck messen an dem er sich befindet.

Aber Tobis wird ziemlich sicher wissen, dass er sich nicht unter dem 
Meeresspiegel befindet. Seine zu hohen Druckwerte lassen sich also nicht 
damit erklären, dass er mit offziellen Wetterdaten vergleicht und dabei 
die Höhenkorrektur vergessen hat.

von Klaus R. (klara)


Lesenswert?

Wolfgang schrieb:
> Seine zu hohen Druckwerte lassen sich also nicht
> damit erklären, dass er mit offziellen Wetterdaten vergleicht und dabei
> die Höhenkorrektur vergessen hat.

Tobias B. schrieb:
> Für weitere Tipps zur Fehlersuche bin ich offen

Ich sehe meinen Hinweis als einen Weg den Fehler besser einzugrenzen. 
Wer sagt denn das Tobias KLIMA Logg ProSensor richtig und genauer mißt? 
Immerhin ist der BME680 nicht unter 20 € zu bekommen.

Um da weiter zukommen würde ich in der Tat einen BME280 vergleichsweise 
testen. Die Frage ist so und so, was war bei Bosch eher da? Der BME280 
oder der BME680? Ich denke, im BME680 wird viel vom BME280 
wiederzufinden sein.

Interessant wären Meßreihen beider Sensoren zu vergleichen und dies noch 
mit den stündlichen Werten des Agrarwetter. Wobei ich mir vorstellen 
kann, daß die die Daten des DWD nutzen. Durch diese systematische 
Vorgehensweise kommt man zumindest weiter. Bei Conrad könnte man dann 
sicher reklamieren. Beim Chinesen sieht es da vermutlich anders aus.

mfg Klaus

von J. -. (Gast)


Lesenswert?

Klaus R. schrieb:
> Kannst Du uns die Quelle angeben?
https://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel
Dort unter "Reduktion auf Meereshöhe" wird die vom Deutschen 
Wetterdienst empfohlene Reduktionsformel aufgeführt.

Den Druck sollte man bei den BME/BMP-Sensoren eigentlich als uint32_t 
berechnen. Für meine Zwecke brauche ich es aber nicht so präzise, eine 
Nachkommastelle reicht.

Edit: Mir ist gerade aufgefallen, daß bei den Werten für den Druck ohne 
bekannte Luftfeuchte noch Fehler ist, es muß bei humidity == 0 heißen
1
    if (temperature<91)  // <9.1°C
2
    {
3
      E = 5.6402*(-0.0916+exp(0.06*th));
4
    }else{
5
      E = 18.2194*(1.0463-exp(-0.0666*th));
6
    }

von Tobias B. (technic)


Lesenswert?

Hi,
danke für euren Zahlreichen Beiträge.

-Der compensierte Druckwert der ausgegeben wird laut DB ist in Pa.
Der aktuell errechnete Wert ist 152300 Pa --> 15230hPa. Faktor 15x
Da die gültige Ausgabe zwischen 300 und 1100 hPa liegt, muss was an der 
Berechnung oder am Chip liegen.

-Benutze keine Höhenformel bzw. Vergleichsert.

- Wohnort NRW
  1007,8hPa 66,4%RH 12,4°C STand heute Abend. Laut Website die ihr 
gepostet    habt.

Weiter:
- Werde auch den Chip BME280 mal ausprobieren, den hab ich bestimmt 
irgendwo
- Die Druckberechnung mit Integer ausprobieren
- Kann auch den Quelltext mal posten bei Bedarf.

Danke

von Klaus R. (klara)


Lesenswert?

Jürgen S. schrieb:
> Den Druck sollte man bei den BME/BMP-Sensoren eigentlich als uint32_t
> berechnen. Für meine Zwecke brauche ich es aber nicht so präzise, eine
> Nachkommastelle reicht.

Wie machst Du das mit der Berechnung von E, speziell bei 
exp(-0.0666*th)?

Deine Quelle ist wirklich interssant. Meine Quelle dürfte da ungenauer 
sein. Stellt sich nur die Frage, wozu brauche ich den Luftdruck auf 
Meereshöhe?

https://www.dwd.de/DE/service/lexikon/begriffe/B/Barometrische_Hoehenformel_pdf.pdf?__blob=publicationFile&v=4
mfg klaus

von Klaus R. (klara)


Lesenswert?

Tobias B. schrieb:
> Weiter:
> - Werde auch den Chip BME280 mal ausprobieren, den hab ich bestimmt
> irgendwo
> - Die Druckberechnung mit Integer ausprobieren
> - Kann auch den Quelltext mal posten bei Bedarf.

Ich bin gespannt!
mfg Klaus

von J. -. (Gast)


Lesenswert?

Tobias B. schrieb:
> Der aktuell errechnete Wert ist 152300 Pa --> 15230hPa. Faktor 15x
Nö. 152300Pa -> 1523.00hPa. Faktor 1.5x (bzgl. der realen 1007.8hPa)

Irgendwo ist in Deiner Berechnung des absoluten Druckes noch ein Fehler.

@klara
> Wie machst Du das mit der Berechnung von E, speziell bei exp(-0.0666*th)?
Liegt schon länger zurück, und ehrlich gesagt hatte ich immer einen 
rH-Wert != 0, deshalb war mir der Fehler mit der exp-Funktion bei rH = 0 
auch nicht aufgefallen. Es ist nur die math.h im arm-gcc eingebunden, 
ich hoffe mal, die macht das mit exp(-0.0666*th) richtig.

Ansonsten habe ich above sealevel mit Druck bzgl. NormalNull 
gleichgesetzt und da gar nicht drüber nachgedacht, ob NN anders als 
above sealevel definiert sein könnte. Ist das unterschiedlich?

von Klaus R. (klara)


Lesenswert?

Jürgen S. schrieb:
> @klara
>> Wie machst Du das mit der Berechnung von E, speziell bei exp(-0.0666*th)?
> Liegt schon länger zurück, und ehrlich gesagt hatte ich immer einen
> rH-Wert != 0, deshalb war mir der Fehler mit der exp-Funktion bei rH = 0
> auch nicht aufgefallen. Es ist nur die math.h im arm-gcc eingebunden,
> ich hoffe mal, die macht das mit exp(-0.0666*th) richtig.

> Für meine Zwecke brauche ich es aber nicht so präzise, eine
> Nachkommastelle reicht.

Bei "exp(-0.0666*th)" kommst Du mit einer Nachkommastelle aber nicht 
aus.
mfg Klaus

von J. -. (Gast)


Lesenswert?

Klaus R. schrieb:
> Bei "exp(-0.0666*th)" kommst Du mit einer Nachkommastelle aber nicht
> aus.
Achso, ja klar. Mein Ansatz ist so, daß ich Zwischenrechnung mit 
ausreichender oder meinetwegen übertriebener Präzision mache. Ich gehe 
also mit 16 Bit rein, erzeuge mit den floats Zwischenrechnungen, die auf 
jeden Fall präziser als 16bit sind, und gehe dann mit 16bit wieder raus.
Da kommt also kein zusätzlicher Fehler dazu, abgesehen davon, daß man 
noch über das korrekte Runden philosophieren müßte.

Wenn man die Rechnungen auf einem AVR macht, ist das was Anderes. Da 
würde ich dann entweder Taylor entwickeln oder einfachere Formeln 
nehmen.

Die Prozeduren rund um die Barometrische Höhenformel sind übrigens die 
einzigen, wo ich float (bzw. double) einsetze, bin da also kein Experte. 
Alles andere mache ich sonst mit Integerarithmetik.

von Klaus R. (klara)


Lesenswert?

Verstehe, ein pragmatischer Ansatz.
mfg Klaus

von Mic R. (microller)


Lesenswert?

Bosch Sensortec bietet doch die Library als rund-um sorglos Paket an, 
habe ich schon verwendet und gab nie Probleme:
https://github.com/BoschSensortec/BME680_driver
Grüße,
Mic Roller

von Joachim B. (jar)


Lesenswert?

Klaus R. schrieb:
> Der Sensor weiß ja nicht wo er gerade ist. Er kann also nur den
> Luftdruck messen an dem er sich befindet.

könnte er aber wissen wenn man dem µC seine Koordinaten mitteilt
so berechne ich Sonnen -aufgang und -untergang

https://support.google.com/earth/answer/7420934?co=GENIE.Platform%3DDesktop&hl=de

google earth sagt mir ich wohne auf 54m über N.N. gilt natürlich nicht 
im dritten Stock

Wer die Höhe wie die Geokoordinaten in seinem Luftdruckmesser µC also in 
den Sourcecode einbaut hat schon mal gute Vorraussetzungen.

Wenn es nicht im Source kodiert werden soll muss man sich anderes 
überlegen, so ein Druckmesser alleine tut ja nichts, mit µC kann daraus 
aber evtl. Ort und Lage abgeleitet werden.

von Wolfgang (Gast)


Lesenswert?

Joachim B. schrieb:
> könnte er aber wissen wenn man dem µC seine Koordinaten mitteilt
> so berechne ich Sonnen -aufgang und -untergang

Die Koordinaten sagen da herzlich wenig. Stell dir einfach vor, dass der 
Sensor in einem Heißluftballon über diesem Ort fährt ...

von Sebastian S. (amateur)


Lesenswert?

Sorry! Was soll bei der Luftdruckmessung eine Höhenkorrektur?
Das ist doch unsinnig.
Oder nur dann sinnvoll, wenn Du die Fliege machen willst. Also aus dem 
gemessenen Druck auf die (Flug-)Höhe schließen willst.

Soweit mir bekannt sind die meisten Druckmesser Festkörpersensoren. Die 
haben also "ihre" Toleranzen, aber darüber hinaus gibt es nichts zu 
korrigieren.
Hält man sich darüber hinaus an die erlaubten "Umweltbedingungen", sind 
die Teile auch noch sehr robust.

von Wolfgang (Gast)


Lesenswert?

Sebastian S. schrieb:
> Sorry! Was soll bei der Luftdruckmessung eine Höhenkorrektur?
> Das ist doch unsinnig.

Das kommt auf den Anwendungszweck an.
Die einen betreiben eine Wetterstation und wollen ihre Daten in Realtion 
zur Wetterkarte setzten, die anderen wollen eine barometrische 
Höhenmessung machen und brauchen als Input den auf NN korrierten 
Bodendruck (QNH). Und wieder andere wollen auf einem Flugplatz landen 
und wollen mit dem aktuellen Bodendruck am Flugplatz (QFE) vergleichen.

von Sebastian S. (amateur)


Lesenswert?

@ Wolfgang
Gratulation zu Deiner Fähigkeit selektiv zu lesen!

von Joachim B. (jar)


Lesenswert?

Sebastian S. schrieb:
> @ Wolfgang
> Gratulation zu Deiner Fähigkeit selektiv zu lesen!

ja so isser :-)

Wolfgang schrieb:
> Stell dir einfach vor, dass der
> Sensor in einem Heißluftballon über diesem Ort fährt ...

ist klar, schrieb ich auch

Joachim B. schrieb:
> gilt natürlich nicht
> im dritten Stock

oder im Ballon

von Frischluftfanatiker (Gast)


Lesenswert?

Der BME860 ist ja auch ein 'Air quality & well-being indicator'.

Kann an anhand der Sensordaten Aussagen treffen wie: 'es müsste 
eigentlich mal gelüftet werden'?

von Jefe (Gast)


Lesenswert?

Sascha W. schrieb:
> standartmäßig
> was hinterlegt?

standartmäßig ist nie etwas hinterlegt. Eventuell aber standardmäßig.

man man man

von Wolfgang (Gast)


Lesenswert?

JSebastian S. schrieb:
> @ Wolfgang
> Gratulation zu Deiner Fähigkeit selektiv zu lesen!

Es ging um den Unterschied QNH vs. QFE, sorry wenn das nicht deutlich 
genug heraus kam. Beides wären in meinem Beispiel Werte, die auf dem 
Flughafen bestimmt werden - einmal mit und einmal ohne Höhenkorrektur.

Du fragtest doch genau nach dem Sinn einer Höhenkorrektur.

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Frischluftfanatiker schrieb:
> Kann an anhand der Sensordaten Aussagen treffen wie: 'es müsste
> eigentlich mal gelüftet werden'?

Steht im Datenblatt auf Seite 10 und 11.
https://www.bosch-sensortec.com/products/environmental-sensors/gas-sensors-bme680/

Reagiert auf einige Ausdünstungen und Gasdämpfe, die bei Fahrzeugen eine 
Rolle spielen. Auf CO reagiert der Sensor.
Ob und wie er auf CO2 reagiert ist nicht angegeben. Er ist wegen der 
fehlenden CO2 Empfindlichkeit also nur bedingt geeignet. Eine Ergänzung 
um einen CO2 Sensor und Sensor, der auf Furzgase (im Normalfall nimmt 
der Darm diese auf und werden über Lunge mit ausgeatmet) ebenfalls 
reagiert, wäre daher zu empfehlen.


Jefe schrieb:
> standartmäßig ist nie etwas hinterlegt. Eventuell aber standardmäßig.

Es gibt Sensoren, die den Einfluss-Trias von Druck, Temperatur und 
Feuchte bereits intern verrechnen und kompensieren, d.h. es muss nicht 
die externe Verarbeitung über Formeln die Aufgabe erledigen. Der BME 
müßte ein solcher Sensor sein.

Auf der Seite 23 im Datenblatt steht:
After the uncompensated values of temperature, pressure and humidity 
have been read, the actual humidity, pressure and temperature need to be 
calculated using the compensation parameters stored in the device. 
Please refer to the BME6xy API for more details.

Es sind also standardmäßig "compensation parameters stored in the 
device". Z.B. Offsetwerte & Faktoren.

Durchaus möglich, dass der Zugriff auf das Device durch des TO µC 
versehentlich uncompensated nimmt oder eine Fehler beim Lesen der 
Kompensationsparameter macht.

von Tobias B. (technic)


Angehängte Dateien:

Lesenswert?

Hallo,
viel Zeit vergangen seit euren Vorschlägen.

Hab auch den Chip BME280 mal ausprobiert. Dabei hatte ich andersweitig 
Probleme mit der Berechnung der Luftfeuchtigkeit. Statt wie beim BME680 
dem Luftdruck.

Nach langen hin und her bin ich dan auf dem BME680 zurückgeswitcht, da 
bei den drei BME280 nichts einheitlich funktioniert hat (Kalibrierwerte 
verglichen usw.)

Dort habe ich die Berechnung mit Integer und Double erneut ausprobiert 
und auch die Berechungen nachgerechnet. Logik war okay. Allerdings nicht 
das Ergebnis an sich. Nach näheren Recherche hab ich dan rausgefunden 
das ich die Kalibrierwerte alle für den Luftdruck in unsigned short / 
integer ausgelesen habe. Nicht ganz korrekt.

Letzendlich habe ich die Berechnung in float gemacht.
Wie hier zu finden:
"https://github.com/BoschSensortec/BME680_driver/blob/master/bme680.c";

Die Messwerte sind wie folgt. Luftfeuchte ist 8%RH zuviel, ggf. da 
KlimaLogg Pro Sensor eingehaust ist). Luftdruck ist wie beim mobilen 
Sensor an der Smart watch. Ganz zufrieden stellend.

Anzeige PIC:
Sensorplatine --> "Joy-It Sen-BME680"
20,86°C 65,1%RH
63kOhm
999hPa

Anziege KLimaLOGG PRO (Eingehaust Sensor unbekannt)
20,5°C 57%RH

Samsung Galaxy Watch2:
999hPa

Nächster Schritt ist die Logik nachzuprogrammieren um die Luftgüte zu 
ermitteln.
Anhang: Zur Ansicht die kommentierte Version.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.