Mehrere BMP280 Sensoren via I2C auslesen Arduino Uno

Hallo,

ich würde gerne die Temerpatur mehrere Räume messen mit BMP280 Sensoren.

Meine Idee war nun, einen Arduino mit EthernetShield zu verwenden und dann die Sensordaten auf einen Webserver zu schreiben und dann via FHEM diese auszulesen.

Mit dem DTH22 Sensor funktioniert das wunderbar.

Nun habe ich folgendes Problem:

Wie kann ich mehrere BMP280 Sensor auslesen, denn die haben ja immer die gleiche Adresse (0x76)

Jetzt war meine Überlegung jeden Sensor über einen digitalen Ausgang ein und auszuschalten, so dass immer nur einer der 4 Sensoren bestromt ist.

Habe nun das Problem, dass er meine Schleife durchläuft, mir aber unplausible Werte ausgibt und sogar ab den 2 Durchlauf immer den gleichen Wert, der aber zu keinen der beiden Sensoren passt.

Mein Aufbau:

BMP280 —> Arduino Uno

SDA —> A5
SCL → A4
GND → GND
VCC Sensor 1–> auf Pin 7,
VCC Sensor 2 → auf Pin 8

Nutze die Bibliothek von Catus.io

Mit nur einem Sensor funktioniert alles perfekt.

Anbei mein Code für 2 Sensoren

/***************************************************************************
  This is a library for the BME280 humidity, temperature & pressure sensor
  Designed specifically to work with the BME280 Breakout board
  ----> http://www.adafruit.com/products/2650
  This sketch only supports the I2C bus for connection.
 ***************************************************************************/
 
#include <Wire.h>
#include "cactus_io_BME280_I2C.h"
 
BME280_I2C bme(0x76);  // I2C using address 0x76

int Sensor_1 = 7;                 // LED connected to digital pin 13

int Sensor_2 = 8;                 // LED connected to digital pin 13
int i =1;

void setup() {

  pinMode(Sensor_1, OUTPUT);
  digitalWrite(Sensor_1, HIGH);
  pinMode(Sensor_2, OUTPUT);
  digitalWrite(Sensor_2, LOW);
  Serial.begin(9600);
  Serial.println("BME280 Luftdruck, Luftfeuchtigkeit, Temperatur Sensor | cactus.io"); 
  Serial.println("-----------------------------------------------------------------");
  Serial.println("");
 
  if (!bme.begin()) {
    Serial.println("Es konnte kein BME280 Sensor gefunden werden!");
    Serial.println("Bitte überprüfen Sie die Verkabelung!");
    while (1);
  }
 
  bme.setTempCal(-1);
  
  Serial.println("Luftdruck\tLuftfeuchtigkeit\t\tTemperatur(Celsius)\t\tTemperatur(Fahrenheit)");
}
 
void loop() {
    

    if (i==1){
      //bme.begin();
      digitalWrite(Sensor_2, LOW); 
      digitalWrite(Sensor_1, HIGH); 
      delay(1000);
      bme.readSensor();
      Serial.print("1terSenor"); Serial.print("\t\t"); 
      Serial.print(bme.getPressure_MB()); Serial.print("\t\t");    // Pressure in millibars
      Serial.print(bme.getHumidity()); Serial.print("%\t\t\t\t");
      Serial.print(bme.getTemperature_C()); Serial.print(" °C\t\t\t");
      Serial.print(bme.getTemperature_F()); Serial.println(" °F");
      delay(1000);
      i=2;
      Serial.println("i:");
      Serial.print(i);
      Serial.println("");
    }
    if (i==2){
      //bme.begin();
      digitalWrite(Sensor_1, LOW); 
      digitalWrite(Sensor_2, HIGH); 
      delay(1000);
      bme.readSensor();
      Serial.print("2terSenor"); Serial.print("\t\t"); 
      Serial.print(bme.getPressure_MB()); Serial.print("\t\t");    // Pressure in millibars
      Serial.print(bme.getHumidity()); Serial.print("%\t\t\t\t");
      Serial.print(bme.getTemperature_C()); Serial.print(" °C\t\t\t");
      Serial.print(bme.getTemperature_F()); Serial.println(" °F");
      delay(1000);
      i=1;
      Serial.println("i:");
      Serial.print(i);
      Serial.println("");
    }
}

Habt ihr Ideen, Anregungen wie ich dieses Problem lösen kann?

Danke & Gruß

Hi

Mehrere gleiche Geräte gehen mit einem Multiplexer - da die BME280 I²C sind und der Bus keine größeren Entfernungen überbrücken kann - wie wahrscheinlich ist es, daß Du mehrere Räume mit einem Arduino erfasst bekommst?

