Keine Werte bei Temperatursensor

Seid gegrüßt,

ich habe einen Aufbau von zwei Sensoren (BME280 und BME680) und einem DEBO LCD 20X4 BL. Es läuft alles zusammen auf einem Arduino UNO.

Es soll mir hierbei die Feuchtigkeit (BME680), die Temperatur(BME680) und den Druck (BME280 & BME680) von beiden auf dem LCD anzeigen. Der Zweck ist ein eigener kleiner Messaufbau aber dies ist nicht weiter von Belang.

#include <Wire.h>
#include <BlueDot_BME680.h>
#include <Seeed_BME280.h>
#include <avr/wdt.h>
#include <LiquidCrystal_I2C.h>


//Objekte deklarieren
BME280 bme;  //I2C on 0x77
BlueDot_BME680 bme680;
LiquidCrystal_I2C lcd(0x27, 20, 4);


//////////////////////////////////////////////////////////////////////////////////
void setup() {
Wire.begin();
bme680.parameter.I2CAddress = 0x76;
bme680.init();

//BME680 einstellen
bme680.parameter.sensorMode = 0b01; 
bme680.parameter.IIRfilter = 0b100;
bme680.parameter.humidOversampling = 0b101;
bme680.parameter.tempOversampling = 0b101; 
bme680.parameter.pressOversampling = 0b101; 
bme680.parameter.pressureSeaLevel = 1013.25;
bme680.parameter.tempOutsideCelsius = 20;
//

bme.init();
lcd.init();
lcd.backlight();
lcd.setCursor(4,1);
lcd.print("Probemessung");
delay(1000);
lcd.clear();
if (!bme.init()) {
lcd.print("Kein BME280 angeschlossen");
} 
  else if ((bme680.init() != 0x61))

{ 
  lcd.print("Kein BME680 angeschlossen");
}
while (1);
}






//////////////////////////////////////////////////////////////////////////////////
void loop() {
float p = bme.getPressure();
 
  lcd.setCursor(1, 0);
  lcd.print("Temp:    ");
  lcd.print(bme680.readTempC());
  lcd.print("C");
 
 
  lcd.setCursor(1,1);
  lcd.print("Feuchte: ");
  lcd.print(bme680.readHumidity());
  lcd.print("%");

  lcd.setCursor(1,2);
  lcd.print("Druck:   ");
  lcd.print(bme680.readPressure());
  lcd.print("bar");
 
  lcd.setCursor(1,3);
  lcd.print("Druck:   ");
  lcd.print(p/100000);
  lcd.print("bar");


delay(2000);


}

