• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Anleitung BME280 Umweltsensor - Temperatur, Luftdruck, Luftfeuchtigkeit

BAXL

Admin
Mitarbeiter
BME 280 Sensor

Den BME280 Sensor für Temperatur, Luftdruck und Luftfeuchtigkeit erhält man für den Arduino bereits auf einer kleinen Platine mit etwas Zusatzschaltung montiert. Zum leichteren Anschluß an den Arduino lötet man einfach noch vier Kontaktpfosten in den vorgesehenen Lötbohrungen an. Die Anschlüsse sind für Betriebsspannung Vin, Masse GND und zwei Anschlüsse für die serielle Datenübermittlung SCL und SDA, die der I2C Anschluss zum Arduino sind. Für die Betriebsspannung erhält man oft widersprüchliche Angaben. Mal liest man maximal +3,3V, oder auch +5V, weil ein entsprechender Spannungsregler verbaut sein soll. Auf der sicheren Seite ist man auf jeden Fall mit 3,3V. Die habe ich bei meinem Exemplar auch angeschlossen. SDA habe ich mit A4 und SCL mit A5 an meinem Nano verbunden.



Auf der Rückseite der Platine findet sich ein Baustein 662K, was ein Spannungsregler ist, der aus 5V, 3,3V macht. Das lässt den Schluß zu, dass die Sensorplatine tatsächlich auch an 5V angeschlossen werden kann.



Die Beschriftung auf meiner Sensorplatine ist BME/BMP280. Auf dem Sensor selbst (das ist das kleine silberne viereckige Käferchen auf dem 789 UP steht) konnte ich aber weder BMP280 noch BME280 lesen. Meine Versuche lassen aber den Schluß zu, dass es sich tatsächlich um den BME280 handelt, zumal der Lieferant (AZ-Delivery) in seiner Produktbeschreibung auch BME280 angibt.

