BMP085 - Pin Belegung? | Verzweiflung

Moin Moin zusammen,

ich möchte den Luftdruck mit dem BMP085 Sensor von Bosch bestimmen. Ich habe nicht die größten Ahnungen und
Vorkenntnisse von Arduino und stehe daher nun vor einem Problem…

Es ist vollkommen egal welchen Sketch von den vielen vorgegebenen verwende, es wird mir nie ein Ergebniss presentiert.
Dies ist dadurch begründet, dass ich nicht verstehe, wo ich jetzt die Pinbelegung vollziehen kann.
Ich arbeite mit einem Sensorboard, wo die jeweiligen Sensoren raufgelötet werden. Die Sketche aus dem Netz sind alle so
angepasst, dass mal Analog4 und Analog5 nimmt. Dies geht bei mir allerdings nicht, da diese an meinem Board nicht
neben einander liegen…

Kann mir bitte jemand von euch helfen und mir sagen wo man die Pinverteilung ändert? Vielen Dank im Vorraus!!!

Sketch:

#include "Wire.h"

#define I2C_ADDRESS 0x77
#define Vcc 3.3

const unsigned char oversampling_setting = 3; //oversamplig for measurement
const unsigned char pressure_waittime[4] = { 5, 8, 14, 26 };

//just taken from the BMP085 datasheet
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

void setup()
{
Serial.begin(19200); // start serial for output
Serial.println("Setting up BMP085");
Wire.begin();
//bmp085_get_cal_data();
pinMode(16, OUTPUT);
}
void bmp085_read_temperature_and_pressure(int& temperature, long& pressure);


void loop()
{
int temperature = 0;
long pressure = 0;

bmp085_read_temperature_and_pressure(&temperature,&pressure);
Serial.print(temperature,DEC);
Serial.print(" ");

long l = pressure;
float  i = (float) l;
i=i/100;
Serial.print(i,2);
Serial.println(pressure,DEC);
Serial.println();
delay(100);
}

void bmp085_read_temperature_and_pressure(int* temperature, long* pressure) {
int ut= bmp085_read_ut();
long up = bmp085_read_up();
long x1, x2, x3, b3, b5, b6, p;
unsigned long b4, b7;

//calculate the temperature
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
*temperature = (b5 + 8) >> 4;

//calculate the pressure
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;

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

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;

x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15;
b7 = ((uint32_t) up - b3) * (50000 >> oversampling_setting);
p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;

x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
*pressure = p + ((x1 + x2 + 3791) >> 4);

}

unsigned int bmp085_read_ut() {
write_register(0xf4,0x2e);
delay(5); //longer than 4.5 ms
return read_int_register(0xf6);
}

void bmp085_get_cal_data()
{
ac1 = read_int_register(0xAA);
ac2 = read_int_register(0xAC);
ac3 = read_int_register(0xAE);
ac4 = read_int_register(0xB0);
ac5 = read_int_register(0xB2);
ac6 = read_int_register(0xB4);
b1 = read_int_register(0xB6);
b2 = read_int_register(0xB8);
mb = read_int_register(0xBA);
mc = read_int_register(0xBC);
md = read_int_register(0xBE);
}

long bmp085_read_up() {
write_register(0xf4,0x34+(oversampling_setting<<6));
delay(pressure_waittime[oversampling_setting]);

unsigned char msb, lsb, xlsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(0xf6); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 3); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.read();
while(!Wire.available()) {
// waiting
}
lsb |= Wire.read();
while(!Wire.available()) {
// waiting
}
xlsb |= Wire.read();
return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb)) >>(8-oversampling_setting);
}

void write_register(unsigned char r, unsigned char v)
{
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r);
Wire.write(v);
Wire.endTransmission();
}

char read_register(unsigned char r)
{
unsigned char v;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
while(!Wire.available()) {
// waiting
}
v = Wire.read();
return v;
}

int read_int_register(unsigned char r)
{
unsigned char msb, lsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 2); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.read();
while(!Wire.available()) {
// waiting
}
lsb = Wire.read();
return (((int)msb<<8) | ((int)lsb));
}

