Forum: Mikrocontroller und Digitale Elektronik Bosch BME 680 Temperaturberechnung


von Dorfer (Gast)


Lesenswert?

ich habe mir einen Bosch BME680 gekauft.
Datenblatt:
https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
Leider kann ich dem Datenblatt nirgends entnehmen, wie man auf die 
richtige Temperatur kalibriert?
Bei der Gasmessung hingegen sind die entsprechenden Gleichungen 
angegeben. Ich weiß auch nicht wo im Memory die Kalibrierkoeffizienten 
für Druck, Temperatur und Feuchte gespeichert sind?
Ist das jetzt dann einfach analog zum BME280?

von BME680 sensor API (Gast)


Lesenswert?

Vielleicht wirst du aus der API schlau
https://github.com/BoschSensortec/BME680_driver

von FN (Gast)


Lesenswert?

Mit I2C 25 Kalibrierkoeffizienten sind von 0x89 aufsteigend und 16 ab 
0xE1. Außerdem sind wete in 0x00 0x02 und 0x04 gespeichert. Das muss man 
sich leider aus der API frickeln. Ebenso wie die Rechnugen für die 
Messwert kompensationen. Wenn du die brauchst kann ich dauch noch hier 
posten. Wenn ich den Gassensor zu laufen gebracht habe wird es auch ein 
Github projekt geben das evtl verständlicher ist als der Bosch treiber.

Das ist meine Funktion für die Kalibrierkoeffizienten:
1
void getCalibDataBME680()
2
{
3
  int32_t calib[41];
4
  
5
  for(int i = -1; i < 25; i++){                  // Kalibrierkoeffizienten ab 0x89
6
    calib[i] = readBME680(CALIB_ADDRESS_1_BME680 + i);
7
  }
8
  for(int i = -1; i < 16; i++){                  // Kalibrierkoeffizienten ab 0xE1
9
    calib[25 + i] = readBME680(CALIB_ADDRESS_2_BME680 + i);
10
  }
11
12
  // write temperature compensation parameters
13
  par_t1 = (uint16_t) (((uint16_t) calib[34] << 8) | calib[33]);
14
  par_t2 = ( int16_t) ((( int16_t) calib[2] << 8) | calib[1]);
15
  par_t3 = (  int8_t) (calib[3]);
16
  
17
  // write pressure compensation parameters
18
  par_p1 = (uint16_t) ((calib[6] << 8) | calib[5]);
19
  par_p2 = (int16_t) ((calib[8] << 8) | calib[7]);
20
  par_p3 = (int8_t) calib[9];
21
  par_p4 = (int16_t) ((calib[12] << 8) | calib[11]);
22
  par_p5 = (int16_t) ((calib[14] << 8) | calib[13]);
23
  par_p6 = (int8_t) (calib[16]);
24
  par_p7 = (int8_t) (calib[15]);
25
  par_p8 = (int16_t) ((calib[20] << 8) | calib[19]);
26
  par_p9 = (int16_t) ((calib[22] << 8) | calib[21]);
27
  par_p10 = (uint8_t) (calib[23]);
28
  
29
  // write humidity compensation parameters
30
  par_h1 = (uint16_t) (((uint16_t) calib[27] << 4) | (calib[26] & 0x0F));
31
  par_h2 = (uint16_t) (((uint16_t) calib[25] << 4) | (calib[26] >> 4));
32
  par_h3 = (int8_t) calib[28];
33
  par_h4 = (int8_t) calib[29];
34
  par_h5 = (int8_t) calib[30];
35
  par_h6 = (uint8_t) calib[31];
36
  par_h7 = (int8_t) calib[32];
37
  
38
  /* Gas heater related coefficients */
39
  par_gh1 = (int8_t) calib[37];
40
  par_gh2 = (int16_t) ((calib[36] << 8) | calib[35]);
41
  par_gh3 = (int8_t) calib[38];
42
  res_heat_range = (readBME680(RES_HEAT_RANGE_ADDRESS_BME680) & 0x30) / 16;    // 0x02 minus ungenutzte bits
43
  res_heat_val = (int8_t) readBME680(RES_HEAT_VAL_ADDRESS_BME680);    // 0x00 minus ungenutzte bits
44
  range_sw_err =((int8_t) readBME680(RANGE_SW_ERR_ADDRESS_BME680) & 0xf0) / 16;  // 0x04 minus ungenutzte bits
45
}

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.