Vor einiger Zeit habe ich bei einem meiner lieblings China-eBay-Verkäufern ein günstiges Luftdrucksensor entdeckt: eine BMP085-Breakout-Board. Die technische Daten sahen vielversprechend aus und der Preis war mehr als bezahlbar. Gesehen-bestellt-gewartet... und jetzt liegt der gute Stück hier und schreit danach, getestet zu werden. ;-)
Laut Beschreibung handelt es sich beim BMP085 um einen 'hochpräzisen' Sensor mit 'ultra-niedrigen' Stromverbrauch. Der Sensor ist vorkalibriert und temperaturkompensiert. Die Temperatur kann auch ausgelesen werden.
Die Angaben des Verkäufers:
- Genauigkeit beträgt bis zu 0.03hPa (0.25 m) in Präzisionsmodus und 0.06hPa (0.5 m) sonst
- Stromverbrauch Standardmodus liegt bei 5μA und bei 3μA sonst, in Standby begnügt sich der Chip mit 0.1μA
- Messbereich von 300 bis 1100 hPa (das wären etwa 9000 Meter über dem Meeresspiegel bis hinzu -500 m).
- I²C-Schnittstelle
- typische Antwortzeit 7.5ms
- Betriebsspanung von 1,8 bis 3,6 V
- Größe: 2cm x 1.5cm
Auch wenn der Verkäufer die Betriebsspannung für das Board mit <3,6 V angiebt (was für den Chip selbst auch stimmt), sehe ich auf dem Bord ein 3,3V-Festspannungsregler (662K). Das Board erzeugt sich offenbar die notwendige Spannung selbst. Laut Datenblatt des Reglers darf die Eingangsspannung bis zum 6 V betragen. Ein Hacken hat das Ganze aber doch. Die Datenleitungen des Chips sind nicht 5V-tolerant. Dank der PullUp-Wiederständen (an 3,3 V), die man deutlich im Bild sehen kann, wird die Spannung auf ein erträgliches Maß begrenzt. Das funktioniert aber nur, wenn keine PullUps an die 5V-Schiene existieren! Diese würden die Spannung auf ein höheres Niveau ziehen, was für den Chip möglicherweise schon zu viel des Guten wäre. Man darf zusammen mit diesem Board keine 5V-Komponente an dem geminsamen I²C-Bus betreiben! Zumendest nicht ohne Level-Shifter.
Die Anschlüsse:
- VCC - Betriebsspannung (3 bis 5 V sind wohl OK)
- SDA, SCL (Serial Data und Serial Clock) - I²C Bus
- XCLR (Master Clear (low-active)) - damit kann der Sensor reinitialisiert werden
- EOC (End of conversion output) - signalisiert, dass die Daten berechnet sind und können angeholt werden
- GND - Masse
So, jetzt wollen wir sehen, wie das Ganze funktioniert. Die Reinitialisierung brauchen wir nicht, auch müssen die Werte nicht sonderlich oft abgefragt werden, daher sind für die Verbindung zum Arduino nur 4 Leitungen notwendig: 5V-Spannung, Masse und die Leitungen des I²C Busses: SDA und SCL. Diese befinden sich an den Pins A4 und A5 des Arduinos.
Zur Ansteuerung gibt es eine leicht zu nutzende Bibliothek 'Adafruit' (https://github.com/adafruit/Adafruit_BMP085_Unified/). Im Packet ist auch ein Testprogramm zu finden.
Hier ist mein Testaufbau:
Und das ist die Programmausgabe:
Als der erste Durchstich ist das schon mal ganz gut. Spannender ist jedoch etwas nützlicheres zu bauen.
Dafür nahm ich ein anderes Arduino-Board und ein LCD-Shield. Da an den letzten nichts weiter angeschlossen werden kann, steckte ich ein "Sensor-Shield" (Anschlussplatine) dazwischen.
Und so sieht das aus. Schrit 1, Arduino UNO mit dem Sensor-Shied:
Der fertige Aufbau mit dem LCD:
Es fehlt noch die nötige Software. Mit dem folgendem Sketch verwandelt sich ein totes Stück Elektronik in ein Digitalbarometer.
#include <Wire.h> #include <Adafruit_BMP085.h> #include <LiquidCrystal.h> /* * Barometer_LCD * * Author: Alexander Schulz * Version: 1.0 * Datum: 06.07.2013 * * Das Programm benutzt den Luftdrucksensor BMP085 und * zeigt die Werte für Druck und Temperatur auf einem 16x2-Symbol-LCD. * * Verdrahtung (UNO, Nano...) * * BMP085: * Sensor SCL pin an A5 * Sensor SDA pin an A4 * Sensor VDD pin an 5V * Sensor GND pin an GND * * LCD in 4-Bit-Modus: * LCD RS pin an digital pin 8 * LCD RW pin an digital pin 13 * LCD Enable pin an digital pin 9 * LCD D4 pin an digital pin 4 * LCD D5 pin an digital pin 5 * LCD D6 pin an digital pin 6 * LCD D7 pin an digital pin 7 */ // Setup für LCD-Shield LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); Adafruit_BMP085 bmp; void setup() { // Diaplay initialisieren lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Initializing..."); delay(500); lcd.clear(); // Prüfen, ob Sensor vorhanden ist if (!bmp.begin()) { lcd.clear(); lcd.setCursor(0,0); lcd.print("BMP085 not found"); lcd.setCursor(0,1); lcd.print("check wiring!"); while (1) { delay(1000); } } } void loop() { // Textvariablen char bmp_temperature[7]; char bmp_pressure[7]; // Werte auslesen und aufbereiten dtostrf(bmp.readTemperature(), 6, 2, bmp_temperature); dtostrf((float)bmp.readPressure()/1000, 6, 2, bmp_pressure); // Werte auf LCD anzeigen lcd.setCursor(0,0); lcd.print("Temp: "); lcd.setCursor(6,0); lcd.print(bmp_temperature); lcd.setCursor(12,0); lcd.print(" *C"); lcd.setCursor(0,1); lcd.print("Pres: "); lcd.setCursor(6,1); lcd.print(bmp_pressure); lcd.setCursor(13,1); lcd.print("kPa"); delay(1000); }
Die Werte liegen zwischen dem, was meine Wetterstation sagt und die Angaben des Wetterdienstes, dürften also recht gut sein. Die Temperatur von gut 28 Grad ist der Wäreme des Laptops zu verdanken.
Und so entsteht aus Bauteilen für ca. 30 Euro eine unvollständige Wetterstation. Dafür kann man schon eine "richtige" bekommen :-)
Kommentare (6)
Wie klemme ich den an den Nano an?