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.
Hallo, link auf den Source Code habe ich im Datenblatt gefunden: https://github.com/BoschSensortec/BME680_driver (https://www.bosch-sensortec.com/bst/products/all_products/BSEC) Aus dem DB lassen sich die Texte nicht so leicht aus kopieren....
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; }
mal das readme lesen: https://github.com/BoschSensortec/BME680_driver/blob/master/README.md Reading sensor data Example for reading all sensor data struct bme680_field_data data; while(1) { rslt = bme680_get_sensor_data(&data, &gas_sensor); printf("T: %.2f degC, P: %.2f hPa, H %.2f %%rH ", data.temperature / 100.0f, data.pressure / 100.0f, data.humidity / 1000.0f ); /* Avoid using measurements from an unstable heating setup */ if(data.status & BME680_HEAT_STAB_MSK) printf(", G: %d ohms", data.gas_resistance); printf("\r\n"); }
:
Bearbeitet durch User
die Kompensation wird in dieser Routine mit gemacht : /*! * @brief This internal API is used to calculate the pressure value. */ static uint32_t calc_pressure(uint32_t pres_adc, const struct bme680_dev *dev) { int32_t var1; int32_t var2; int32_t var3; int32_t calc_pres; var1 = (((int32_t) dev->calib.t_fine) / 2) - 64000; var2 = ((var1 / 4) * (var1 / 4)) / 2048; var2 = ((var2) * (int32_t) dev->calib.par_p6) / 4; var2 = var2 + ((var1 * (int32_t) dev->calib.par_p5) * 2); var2 = (var2 / 4) + ((int32_t) dev->calib.par_p4 * 65536); var1 = ((var1 / 4) * (var1 / 4)) / 8192; var1 = (((var1) * ((int32_t) dev->calib.par_p3 * 32)) / 8) + (((int32_t) dev->calib.par_p2 * var1) / 2); var1 = var1 / 262144; var1 = ((32768 + var1) * (int32_t) dev->calib.par_p1) / 32768; calc_pres = (int32_t) (1048576 - pres_adc); calc_pres = (int32_t) ((calc_pres - (var2 / 4096)) * (3125)); calc_pres = ((calc_pres / var1) * 2); var1 = ((int32_t) dev->calib.par_p9 * (int32_t) (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096; var2 = ((int32_t) (calc_pres / 4) * (int32_t) dev->calib.par_p8) / 8192; var3 = ((int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) * (int32_t) dev->calib.par_p10) / 131072; calc_pres = (int32_t) (calc_pres) + ((var1 + var2 + var3 + ((int32_t) dev->calib.par_p7 * 128)) / 16); return (uint32_t) calc_pres; } Die Temperatur geht als dev->calib.t_fine mit ein. t_fine ist 128000 bei 25°C. t_fine/2-64000 ist 0, also bei 25°C keine Korrektur. Ludger
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.