Das Bild ist wirklich nur eine grob gezeichnete Skizze. (Ich habe aus Zeitgründen wenig einzeichnen können und der LCD war bei dem Zeichenprogramm nicht zu finden. Deshalb ist hier nur ein 16x2 LCD gezeichnet.

Der Aufbau von je einem Sensor und den LCD funktionieren beide hervorragend. Wenn ich nun beide Sensoren und den LCD in einer Schaltung realisiere bekomme ich überhaupt keine Messwerte vom BME680.

Es kommt die Frage auf welchen Fehler ich in der Schaltung und/oder im Code übersehen habe. Deshalb erbitte ich die Weisheit unserer Community.

Loop wird niemals ausgeführt, denn in setup steht als letzte Zeile:

  while (1);

Das ist eine Endlosschleife.

Das while ausgeklammert hat nun die Fehlermeldung, dass mein BME680 nicht gefunden wurde, aufgehoben.

Nun ergibt sich ein neues Problem. Es werden mir komplett falsche Ergebnisse angezeigt, wie z.B. Temperatur von -77°C.

kamiigawa:
Das while ausgeklammert hat nun die Fehlermeldung, dass mein BME680 nicht gefunden wurde, aufgehoben.

Wenn diese Fehlermeldung vorher kam, dann könnte das ja bedeuten, dass der BME680 nicht (richtig) angeschlossen ist oder ein anderes Problem damit vorliegt, oder? :slight_smile:

Welche Adressen haben denn die Sensoren - höchstwarhscheinlich liegt ein Adressenkonflikt vor.
Eine schnelle Google-Suche ergibt: beide Sensoren verwenden 0x77 als Default-Adresse. Allerdings lassen sich beide auf eine andere Adresse umstellen oder über SPI betreiben.
Zwar gibt es eine Code-Zeile in setup, die den bme680 auf 0x76 umstellen soll, aber vielleicht funktioniert das nicht wie gewünscht.
Ich habe deine Hardware nicht und kann das deshalb nicht ausprobieren.
Es gibt I2C-Scanner, damit kann man die Adressen der angeschlossenen Geräte herausfinden:
I2C Scanner (1)
I2C Sanner (2)
Lass die mal laufen.

Laut deiner Skizze sind sowohl beide Sensormodule und auch das Display am 3,3 Volt Pin des Arduino UNO angeschlossen. Dieser Pin kann aber max. 50 mA liefern - das ist nicht allzu viel.
Wieviel Strom brauchen denn die Module und (vor allem) das Display?

Sind die Module für 5 Volt (auf den Datenleitungen) geeignet?

Wie lange sind die Leitungen zu den Sensor-Modulen und zum Display?
I2C funktioniert nur über relativ kurze Entfernungen (Leitungslängen).

Gibt es Pullup-Widerstände auf den Modulen?
Wenn ja, welche Werte haben sie?
Die beiden I2C-Bus-Leitungen (beim UNO: A4, A5) brauchen Pullup-Widerstände.
Zwar werden die internen Pullups des Arduinos aktiviert, diese sind aber recht hochohmig.
Es funktioniert mit diesen zwar trotzdem in vielen Fällen, aber nicht immer.
Falls es keine Pullups auf den Modulen gibt, dann füge welche hinzu, z.B. 4,7 Kiloohm.

Möglicherweise gibt es Konflikte in den Libraries, die du benutzt.

Bitte poste Links zu:

  • Den Sensormodulen, die du verwendest.
  • Den Libraries die du benutzt.

uxomm:
Wenn diese Fehlermeldung vorher kam, dann könnte das ja bedeuten, dass der BME680 nicht (richtig) angeschlossen ist, oder? :slight_smile:

Welche Adressen haben denn die Sensoren - vielleicht liegt ein Adressenkonflikt vor.
Es gibt I2C-Scanner, damit kann man die Adressen der angeschlossenen Geräte herausfinden:
I2C Scanner (1)
I2C Sanner (2)
Lass die mal laufen.

Laut deiner Skizze sind beide Sensormodule und auch das Display am 3,3 Volt Pin des Arduino UNO angeschlossen. Dieser Pin kann aber nur max. 50 mA liefern - das ist nicht allzu viel.
Wieviel Strom brauchen denn die Module und (vor allem) das Display?

Sind die Module für 5 Volt (auf den Datenleitungen) geeignet?

Wie lange sind die Leitungen zu den Sensor-Modulen und zum Display?

Gibt es Pullup-Widerstände auf den Modulen?
Wenn ja, welche Werte haben sie?
Die beiden I2C-Bus-Leitungen (beim UNO: A4, A5) brauchen Pullup-Widerstände.
Zwar werden die internen Pullups des Arduinos aktiviert, diese sind aber recht hochohmig.
Es funktioniert mit diesen zwar trotzdem in vielen Fällen, aber nicht immer.
Falls es keine Pullups auf den Modulen gibt, dann füge welche hinzu, z.B. 4,7 Kiloohm.

Möglicherweise gibt es Konflikte in den Libraries, die du benutzt.

Bitte poste Links zu:

  • Den Sensormodulen, die du verwendest.
  • Den Libraries die du benutzt.

Die Adressen sind beim BME280 die 0x77 und beim BME680 durch die Vebindung zum GND die 0x76. (Das wurde auch im Datenblatt des BME680 empfohlen.

Die I2C-Scanner bringen mir 2 Adressen. Ein 0x27 (vermutlich das LCD) und ein 0x76. Leider keine dritte Adresse.

Zum Stromverbauch des LCD kann ich nichts sagen, da im Datenblatt darüber nichts vermekrt ist. (lol)
Die beiden Sensoren sind auf 3,3V und haben einen Verbrauch von ~12mA.
Wie gesagt funktionieren je ein Sensor mit dem LCD auf 3,3V und 5V problemlos. Nur alle drei zusammen funktionieren nicht gleichzeitig ohne das die Fehlermeldung kommt oder ich absurde Werte erhalte.

Leitungslängen sind <10cm.

Pullup-Widerstände, die ich von VCC auf SDA gemessen habe, sind bei beiden ~9,88kΩ.

Selbst habe ich schon das Einfügen von Pullups probiert. Die Pullups von 4,7k (1.Versuch) und 10k (2.Versuch) habe ich zwischen VCC und SDA eingefügt. Leider änderte das nichts bei der Ausgabe.

Sensormodule:
BME280

BME680

Libraries:
BME280 (hier funktioniert nur diese Library)
https://github.com/Seeed-Studio/Grove_BME280/blob/master/Seeed_BME280.h

BME680
https://github.com/BlueDot-Arduino/BlueDot_BME680/blob/master/BlueDot_BME680.h

Nachtrag 1:

Der I2C Scanner gibt folgendes aus:
I2C scanner. Scanning …
Found address: 39 (0x27)
Found address: 118 (0x76)
Found address: 119 (0x77)
Done.
Found 3 device(s).

Die Library vom BME280 definiert sich selbst mit der Adresse 0x76 (habs gerade erst gesehen). Deshalb habe ich nun die Verbindung SDO-GND vom BME680 getrennt damit sie (BME680) nun als 0x77 adressiert wird.

Jetzt bekomme ich keine der beiden Fehlermeldungen aber die Ausgabe am LCD ist weiterhin merkwürdig.
Die drei Daten vom BME680 sind immernoch eigenartig, wie z.B 682Pa und 100% Luftfeuchtigkeit, und ändern sich irgendwie garnicht.
Der Wert vom BME280 hingegen liefert wie gewollt den Druck. Das heißt die BME280 funktioniert richtig und die BME680 nicht.

Ich habe es jetzt doch gelöst.

Der Hauptfehler war wohl das #define BME280_ADDRESS 0x76 in der Library des BME280.
Ich nahm an der Sensor sei auf 0x77 und wollte die ganze Zeit den anderen Sensor auf 0x76 laufen lassen.

Zusätzlich habe ich nun auch noch zwei Pull-Up Wiederstände bei beiden Sensoren eingefügt, welche die Messqualität verbessert haben.

Der einzige Fehler der jetzt noch bestehen bleibt ist wenn ich einen Sensor ausstecke meine Fehlerschleife nicht mehr funktioniert. Beim Ausstecken des BME280 passiert nichts außer das der LCD nur weiße Blöcke anzeigt und beim Ausstecken des BME680 nur der blaue Hintergrund angezeigt wird.

Der Code lautet derzeit:

#include <Wire.h>
#include <BlueDot_BME680.h>
#include <Seeed_BME280.h>
#include <avr/wdt.h>
#include <LiquidCrystal_I2C.h>


//Objekte deklarieren
BME280 bme;  //auf 0x76
BlueDot_BME680 bme680;
LiquidCrystal_I2C lcd(0x27, 20, 4);

//////////////////////////////////////////////////////////////////////////////////
void setup() {
Wire.begin();
bme680.parameter.I2CAddress = 0x77;

bme680.init();

//BME680 einstellen
bme680.parameter.sensorMode = 0b01;
bme680.parameter.IIRfilter = 0b100;
bme680.parameter.humidOversampling = 0b101;
bme680.parameter.tempOversampling = 0b101;
bme680.parameter.pressOversampling = 0b101;
bme680.parameter.pressureSeaLevel = 1013.25;
bme680.parameter.tempOutsideCelsius = 20;
//

bme.init();
lcd.init();
lcd.backlight();
lcd.setCursor(4,1);
lcd.print("Probemessung");
delay(1000);
lcd.clear();
if (!bme.init()) {
lcd.print("Kein BME280 angeschlossen");
}
else if ((bme680.init() != 0x61))
//if ((!bme680.init()))
{
  lcd.print("Kein BME680 angeschlossen");
}
//while (1);
}






//////////////////////////////////////////////////////////////////////////////////
void loop() {
bme680.writeCTRLMeas();
float p = bme.getPressure();
float p680 = bme680.readPressure();
 
  lcd.setCursor(1, 0);
  lcd.print("Temp:    ");
  lcd.print(bme680.readTempC()-3);
  lcd.print("C");
 
 
  lcd.setCursor(1,1);
  lcd.print("Feuchte: ");
  lcd.print(bme680.readHumidity());
  lcd.print("%");

  lcd.setCursor(1,2);
  lcd.print("Druck:   ");
  lcd.print(p680);
  lcd.print("hPa");
 
  lcd.setCursor(1,3);
  lcd.print("Druck:   ");
  lcd.print(p/100);
  lcd.print("hPa");

  


delay(1000);


}

kamiigawa: ..... Zusätzlich habe ich nun auch noch zwei Pull-Up Wiederstände bei beiden Sensoren eingefügt, welche die Messqualität verbessert haben.

Hier solltest du nur einen Pullup je Leitung einbauen. Und du solltest sicher sein, dass auf den Sensoren keine Pullups verbaut sind.

Der einzige Fehler der jetzt noch bestehen bleibt ist wenn ich einen Sensor ausstecke meine Fehlerschleife nicht mehr funktioniert. Beim Ausstecken des BME280 passiert nichts außer das der LCD nur weiße Blöcke anzeigt und beim Ausstecken des BME680 nur der blaue Hintergrund angezeigt wird.

Das ein- und ausstecken bitte nur im ausgeschalteten Zustand durchführen. Der I2C-Bus kommt sonst durcheinander.

Und ich vermute, das LCD ist nicht für 3,3Volt geeignet. Bei Mischbetrieb musst du auch auf die Spannung am I2C-Bus achten und evtl. Levelshifter einsetzen.