Forum: Mikrocontroller und Digitale Elektronik Wer verwendet BME 680 ?


von Ludger (Gast)


Lesenswert?

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

von H. D. (lactobacillus)


Lesenswert?

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.

von Ludger (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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?

von Ludger (Gast)


Lesenswert?

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

von Christian S. (solder)


Lesenswert?

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.

von FrankF (Gast)


Lesenswert?

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

von Ludger (Gast)


Angehängte Dateien:

Lesenswert?

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

von kyrk.5 (Gast)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

von kyrk.5 (Gast)


Lesenswert?

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....

von FrankF (Gast)


Lesenswert?

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;
}

von Frank F. (frank_f49)


Lesenswert?

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
von Ludger (Gast)


Lesenswert?

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

von kyrk.5 (Gast)


Lesenswert?

@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 :)

von Wolfgang (Gast)


Lesenswert?

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

von Ludger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.