Hallo,
Ich habe 2 BME680 - Breakout's von Watterott.
Temperatur + Luftfeuchte sind in Ordnung, der Luftdruck liegt ca. 10 hpa
bei 20°C Grad Raumtemperatur zu hoch.
Wird die Platine auf 25°C erwärmt ist auch der Luftdruck ok. Die
Temperatur-Kompensation scheint also nicht zu funktionieren.
Ich verwende die orginal Bosch-API.
Für mich gibt es im Moment nur 2 Möglichkeiten :
die Bosch API hat ein Problem oder
die Kalibrierwerte in den Sensoren sind falsch.
Hat jemand Erfahrung mit dem Sensor ?
Ludger
Hallo Ludger,
der Sensor ist sehr neu, vermutlich sindErfahrungen also eher dünn.
Aus Erfahrungen mit anderen BMEx80-Sensoren weiß ich, dass die
Berechungen ein wenig tricky sind. Poste doch mal deinen Code.
Vermutlich liegt es am Ende an den Compilereinstellungen.
Hallo lactobacillus,
der Code ist lang, und es ist der unveränderte BOSCH-Code.
Ich hab den Kompensations-Code mit Excel nach vollzogen und es kommen
die gleichen falschen Werte heraus. Des weiteren habe die
Datenübertragungen
auf dem I2C BUs gemessen - dort sich die gleichen Werte zu sehen wie in
meinem Programm. Ein Auslese-Fehler scheidet danach wohl auch aus.
Die Doku zu dem Ding sind etwas SEHR schwach.
Ludger
Ludger schrieb:> Ich habe 2 BME680 - Breakout's von Watterott.> Temperatur + Luftfeuchte sind in Ordnung, der Luftdruck liegt ca. 10 hpa> bei 20°C Grad Raumtemperatur zu hoch.
Woher hast du deinen Kalibrierwert für den Luftdruck?
Hallo Wolfgang,
als Vergleichswert läuft hier seit Jahren ein BMP180, dessen Werte
passen sehr gut zu den Wetterstationen Essen + Münster-Osnabrück.
Auch mein Garmin-GPS passt zum alten BMP 180.
Nur der neue BME680 passt NUR wenn die Raumtemperatur 25°C ist.
Ludger
Wetterstationen geben ihren Luftdruck immer auf Höhe 0 reduziert an,
damit man diese vergleichen kann. Wenn der BMP180 das von sich aus
macht, dann misst er falsch. Ich habe den BME280 im Einsatz und rechne
selbst den Höhenunterschied von 100m heraus. Erst dann passt der Wert
zur nächsten Wetterstation.
schon lustig, das erste Posting sagt daß
der gemessene Druck bei 20°C 10pPa anders
ist als bei 25°C.
Die Schlussfolgerung daß die Temperaturkompensation nicht funktioniert
ist korrekt: wenn sie funktioniert sollte der angezeigte
Druck bei beiden Temperaturen derselbe sein, also 10hPa daneben.
10hPa sind 1% Fehler vom Endwert : das liegt voll im
Bereich der Toleranz solcher Sensoren und sollte einem nicht
den Tag versauen.
Das Datenblatt sagt zwar 0.25% , nicht 1% ,
https://www.bosch-sensortec.com/bst/products/all_products/bme680
aber da glaub ich nicht dran.
Vielleicht einfach auch mal mit dem oversampling setting rumspielen,
https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
Hallo FrankF
der Sensor hat lt. Datenblatt eine abs. Genauigkeit von +-0.6 hpa
typisch.
Das war ja auch der Grund die Sensoren zu kaufen. Beide haben in etwa
den
gleichen Fehler.
@ Christian Sch.
die Höhen sind natütlich berücksichtigt.
Auf der Grafik sieht die Wetterstationen, und mein BMP180 als schwarze
Linie. Die rote Linie ist die Temperatur des BMP180, da funktioniert die
Kompensation.
Ludger
Hallo,
habe in den C Code schnell reingeschaut. Mir ist aber nicht klar wo hier
auf Temperatur korrigiert wird:
static uint32_t calc_pressure(uint32_t pres_adc, const struct bme680_dev
*dev)
Hier sehe ich nichts was darauf andeuten würde. Also im C Code wird das
meiner Meinung nach nicht gemacht.
Im Datenblatt wird die Temp-Kompensation erwähnt. Da steht auch dass das
nur dann tut wenn man auch die Temperatur auch messen lässt. Sollte aber
so sein denn
static int8_t read_field_data(struct bme680_field_data *data, struct
bme680_dev *dev) macht das so. Da steht das man auch die oversampling am
besten einschaltet einschaltet.
Laut Datenblatt:
offset temperature coefficient +-1.3 Pa/K
Heisst das bei 5 Grad unterschied 6,5Pa unterschied noch OK ist? Wobei
bei 10hPa unterschied der 6,5Pa nicht viel ausmacht...
Dann ist ja noch die Frage wenn der Luftdruck mit Temperatur korrigiert
wird, dann muss man auch den Ungenauigkeit der Temperaturmessung
einrechnen, oder? Laut Datenblatt bei 25 Grad +-0.5 Grad. Plus Noise was
bei lowest overampling 0.005 Grad sein sollte. Bedeutet Lowest
oversampling das man so viel wie nur möglich sample nimmt und daraus
etwas berechnet? Dann muss man den Oversampling unbedingt einschalten
(auf maximal), damit Temperatur richtig gemessen wird und auch damit gut
kompensierung zu erreichen.
Vermutlich wird es sich so herausstellen das das Sensor entweder sehr
langsam ist aber dabei sehr accurate und prezice Messungen macht, oder
wenn man schneller haben möchte dann wird der nicht so accurate und
prezice.... Würde mich wundern wenn der Bosch sensor nicht funktionieren
sollte.
Also nen typical Wert ist nen Marketingwank Wert, den kann man
ignorieren.
Die Max Werte sind die interessanten.
Beim BME280 zumindest ist die Temperatur eine globale Variable und wird
dann beim Luftdruck berechnen auch direkt mitverrechnet.
Bei der neuen Lib wird warscheinlich nen Wert aus dem struct verrehcnet.
Wo liegen denn die sourcen?
Im BME280 DB waren die Rechednvorschriften als C Code im DB angegeben.
Bei dem Sensor hier seh ichs grade nicht.
siehe : compensates the data
was auch immer das heisst (temperatur?)
* @brief This API reads the pressure, temperature and humidity and gas
data
* from the sensor, compensates the data and store it in the bme680_data
* structure instance passed by the user.
*/
int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct
bme680_dev *dev)
{
int8_t rslt;
/* Check for null pointer in the device structure*/
rslt = null_ptr_check(dev);
if (rslt == BME680_OK) {
/* Reading the sensor data in forced mode only */
rslt = read_field_data(data, dev);
if (rslt == BME680_OK) {
if (data->status & BME680_NEW_DATA_MSK)
dev->new_fields = 1;
else
dev->new_fields = 0;
}
}
return rslt;
}
@Ludger, FrankF: Konnte leider nicht so schnell posten da ich nicht
registriert bin, habt recht...
Was ich posten wollte:
@FrankF: Jetzt habe ich nochmal da reingeschaut. Da wird wirklich
komepenziert. Ich muss mich dann korrigieren.
Durch
static int16_t calc_temperature(uint32_t temp_adc, struct bme680_dev
*dev)
wird
dev->calib.t_fine
gesetzt, was dann bei
static uint32_t calc_pressure(uint32_t pres_adc, const struct
bme680_dev *dev)
Auswirkungen auf den Luftdruck hat.
Daher ja es wird in der C Code kompensiert :)
FrankF schrieb:> 10hPa sind 1% Fehler vom Endwert : das liegt voll im> Bereich der Toleranz solcher Sensoren und sollte einem nicht> den Tag versauen.
Der BME680 hat die Angaben im zugehörigen Datenblatt einzuhalten und mit
deinen Vorstellungen von "solchen Sensoren" nichts zu tun.
Im Datenblatt steht als Angabe zur Absolutgenauigkeit des Drucks ein
typischer Wert von ±0.6 hPa im Bereich 300-1100hPa zwischen 0 und 65°C.
Leider verweigert Bosch an dieser Stelle eine Angabe zum maximalen
Fehler.
https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
Hallo,
es gibt etwas Neues. Ich hab noch eine ältere LIB gefunden vom 5. Mai
2017.
Diese LIB rechnet in double, und hat andere Rechenschritte, damit habe
ich eine konstante Abweichung im
Bereich von 20°C - 40°C von ca. 2.5hpa
Ludger