Auf Seite 31:
PDF, BME280
Mittels des SDO-Pin kann die Adresse zwischen 0x76 und 0x77 umgeschaltet werden.
Jeder BME280 bekommt einen D-Out vom Arduino auf den SDO-Pin, LOW=0x76, HIGH=0x77.
Alle, bis auf Einen, werden HIGH gesetzt - Deine Anfrage an 0x76 wird von dem Einem beantwortet, Der nicht HIGH gesetzt ist.
In der nächsten Runde stellst Du einen Anderen auf LOW und liest mit dem gleichen Code einen anderen Sensor aus.
Wichtig ist, daß der LDO-Pin NICHT unbeschaltet bleibt, Der muß zwingend nach Vdd oder GND gezogen werden, sonst 'ändert sich die Adresse je nach Mondphase' ... und bei jeder sonstigen Störung, Die der Sensor auch nur erahnen kann.

MfG

Jetzt war meine Überlegung jeden Sensor über einen digitalen Ausgang ein und auszuschalten, so dass immer nur einer der 4 Sensoren bestromt ist.

Das geht gar nicht. Fast alle ICs dürfen an den Eingängen keine höhere Spannung haben als an der Spannungsversorgung angelegt ist. Das heißt ohne Versorgungspannung darf an den Eingängen sprich SDA, SCL und SDO keine Spannung anliegen.

Es ist richtig, daß man durch Ansteuern des Adresspins jedes BME280 durch je einen Arduino-Ausgang jeweils einen BME scharf schalten kann.

Praktisch ist das nicht zu empfehlen, da laut Projekt mehrere Räume Temperaturüberwacht werden solle und darum diese Sensoren weit voneinander entfernt sind. Da funktioniert I2C nicht mehr. Zusätzlich ist es nicht sicher ob ein 5V Signal über mehrere Meter sicher übertragen werden kann.

Ich rate einen Arduino pro Sensor und Übertragung über RS485 oder CAN-Bus oder ähnliches Multipoint Bus.

Grüße Uwe

Moin,

Ich habe 8 Stück BME280 an einem nodeMCU ESP8266 am laufen und am loggen. Ich mache das zu Testzwecken und habe dabei interessante Ergebnisse zu Tage gefördert. Ich habe die Sensoren in 4 Gruppen aufgeteilt. Jede Gruppe hat zwei Sensoren mit den jeweils beiden möglichen Adressen. Und die 4 Gruppe kommunizieren einfach über 4 I2C Busse, aber nicht gleichzeitig sondern hintereinander. Ich initialisiere einfach den I2C Bus immer wieder auf einen anderen PIN durch. Dann sende ich die Daten per WLAN an meinen volkszähler.org

Lieben Gruß,
Chris

themanfrommoon:
Moin,

Ich habe 8 Stück BME280 an einem nodeMCU ESP8266 am laufen und am loggen. Ich mache das zu Testzwecken und habe dabei interessante Ergebnisse zu Tage gefördert. Ich habe die Sensoren in 4 Gruppen aufgeteilt. Jede Gruppe hat zwei Sensoren mit den jeweils beiden möglichen Adressen. Und die 4 Gruppe kommunizieren einfach über 4 I2C Busse, aber nicht gleichzeitig sondern hintereinander. Ich initialisiere einfach den I2C Bus immer wieder auf einen anderen PIN durch. Dann sende ich die Daten per WLAN an meinen volkszähler.org

Lieben Gruß,
Chris

Dann verwendest Du aber eine Softwareemuletion des Busses, weil der Arduino nur einen Hardware-I2C Bus hat.
Es gibt I2C Multiplexer die mehrere Subbusse bereitstellen und in denen Geräte mit gleichen Adressen vorkommen können.

Grüße Uwe

Hi

Über welche Entfernung?
Bei 'normalen' Räumen sehe ich die Möglichkeit, am Kreuzungspunkt die Sensoren 'durch die Wand' zu versorgen - denke aber, Du hast Das anders gelöst?

Mit welcher Geschwindigkeit?
Hast Du den Bus händisch gedrosselt, um Lesefehler entgegentreten zu können?
Wie groß sind Deine PullUPs? Bei größeren Entfernungen rechne ich mit Störungen, Denen man mit recht kleinen PullUPs begegnet könnte.

... ich brauche mehr Details ... :wink:

MfG

Range-Externder wie der P82B96 wären noch eine Möglichkeit, das ganze über größere Distanz zu bewerkstelligen.

@postmaster-ino: Wen meinst du jetzt mit "du"? Mich?

Meins ist hier schon dokumentiert: Luftfeuchtigkeit kalibrieren - #6 by themanfrommoon - Deutsch - Arduino Forum

Hi

themanfrommoon:
@postmaster-ino: Wen meinst du jetzt mit "du"? Mich?

Jupp, sorry, da kam Uwe dazwischen und ich hatte meinen Post dann nicht mehr personalisiert - gelobe Besserung.
... hatte ich nicht 'Du' geschrieben? Dann bitte das Du groß vorstellen.

MfG

Aha, okay, dann siehe oben meinen Link.
Die Sensoren sind alle auf einem Breadboard nebeneinander aufgebaut.
Auf mehrere Räume verteilt wird das wohl so nicht gehen.

