Arduino - Luftdruck- und Temperatur-Sensor BMP085 **Korrektur**

Korrektur: Leider habe ich nicht auf die richtige Darstellung der Formeln geachtet (insbesondere die ">" und "<" Zeichen). Das habe ich berichtigt und bitte für meine Lässlichkeit um Entschuldigung.

Das Folgende sind die Werte, nachdem ich mein BMP085 Breakout-Board (zu beziehen z.B. hier, hier oder hier) mit 5 statt 3,3 Volt angeschlossen hatte.

Die Beschreibung auf wiring.org weist zunächst eine Beschaltung von VCC an 5 Volt aus. Danach ist aber in dem Wiring eine Beschaltung gegen 3,3 Volt beschrieben. In dem Datenblatt steht zudem ein ausdrücklicher Verweis auf die nachträgliche Beschädigung des BMP085 durch Anschluss an 5 Volt.

214 35566
214 35567
214 35564

Mir ist es passiert, denn normalerweise sollten die jeweils 2. Werte beinahe 6-stellig sein.

Hier der Vergleich:
--- Neuer BMP085 ---

Temp: 21.5000000000 Press: 26991
Temp: 21.5000000000 Press: 26983
Temp: 21.5000000000 Press: 26987

--- Defekter BMP085 ---

Temp: 23.5000000000 Press: 34673
Temp: 23.2999992370 Press: 34676
Temp: 23.2000007629 Press: 34651

Aber auch die Luftdruckwerte des neuen BMP085 stimmen nicht. Recherchen im W3 führten mich zu dieser Seite:

Dort wurde zunächst der folgende Vierzeiler genannt, der in den SampleCode von wiring.org.co an die Stelle der Zeile


b3 = (((int32_t) ac1 * 4 + x3)<<oversampling_setting + 2) >> 2;

einzufügen war:


if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1;
if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2);
if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1;
if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 2;

Dies führte zu folgenden Druckwerten:

Reading Calibration Data
Temp: 21.5000000000 Press: 99378
Temp: 21.5000000000 Press: 99380
Temp: 21.5000000000 Press: 99376

Meine Wetterstation(en) zeigte(n) gleichzeitig 994 hPa an, also war das schon weitaus besser.

Nun noch der Einzeiler aus dem eben genannten Forenthread:


b3 = (((int32_t) ac1 * 4 + x3)<<oversampling_setting) >> 2;

welcher folgende Ausgabe erzeugte:

Reading Calibration Data
Temp: 21.3999996185 Press: 99373
Temp: 21.3999996185 Press: 99367
Temp: 21.3999996185 Press: 99368

Da auch diese Werte überzeugen konnten, lasse ich es codemäßig bei dem Einzeiler, denn später kann jedes eingesparte Byte bei meinem Projekt / Vorhaben wichtig werden. Zudem scheint also in dem Code von Wiring.org.co ein Fehler zu sein.

Hinweise:

Nachtrag 1: Die o.a. "Press-"Werte sind Pascal-Werte. Um hPa-Werte zu erhalten, müssen Sie diese noch durch 100.0 (engl. Schreibweise) teilen (und nicht die Nachkommstelle vergessen, sonst erhalten Sie in Ihrer float-Ergebnis-Variablen nur den ganzzahligen Wert).

Nachtrag 2: Zudem handelt es sich um die absoluten Luftdruckwerte. Falls Sie also nicht gerade auf 0 m über dem normalen Meeresspiegel messen können, müssen Sie diese Werte noch auf den relativen Luftdruck für Ihre "Höhenlage" umrechnen. Hier könnte dieser Beitrag in diesem Foren-Thread Ihnen helfen (lesen Sie am Besten den ganzen Thread durch, um nicht die falschen Schlüsse zu ziehen ;-) ).

Es gibt den BMP085-Sensor auch als einzelnes Bauteil statt auf einem Breakout-Board. Da ich aber überhaupt keine Löterfahrungen im Bereich SMD habe, habe ich mir lieber das vorgefertigte Board geholt und eine 6-polige Stiftleiste angelötet, welche sich in den Breadbords (neudeutsch für Steckbretter) sehr gut verwenden lässt.

Denken Sie daran, dass die SDA- / SCL-Pins auf dem Arduino Mega z.B. auf Pin 20 und 21 statt wie beim Arduino Uno (und vielen anderen Arduino-Boards) auf 4 und 5 liegen.

Nochmals: Der BMP085 verträgt keine 5 Volt. Nutzen Sie den 3,3 Volt-Pin Ihres Arduino-Boards für den direkten Anschluss an VCC.