thilo007007:
Es ist vollkommen egal welchen Sketch von den vielen vorgegebenen verwende, es wird mir nie ein Ergebniss presentiert.
Dies ist dadurch begründet, dass ich nicht verstehe, wo ich jetzt die Pinbelegung vollziehen kann.

Die Pinbelegung vollziehst Du über die Einstellung "Tools-Board" und im Sketch mit der Zeile:

#include "Wire.h"

Die Library weiß über das in der Arduino-Software eingestellte Board, welches die I2C-Pins des Controllers sind, der sich auf dem Board befindet.

Jetzt mußt Du nur noch selber wissen, welches die I2C-Pins auf Deinem Board sind und den Sensor dort auch anschließen.

Auf "MEGA" und manchen anderen Boards sind die Pins SDA und SCL im Klartext beschriftet.
Auf einem UNO ist A4=SDA und A5=SCL.

Der BMP085 ist ein 3.3V Sensor.
Die PullUp-Widerstände in Deiner Schaltung mußt Du also an 3.3V betreiben.
Auf fertigen "Breakout-Boards mit BMP085" sind die PullUp-Widerstände üblicherweise bereits enthalten, so dass Du in dem Fall keine zusätzlichen benötigst, im Zweifelsfall das Schaltbild des Breakout-Boards beachten!

thilo007007:
Ich arbeite mit einem Sensorboard, wo die jeweiligen Sensoren raufgelötet werden. Die Sketche aus dem Netz sind alle so
angepasst, dass mal Analog4 und Analog5 nimmt. Dies geht bei mir allerdings nicht, da diese an meinem Board nicht
neben einander liegen...

Diese Aussage klingt für mich völlig sinnlos.
Einen I2C-Sensor kannst Du am hardwaremäßig vorhandenen I2C-Bus des Boards verwenden.
Oder Du kannst es mit I2C-Sensoren bleiben lassen.

An "anderen Pins" als dem Hardware-I2C Anschluß eines Boards kannst Du zwar auch mit einigem softwaretechnischen Zusatzaufwand I2C-Sensoren betreiben, allerdings müßtest Du dann mit Software-I2C erstmal eine Hardware-I2C Schnittstelle emulieren. Für so einen umständlichen Quatsch gibt es meines Erachtens nach keine Arduino-Beispielsketche für den BMP085. Die Beispiel-Sketche für BMP085 sind immer für die Verwendung von Hardware-I2C, beim UNO also an A4 und A5.

Es gibt allerdings wohl auch eine Software-I2C Library für Arduino, falls Du es unbedingt und unnötigerweise verkomplizieren möchtest mit dem Auslesen des Sensors... wie gesagt, auf einem Controller-Board mit Hardware I2C schließt man I2C-Sensoren auch genau an die Pins der Hardware-I2C Schnittstelle an, alles andere ist relativ sinnfrei.

Hallo,
in diesem Post:

hab ich Dir zwei Sketch´s angehängt, die SICHER laufen. Wenn Du jetzt noch Probleme damit hast, dann ist es EINDEUTIG ein
VerdrahtungsFehler. Was für einen Arduino und was für ein SensorBoard. Foto vom elektrischen Aufbau?
Gruß und Spaß
Andreas

thilo007007:
Kann mir bitte jemand von euch helfen und mir sagen wo man die Pinverteilung ändert?

Deja-vu: [geschlossen/gelöst]Pin Belegung ändern SCL/SDA - Deutsch - Arduino Forum

Zwei Tage später, dasselbe Thema zum Zweiten.
Und das vom selben Themen-Starter.
=(

Nein Nein ich habe jetzt ein abgeändertes Problem :slight_smile:

Ich habe beim Uno alles hinbekommen, aber vertiefe mich jetzt noch einmal auf die Belegung

Wenn ich jetzt das ganze noch einmal bedenke sollte es ein Hardwarefehler sein, da mir ja nicht einmal falsche
Werte ausgegeben werden...

Ich habe mich eben bei dem Hersteller gemeldet und hoffe, dass ich dort eine schnelle Antwort bekommen werde

Ich habe das Sensorboard mal entfernt, also die Lötstellen aufgelöst und mal direkt die Pins genommen und tada es funktioniert!

Also ist das Board kaputt.

Ich danke euch allen für eure Hilfe!

[closed]