Ich habe in meinem Haus eine Busleitung verlegt und mir dann erst später überlegt was ich damit genau mache.
Dort hängen jetzt in allen Räumen mindestens ein DS18b20 über 1-Wire dran.
Die hatte ich vorher auch auf einem Breadboard ausprobiert, da waren die Kurven quasi deckungsgleich. Also habe ich sie ruhigen Gewissens überall verteilt.
Die BME sind dagegen eher Schätzeisen für die Temperatur, siehe meine Logs im anderen Thread.
Ich glaube die Temperatur ist bei den BME280 auch nur dafür da intern die Luftfeuchtigkeit zu kompensieren. Als Benefit kann man die aber auch raus bekommen.
Für Temperaturmessungen ist man mit DS18b20 besser beraten.
Und wie viele Luftfeuchtigkeitssensoren braucht man denn im Haus? (Mein Ziel sind die 6 Stück identischen aus meinem anderem Thread, was ich mit den anderen beiden anderer Bauart mache weiß ich noch nicht).
Die werden dann in den beiden Bädern, Zuluft und Abluft sowie 2x draußen platziert.
Wahrscheinlich jeweils an einem ESP8266 angeschlossen und dann über WLAN.

Lieben Gruß,
Chris

Vielen Dank für die vielen Antworten.

Anbei weitere Informationen zu meinen angedachten Aufbau.

Ich habe in jeder Etage einen Fussbodenverteiler. Zu diesem führen von jeden Raum ein Raumfühler der das Magnetventil betätigt.

Hier möchte ich gerne ansetzten. Da die Raumfühler zu ungenau sind, zu alt und teilweise Defekt wollte ich selber eine Regelung bauen.

Meine Idee war nun in jedes Gehäuse vom Raumfühler einen BME Sensor zu verbauen. habe mir dafür die kleinen lila Sensoren gekauft mit 4 Pins da diese gut ins Gehäuse passen würden.

Daher Kann ich schon mal nicht über low oder high die Adresse ändern um immer nur einen Sensor auszuwählen. Gut ggf. Müsste man sich neue kaufen aber erst wenn ein Probeaufbau funktioniert.

In jeden Fussbodenverteiler Habe ich mir eine Steckdose verbaut wo ich ein Poweradapter einsetzen möchte damit ich über Ethernetschild die Daten ins Heimnetzwerk und dann zum Fhem bekomme.

Aktuell habe ich im Fussbodenverteiler ein Wemos D1 welches mir von mehreren DS18b20 jeweils die Vorlauf und Rücklauftemperatur übermittelt an meinem Fhem.

Jedoch möchte ich gerne vom WLAN weg daher der neue Ansatz.

Einen Bus habe ich nicht da die Elektroinstallation schon besteht. daher kann ich nur den 230v Raumfühler abklemmen und diese Leitung als Steuerleitung für den BME Sensor nutzen. So meine Idee.

Die Leitungslänge beträgt ca 6-8m in die jeweiligen Räume.

Die Unterputzdose hinter dem Raumfühler ist leer und kann auch genutzt werden. Aber eigentlich wollte ich jetzt nicht in jedem Raum einen Arduino oder anderes verbauen da diese ja 24/7 laufen und bei 11 Räumen schon einen Verbrauch Übers Jahr erzeugen.

Soviel zum Aufbau.

Anregungen etc gewünscht

Hallo,

habe gerade mal geschaut, ich kann auch einen DS18B20 in das Raumfühlergehäuse unterbringen.

Wäre das dann mit OneWire eine alternative?

Was denkt ihr wie gut ich die 3.3V über 6-8 Meter bekomme?

Hätte zwar gerne die Luftfeuchtigkeit aber die kann ich mir dann noch anders mal irgendwo herholen.

Das denkt ihr ist das ein gute Alternative

Hi

Versuch macht kluch - befürchte aber, daß Du Störungen auf die Leitung bekommen wirst, da Diese wohl in direkter Nachbarschaft der übrigen 230V-Verkabelung verlegt sind.
Ok, so ein Arduino kostet zwar nicht die Welt, aber viel weiter, als vorher, bist Du damit dann auch nicht - über 6...8 Meter versteht Der auch nur Bahnhof.
Ob hier CAN funktioniert, wäre ebenfalls vorerst zu Prüfen - vor Allem, muß der der Kram ja WIRKLICH funktionieren und nicht nur ab und zu Mal.
Da sich Temperaturen nur sehr gemächlich verändern, kommt's hier nicht auf Sekundenbruchteile an, man könnte also die Kommunikationsgeschwindigkeit runter setzen, denke aber, daß Du trotzdem nicht über einen fertigen Bus herum kommst - also z.B. CAN.
Da die Sensoren aber kein CAN schwätzen, bliebe der Arduino obligatorisch.

MfG

PS: Für Temperaturen war im Nachbar-Thread eh gerade die Meinung, daß ein DS18B20 um Welten besser ist - wie der Hersteller Das sieht, sollte im Datenblatt ersichtlich sein.