Die Inbetriebnahme war ziemlich tricky. Das bin ich aber schon gewohnt, dass die scheinbar kleinsten und einfachsten Sachen oft ihre Tücken haben.
Auf der Suche nach einer passenden Library habe ich mich bei Adafruit umgetan und bin sofort fündig geworden (https://github.com/adafruit/Adafruit_BME280_Library). Library installiert (bzw. als ZIP heruntergeladen und in den Libraryordner kopiert) und das Beispielprogramm in die IDE geladen. Beim Compilieren kam sofort eine Fehlermeldung, dass die Lib Adafruit_Sensor.h nicht gefunden wurde. Sofern man vorher noch nie eine Ardafruit Lib verwendet hat, kann es sein, dass noch die "Adafruit Unified Sensor " nachinstalliert werden muß. Nachdem das erledigt war klappte auch der Compilierungsvorgang ohne Fehlermeldung.

Leider funktionierte der Sensor nicht, bzw. bekam ich keine Werte auf dem seriellen Monitor am PC angezeigt. Also die nächste Library gesucht und installiert. Das war dann die von cactus_io_BME280_I2C von cactus.io Download - BME280 I2C Library . Mit dieser Lib und folgendem Programm bekam ich dann endlich Werte angezeigt.

Code:
#include <Wire.h>
#include "cactus_io_BME280_I2C.h"

BME280_I2C bme(0x76); // I2C using address 0x76

void setup() {
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() {
bme.readSensor();

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(2000);
}
Dann ahnte ich, warum es wahrscheinlich mit der Adafruit Lib nicht funktionierte. Kurz den Code der Ardafruit Lib angesehen und da war auch schon das Problem gefunden.

Das Beispielprogramm von Ardafruit initialisiert den Sensor einfach mit dem Befehl bmp.begin() , also ohne jegliche Parameterübergabe. In der Lib wird als Standardsensoradresse 0x77 gesetzt, wenn man keine Parameter in begin() einfügt. Nachdem ich dann in den Aufruf BMP.begin(0x76) eingetragen hatte lief es. Es lag also an der Sensoradresse. Der Sensor kann sowohl mit 0X76, als uch mit 0x77 angesprochen werden, sofern man auf der Platine eine kleine Änderung vornimmt. Auf dem Foto sieht man links neben dem Sensor drei Lötpads. Das obere und mittlere Lötpad sind ab Werk per Leiterbahn verbunden, was die Adresse 0x76 setzt. Möchte man auf 0x77 umstellen, muß man die Leiterbahn unterbrechen (mit einem scharfen Messer durchtrennen) und einen Lötklecks zwischen das mittlere und untere Lötpad setzen.
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Damit ist die Sache aber noch nicht komplett erledigt. Der scheinbar einfache Sensor bietet eine Vielzahl Einstellmöglichkeiten, die mir zum Teil erst etwas schleierhaft erscheinen.

Da gibt es zuerst den Betriebsmodus, den man mit setMode(Modus) umstellen kann. Es gibt drei Modi, den BME280_NORMAL_MODE, BME280_FORCED_MODE -> SLEEP MODUS und den BME280_SLEEP_MODE.

Beim Sleep Mode macht der Sensor nichts, er schläft also. Im Normal Modus werden regelmäßig Messungen durchgeführt, die aber von der Stand By-Zeit und vom Oversampling abhängen. Oversampling heißt, dass mehr Messwerte erfasst werden, als tatsächlich erforderlich sind. Das soll die Messgenauigkeit erhöhen.
Beim Forces Modus wird immer nur eine Messung durchgeführt und der Sensor danach sofort wieder schlafen gelegt.

Kommen wir zum Oversampling. Dafür gibt es für die Messgrößen Temperatur und Druck unterschiedliche Einstellmöglichkeiten. Bei Oversampling 0, erfolgt bei keiner der Messgrößen eine Messung.

Für die Tempratur- und Druckmessung gibt es ein Oversampling von x1, x2, x4, x8, x16, was einer Auflösung von 16, 17, 18, 19 und 20 Bit entspricht. Also je höher, desto genauer, was aber auch länger dauert.

Die Standby Zeit lässt sich in 8 Stufen von 0,5ms bis 4000 ms einstellen. D.h., wie lange der Sensor sich quasi schlafen legt.

Was mir aber immer noch etwas unklar ist, ist die Einstellung des Filter Koeffizienten für die Luftdruckmessung. Da geht es um die Zahl der Abtastungen. Da wird die Anzahl Messungen angegeben die gemacht werden sollen, wenn der Messwert sprunghaft ansteigt, bis der Messwert 75% des neuen Druckwertes erreicht hat. Verstanden? Nein? Ich auch noch nicht. :).

Es gibt auf jeden Fall Abhängigkeiten zwischen den Parametern, die sich auf den Stromverbrauch, die Signalauflösung, Messzeiten, Signalrauschen usw. auswirken. Es gibt für diverse Messaufgaben bewährte Kombinationen, von denen ich aber nur die Konfiguration für eine Wetterstation aufliste.


Sehr geringer Stromverbrauch und ein Messintervall von ca 15ms
  • SLEEP_MODE (Aufruf des Forced_Modus mit "startSingleMeas()", z.B. 1 mal pro Minute)​
  • P_OVERSAMPLING_x1​
  • T_OVERSAMPLING_x1​
  • FILTER_COEFF_0​
  • STANDBY_TIME_xxxx (Standby time im Forced Mode ohne Bedeutung)​
Genauer beschrieben findet man es hier.


 

BAXL

Admin
Mitarbeiter
Zwischenzeitlich habe ich den BME280 parallel zum HTU21 betrieben und die Messwerte verglichen:

15:39:30.719 -> BME Temp: 23.09 C
15:39:30.719 -> HTU Temp: 23.18 C
15:39:30.766 -> Luftdruck = 1004.27 hPa
15:39:30.766 -> Approx. Altitude = 75.04 m
15:39:30.813 -> BME Humidity: 37.70 %
15:39:30.813 -> HTU Humidity: 40.72 %

Es zeigt sich, dass die Sensoren bei der Temperatur etwas weniger als 0,1°C und bei der Luftfeuchtigkeit nur ca. 3% auseinander liegen.

Wer noch mehr Hunger nach Informationen hat kann sich auf den Seiten der folgenden Links austoben:
Datenblatt

Für ESP-Nutzer
 
Zuletzt bearbeitet:
Top Bottom