Hallo,
seit kurzer Zeit betreibe ich an einem Arduino diesen Sensor mit I2c
Interface und benutze dazu eine Lib von der Ard. Playground Seite,
welcher scheinbar "gut bekannt" ist. Auch eine andere Lib sah ähnlich
aus, was die Berechnungen des Druckes anging und ein vergleich gegen das
Datenlatt schien "richtig".
Nur leider zeigt mir der BMP085 grad heute an: 1007 mBar
Die amtliche Angabe für meinen Wohnort aber ist: 1012 mBar und meine
Wetterstation an der Wand zeigt 1012 an.
Der amtlichen Angabe durch kal. Messgeräte traue ich mehr und bestätigt
wird das durch meine Mebus Station. Also: Arduino oder der Sensor
rechnet falsch!
In meiner Not: Grübel.... ok, addieren wir doch einfach die 5mBar oder
500 HPa drauf, wenn das vielleicht linear ist (Frickel-Lösung)
Was stimmt da nicht? Der Sensor ist werkskalibriert, die Werte liegen im
EEPROM. Die Lib benutzen auch 1000 andere.
Der Punkt wo der Elefant das Pipi macht ist hier:
1 | // do temperature calculations
|
2 | X1 = ((UT - (int32_t)ac6) * (int32_t)ac5) >> 15;
|
3 | X2 = ((int32_t)mc << 11) - (X1 + md)/2; // round up
|
4 | X2 /= (X1 + md);
|
5 | B5 = X1 + X2;
|
6 |
|
7 | // do pressure calcs
|
8 | B6 = B5 - 4000;
|
9 | X1 = ((int32_t)b2 * ( (B6 * B6)>>12 )) >> 11;
|
10 | X2 = ((int32_t)ac2 * B6) >> 11;
|
11 | X3 = X1 + X2;
|
12 | B3 = ((((int32_t)ac1*4 + X3) << oversampling) + 2) / 4;
|
13 |
|
14 | X1 = ((int32_t)ac3 * B6) >> 13;
|
15 | X2 = ((int32_t)b1 * ((B6 * B6) >> 12)) >> 16;
|
16 | X3 = ((X1 + X2) + 2) >> 2;
|
17 | B4 = ((uint32_t)ac4 * (uint32_t)(X3 + 32768)) >> 15;
|
18 | B7 = ((uint32_t)UP - B3) * (uint32_t)( 50000UL >> oversampling );
|
19 |
|
20 | if (B7 < 0x80000000) {
|
21 | p = (B7 * 2) / B4;
|
22 | } else {
|
23 | p = (B7 * 2) / B3;
|
24 | }
|
25 | X1 = (p >> 8) * (p >> 8);
|
26 | X1 = (X1 * 3038) >> 16;
|
27 | X2 = (-7357 * p) >> 16;
|
Schön, glaube ich mal so, so stehts im Datenblatt auch....
Gruss,
Christian