ich bin Arduino-Newbie und auch neu hier im Forum.
Die ersten Schritte gelingen mir nach ein paar Anläufen recht gut - Dank auch der vielen Foren und Tips im I-net!
Echte Probleme bereitet mit der Bosch Drucksensor BMP085 mit I2C-Interface. Mit Hilfe verschiedenster Libraries und Beispielcodes konnte ich zunächst eine Kommunikation aufbauen. Leider sind die ausgegebenen Werte (Temperatur und Druck) alles andere als realistisch. Auf der Suche nach dem Fehler habe ich mir zunächst die Rohdaten direkt aus den Ausgaberegistern angeschaut. Schon die beiden Register für die Temperatur zeigen (was auch immer ich tue) 0xFF. Das Auslesen der Kalibrationskoeffizienten liefert hingegen glaubhafte Werte.
Um verschiedenes auszuschließen und die Sache für mich übersichtlicher zu gestalten, habe ich eine einfache Prozedur geschrieben, welche nur die Temperaturregister ausliest --> 0xFF!
Dies würde aber maximale Temperatur bedeuten, hier im Büro habe ich jedoch so um die 20°C!
// Auslesen des BMP085-Sensors über I2C
// Spannungsversorgung Sensor: 3,3V
// Pin A4 --> SDA; Pin A5 --> SCL
#include <Wire.h>
int I2C_ADDRESS = 0x77; // sensor address 0xEF >> 1 = 0x77
int oss = 2; // oversampling setting
int msb=0;
int lsb=0;
void setup()
{
Serial.begin(9600);
Wire.begin();
Serial.print("Auslesen des I2C Busses an Adresse: ");
Serial.println(I2C_ADDRESS, HEX);
}
void loop()
{
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(0xf4); // pointer to command register
Wire.send(0x2e); // command for calculating temperature value
Wire.endTransmission();
delay(5); //wait 5us
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(0xf6); // register to read
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, 1); // request one byte
while(!Wire.available()); // wait until data available
msb = Wire.receive();
Serial.print("MSB: ");
Serial.print(msb, DEC);
Wire.beginTransmission(I2C_ADDRESS);
Wire.send(0xf7); // register to read
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, 1); // request one byte
while(!Wire.available()); // wait until data available
lsb = Wire.receive();
Serial.print(" LSB: ");
Serial.println(lsb, DEC);
}
ich habe genau das selbe Problem wie Du mit meinem neu erworbenen BMP085 Drucksensor Breakout Board.
Ich verwende das von MegaionStorm im vorigen Post angegebene Script:
Posted by: Megaionstorm
BMP085 with Arduino (tested & working)
Das Auslesen der Kalibrationsdaten ist erfolgreich und liefert m. E. auch relativ plausible Werte:
Das Auslesen der Messwerte liefert hingegen auch bei mir völlig unplausible Daten:
Die beiden Register 0xF6 und 0xF7 liefern als Ergebnis der Temperaturmessung konstant dezimal 255 (entspricht -114,9 Grad C., brrrrrr... :o)
Die drei Registerwerte nach der Druckmessung schwanken immerhin etwas, sind aber im Ergebnis ebenso unplausibel (entsprechen ca. 460 hPa). Auch das Ändern des Oversampling-Settings von 3 auf 2, 1 oder 0 brachte keine Änderung.
Hier ein kleiner Auszug meiner ausgelesenen Werte (Oversampling=3; das o.g. Skript habe ich erweitert, damit es mir auch die einzelnen Registerwerte ausgibt):
Adding some pull up resistors (1K to 20K, most often something like 4.7K) between SDA, SCL and VCC finishes the setup (this was included in my breakout board).
danke für die Info. Mit den externen Pullup-Widerständen (4,7 kOhm) hab ichs auch schon probiert, hat aber nichts gebracht. Zudem sind auf dem Breakout Board die Pullups schon integriert. Ich glaube nicht, dass es ein Problem der Datenübertragung ist, da die ausgelesenen Daten ja teilweise plausibel und konstant sind (z.B. die Kalibrationskoeffizienten). Eigentlich hab ich schon alles probiert und auch das Datasheet kann ich nun schon fast auswendig ;-). Ich habs auch schon mit unterschiedlichen Stromversorgungen (USB, Netzteile) probiert, hat auch nichts geändert. Den BMP085 hab ich an die 3,3V vom Arduino geklemmt. Alles genau so, wie schon viele User im Web erfolgreich beschrieben haben, und mit deren Skripts. Da wie gesagt die Datenabfrage eigentlich klappt (z.B. die Kalibrationswerte), und nur die Messwerte Schrott sind, ging ich seither von einem Defekt der Messtechnik meines BMP085 aus.
Aber nun wundert es mich, dass ein weiterer User ausgerechnet gestern erstmals denselben Effekt gepostet hat!
Hat auch er einen defekten Sensor abbekommen? Oder wurden vom Hersteller die Steuerbefehle z.B. für die Temperaturmessung (write 0x2E in reg 0xF4, wait 4,5 ms) geändert? Steht aber nichts im aktuellen Datasheet. Kann ich mir auch nicht vorstellen.
@Florian: Hast Du auch das Sparkfun Breakout Board? Wo hast Du es gekauft?
Ich bin echt ratlos...?
Hat jemand (positive wie negative) Erfahrungswerte mit dem BMP085?
Sorry, dass ich mich jetzt erst melde, das WE war doch recht ausgebucht!
Es scheint mir ja fast so, als hätten wir gleichzeitig am gleichen Problem mit dem gleichen Ergebnis gearbeitet! Übrigens sind deine Druckwerte meinen sehr ähnlich! Liegt aber daran, dass Werte aus der Temp. Berechnung auch für den Druck gebraucht werden. Ersetzt du die benötigten Werte durch plausible Konstanten (z.B. T=20°C und B5=3192) kommst du mit dem Druck in die richtige Richtung (aber immer noch nicht ganz richtig). Auch ich habe das Datenblatt schon hin und her gewälzt und auch des neueste von der Herstellerpage runtergeladen.
Auch die hier im Thread vorgeschlagenen Lösungen von den unterschiedlichsten Seiten ausprobiert (Danke trotzdem dafür!). Das Problem ist hier meist eine fehlerhafte Berechnung durch z.B. falsche Variablendeklaration. Soweit komme ich (und scheinbar auch TomTom) gar nicht, da die Rohwerte aus den Registern offensichtlich nicht richtig sind!
Ja, ich benutze auch das Breakoutboard von Sparkfun mit den internen Pullups. Hatte auch schon gedacht, dass möglicherweise die Hardware nicht das macht, was sie sollte - aber als Anfänger sucht man die Fehler ja erstmal bei sich selbst. Werde mal den Hersteller und Tinkersoup (von da hab ich gekauft) anmailen, ob der Fehler irgendwie bekannt ist.
so, ich habe jetzt sowohl Anfragen beim Hersteller und Vertreiber laufen, als auch den gleichen Thread im Sparkfun Forum gestartet - leider bis jetzt alles mit recht wenig Rücklauf. Ich bleibe aber dran!
@Tom: Hast du schon Erfolg gehabt? Wenn ja würde mich die Lösung brennend interessieren! Oder hast du schon aufgegeben?
Ich hatte ähnliche Probleme mit dem SCP1000 über SPI: Der Sensor liefert Werte, die in etwa die Bedingungen auf dem Saturn widerspiegeln.
Lösung: Bislang keine
PROBLEM GELÖST!!!
Habe gestern einen neuen Sensor (nur diesen, kein Breakout) bekommen und auf Streifenraster gelötet. Was soll ich sagen - der Beispielcode aus den I-net funktioniert einfach!
Da es mittlerweile ja einige gibt, die dieses spezielle Problem haben, gehe ich mal davon aus, dass Sparkfun da irgendwie kaputte Sensoren abbekommen hat!
Also einfach mal ´nen anderen verwenden und dann läuft´s!
ich hatte vor ein paar Tagen auch nochmal ein zweites Sparkfun BMP085 Board bestellt (diesmal aber bei bei einem anderen Händler).
Habe es heute bekommen und angeschlossen. Und siehe da - es funktionierte gleich zu Beginn einwandfrei!
Die Temperaturwerte sind plausibel und reagieren sehr schnell z.B. auf Fingerwärme.
Also war auch mein erstes Sensor Board gleich von Anfang an defekt!
Die Luftdruckwerte sind etwas geringer als die Werte der Wetterdienste im Internet (970 statt 1010 hPa). Liegt dies vielleicht daran, dass ich den Sensor in meinem Zimmer und nicht außen habe?
Hat jemand Erfahrungen mit den Luftdruckwerten des Sensors?
Florian hat mir den Tipp gegeben, dass die Werte der Wetterstationen meistens auf Meereshöhe (MSL) zurückgerechnet sind. Da ich (leider) kein Strandhaus am Meer habe, sondern mich auf ca. 350m über Meereshöhe befinde, kommt es mit den 8hPa pro Höhenmeter von uwefed wirklich sehr genau hin. Nochmals vielen Dank an alle!