Mehrere I2C-Sensoren über wire ansteuern

Hallo, mein Name ist Mareike. Durch meinen verstorbenen Sohn wurde ich auf das Thema Arduino/ESP8266 aufmerksam, und ich möchte seine alte Wetterstation reparieren. Hier ist mein aktuelles Problem:

Obwohl alle Sensoren (MLX90614, BMP280/BME280) erfolgreich vom I2C-Scanner erkannt werden, funktionieren die Datenleseoperationen im Hauptsketch nicht wie erwartet. Der MLX90614 ist an den Standard-I2C-Pins angeschlossen, während der BMP280/BME280 an anderen Pins angeschlossen ist, die mit Wire.begin() initialisiert wurden. Es besteht Unsicherheit darüber, warum die Sensoren vom I2C-Scanner erkannt werden, aber die Daten im Hauptsketch nicht erfolgreich gelesen werden können.

Ich habe im Internet gelesen, dass man auch alle SDA- und SCL-Kabel der Sensoren zusammenlöten kann und dann auf die SDA- und SCL-Pins gehen kann. Oder soll ich so etwas lassen und gleich einen I2C-Multiplexer verwenden?
So sind die Sensoren angeschlossen:

Die "Loop"-Methode ist leer, somit habe ich das hier nicht mit gepostet.

MLX90614 SLC -> Pin 4, SCL -> >Pin 5
BMP280:  SLC -> Pin 0 , SDA -> Pin 2
BME280: SLC -> Pin 12, SDA -> 13

Alle sind mit 3.3V und GND verbunden.

Das Hauptsketch: `


#define BME_SDA 13
#define BME_SCL 12

#define BMP_SCL  0
#define BMP_SDA  2

Adafruit_BMP280 bmp;
Adafruit_BME280 bme;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup()
{
  Serial.begin(115200);         
  Serial.println('\n');
  Wire.begin();
  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);             
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID); 
  Serial.println(" ...");

  int i = 0;
  while (WiFi.status() != WL_CONNECTED) { 
    
    delay(1500);
    Serial.println(".");

    if(i > 10){

      ESP.restart();
    }
  }
   sensorState();

}


void sensorState() {
    
  bool allSensorsWorking = true;

  sensors.begin();
  float tempC = sensors.getTempCByIndex(0);


  if (tempC == DEVICE_DISCONNECTED_C) {
    Firebase.setString( fb,"/sensorStates/DS18b20", "Der DS18b20 funktioniert nicht!");
    Serial.println("Der DS18b20 funktioniert nicht!");
    allSensorsWorking = false;
  }
     Wire.begin(4, 5);
  if (!mlx.begin(0x5A)) {
    Firebase.setString(fb, "/sensorStates/MLX90614", "Der MLX90614 funktioniert nicht!");
    Serial.println("Der MLX funktioniert nicht!");

    allSensorsWorking = false;
  }
  
    Wire.begin(BMP_SDA, BMP_SCL);
  if (!bmp.begin(0x58)) {
    Firebase.setString(fb, "/sensorStates/BMP", "Der BMP280 funktioniert nicht!");
    Serial.println("Der BMP280 funktioniert nicht!");
    allSensorsWorking = false;
  }

    dht.begin();

  if (isnan(dht.readTemperature()) || isnan(dht.readHumidity())) {
    Firebase.setString(fb,"/sensorStates/DHT22", "Der DHT22 funktioniert nicht!");
    Serial.println("Der DHT funktioniert nicht!");

    allSensorsWorking = false;
  }

     
    Wire.begin(BME_SDA, BME_SCL);
  if(!bme.begin(0x76)){

    Firebase.setString(fb, "/sensorStates/BME280", "Der BME280 funktioniert nicht!");
    Serial.println("Der BME280 funktioniert nicht!");

    allSensorsWorking = false;

  }

  if (allSensorsWorking) {
    Firebase.setString(fb, "/sensorStates/DS18b20", "OK");
    Firebase.setString(fb, "/sensorStates/MLX90614", "OK");
    Firebase.setString(fb, "/sensorStates/BMP280", "OK");
    Firebase.setString(fb, "/sensorStates/DHT22", "OK");
    Firebase.setString(fb, "/sensorStates/BME280", "OK");


  }
}`

Vielen Dank im Voraus für jegliche Unterstützung.

Herzliche Grüße,
Mareike

Wo zu auf andere Pins I2C kann mehrere Dinger anschprechen, oder gibts die gleichen Adresen?

I2C Sensoren sollten eigentlich auf einem I2C Bus - das heißt auf den gleichen SDA/SCL Leitungen - funktionieren.

Die Sensoren unterscheiden sich in ihren Adressen.

Nimm mal den BMP und den BME Sensor, schließ beide an den gleichen SDA/SCL Leitungen an.
Kontrolliere mit dem I2C Scanner ob beide Adressen abfragbar sind
Kombiniere die beiden Mustersketche.
Wenn das funktioniert hat, ergänze den MLX90614

Verwendest du tatsächlich die gezeigte Pins ?
Und welchen I2C-Scanner verwendest du ?
Wenn dieser alle Adressen richtig zeigt, dann kann das so nicht stimmen.
Mir ist kein Scanner bekannt, der automatisch die Pins wechselt.

Hallo,

Das war der I2C-Scanner-Sketch, den wir verwendet haben:

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.begin(13,12);
  Wire.begin(2,0);
  
  Serial.println("I2C-Scanner");
}

void loop() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; ++address) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      ++nDevices;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }

  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000); // wait 5 seconds for the next scan
}

Die Ausgabe:

Scanning...
I2C device found at address 0x38 !
I2C device found at address 0x77 !
done

Die Ausgabe habe ich auch nur bekommen, wenn ich den MLX weggelassen habe, war der MLX in Sketch eingebunden, wurde nur der MLX aufgelistet.

I2C device found at address 0x5A !

Der Scanner wurde modifiziert.
Deaktiviere mal diese beiden Anweisungen mit // davor.

Und lege alle I2C Sensoren auf die Pins "GPIO4 (SDA) and GPIO5 (SCL)".
Dann solltes du alle Sensoren sehen können.

Und dazu nur

Wire.begin();

Schreiben, man kann

Wire.begin(4,5);

Scheiben, nur braucht man nicht.

Das steht doch schon drin.

Warum denn nun wieder so kompliziert ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.