In diesem Tutorial möchte ich den Sensor BME280 vorstellen. Mit diesem Sensor kannst du die Umweltdaten wie Temperatur, Luftfeuchtigkeit und Luftdruckmessen. Dieser Sensor wurde mir vom Onlineshop Makershop.de kostenlos für dieses Review zur Verfügung gestellt.
Technische Daten
- Abmaße (L x B) – 14 mm x 10 mm
- Betriebsspannung – 1.8V bis 5V
- Schnittstelle – I2C
- Messbereiche
- Temperatur -40 °C bis +85 °C
- Luftdruck 300hPa bis 1100hPa ±0.25 %
- Luftfeuchtigkeit ±3 % relative Genauigkeit, ≤ 2 % Hysterese
Anschluss
Der Sensor verfügt über 4 Pins, welche wie folgt an den Arduino UNO angeschlossen werden:
BME280 | Arduino UNO |
---|---|
VIN | 5V |
GND | GND |
SCL | analoger PIN A5 |
SDA | analoger PIN A4 |
Schaltung
In diesem Kapitel möchte ich nun eine kleine Schaltung mit dem Sensor und einem Display für die Ausgabe der Werte erzeugen.
Wenn du diese Schaltung nachbauen möchtest, so benötigst du:
- 1x Arduino Nano
- 1x Sensor BME280
- 4x Breadboard Kabel
- 1x Breadboard 400 Pin
Bibliothek
Für den Sensor gibt es eine Bibliothek von Adarfuit welche über die Arduino IDE installiert werden kann. Wie genau das funktioniert, habe ich im nachfolgenden Video gezeigt.
Zusätzlich wird noch die Bibliothek Adafruit Sensor benötigt. Diese kann leider nur vom GitHub Repository https://github.com/adafruit/Adafruit_Sensor geladen werden.
Bedauerlicherweise hat diese Bibliothek mit meinem Arduino Nano nicht funktioniert, daher habe ich zur Bibliothek von http://cactus.io gewechselt. Hier musste ich im Beispiel nur die I2C Adresse “0x76” auskommentieren. Und es funktionierte von Anhieb sehr gut.
Quellcode
Beispiel zur Bibliothek von http://cactus.io
Den nachfolgenden Quellcode habe ich von der Seite http://cactus.io/hookups/sensors/barometric/bme280/hookup-arduino-to-bme280-barometric-pressure-sensor kopiert und deutsche Texte verpasst. Das Beispiel erzeugt auf dem seriellen Monitor eine Ausgabe.
/*************************************************************************** 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 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); }
Beispiel – Ausgabe auf einem 0,9″ OLED Display
Für diese Schaltung benötigst du:
- einen Taster
- einen 10kOhm Widerstand (als PullDown)
- ein 0,91″ OLED Display
- einen Arduino Nano
- 12 Breadboard Kabel
- ein 400 PIN Breadboard
- ein BME280 Sensor
Quellcode
#include <Wire.h> #include "cactus_io_BME280_I2C.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #if (SSD1306_LCDHEIGHT != 32) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif #define BTN_UP 9 int statusBtnUp = 0; //Status des Tasters int index = 1; // Zählvariable BME280_I2C bme(0x76); // I2C using address 0x76 void setup() { Serial.begin(9600); //Setup für den BME280 Sensor 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); //Setup für das Display display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(1000); display.clearDisplay(); //Setup für den Button pinMode(BTN_UP,INPUT); } void loop() { bme.readSensor(); statusBtnUp = digitalRead(BTN_UP); Serial.println(statusBtnUp); if(statusBtnUp == HIGH && index <3){ index = index+1; } else if (statusBtnUp == HIGH && index ==3){ index = 1; } switch(index){ case 1: zeigeTemperatur(); break; case 2: zeigeLuftfeuchtigkeit(); break; case 3: zeigeLuftdruck(); break; } } void zeigeTemperatur(){ String tempC = String(bme.getTemperature_C())+"C"; displayText("Temperatur", tempC); } void zeigeLuftfeuchtigkeit(){ String humidity = String(bme.getHumidity())+"%"; displayText("Luftfeuchtigkeit", humidity); } void zeigeLuftdruck(){ String pressure = String(bme.getPressure_MB())+" mPa"; displayText("Luftdruck", pressure); } void displayText(String row1, String row2){ delay(1000); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println(row1); display.setCursor(0,10); display.println(row2); display.display(); display.clearDisplay(); }
Vielen Dank für diese Infos. Auch bei mir funktionierte Adafruit Code nicht. Mit dem Cactus Code alles bestens.
Habe dann nochmal Adafruit ausprobiert und nachdem ich die Adresse in dem header file “Adafruit_BME280.h” von 0X77 in 0X76 geändert hatte, funktionierte es.
Hallo zusammen,
ich suche nach einem ähnlichen Projekt, werde aber leider nicht fündig.
Folgende Situation: In jedem Raum befindet sich ein Raumtermostat, welches 3 der 5 verlegten Kabel benötigt. Die Kabel sind jeweils vom Raumtermostat in den zentralen Heizungsverteiler verlegt. Dort könnte man also die übrigen 2 Kabel jeweils mit einer anderen Spannung etc. versorgen.
Ich möchte gern in allen Zimmern die Temperatur und Luftfeuchte messen. Hinter dem Raumtermostat ist jeweils eine Unterputzdose verbaut und ausreichend Platz für die übrige Technik. Am Raumtermostat möchte ich dann 2 LED (1x gelb und 1x rot) betreiben, welche mit lokal anzeigen, dass die Luftfeuchte zu hoch ist.
Zentral möchte ich dann die Daten via ESP? an mein FHEM senden um dort damit weiter zu arbeiten.
Könnte sich jemand das mal anschauen.
Vielen Dank im Vorraus
Grüße Marcus
Hi,
es gibt ein DHT11 Shield für den ESP-01S
https://www.ebay.de/itm/ESP-01-01S-DHT11-Temperatur-messen-Board-Erweiterung-ESP8266-Modul-WIFI-Arduino/253998625963?hash=item3b237f74ab:g:5tMAAOSwsn9b-upz
dieses sollte in eine Unterputzdose passen, das einzige was man noch verlegen müßte wäre eine Stromzufuhr.
Die Daten von den ESPs müßte dann vielleicht ein Raspberry PI (oder ähnliches) sammeln und zentral verwalten.
Gruß,
Stefan Draeger
SDA -> Analog 4 (nicht 5)
SCL -> Analog 5 (nicht 4)
Hi,
danke für den Hinweis, da ist mir wohl ein kleiner Fehler unterlaufen.
Habe ich sofort korrigiert.
Gruß,
Stefan Draeger
laut datenblatt bme280 verträgt dieser 1.71 V bis 3.6 V. Ein anschluss an 5V ist irgendwann fatal…
Hi,
danke für dein Kommentar, es gibt 2 Modelle von dem BME280 Sensor, einmal wie du beschrieben hast bis max. 3,6V und einmal bis 5V so wie in diesem Fall.
Gruß,
Stefan Draeger
Genauer gesagt: Es gibt den Sensor nicht in zwei Versionen – aber das Shild gibt es in unterschiedlichen Beschaltungen – für 3,6V oder für 5V.
Sehr schön beschrieben – Danke!
habe es 1 zu 1 nachgebaut und mit der “neuen” 280-Cactus-Bibliothek sind die Werte ziemlich genau!
habe nur eine Frage bzw. Bitte: was muss man umstellen, dass “der Wert”, also nur die Zahl am Display formatfüllend ist?
hab mich mit den OLEDs noch nicht so viel befasst
Danke im voraus
Hallo Stefan,
GRATULATION ! Endlich einmal ein Projekt, wo auch “blutige anfänger” wie ich sich herantrauen.
Gibt es irgendwann einmal eine Version wo alle 3 Werte (Temp. / hPa / %) auf einmal untereinander angezeigt werden ?
Gruß
Michael
Hi Michael,
alle 3 Werte untereinander würde ähnlich funktionieren wie nur 2 Werte.
Ich bringe dir dazu mal ein separaten, kurzen Beitrag.
Gruß,
Stefan Draeger
Hi,
geht bei mir auch mit Adafruit_BME280 lib. Musste nur die Zeile
status = bme.begin();
in
status = bme.begin(0x76);
abändern.
(Hardware ESP32)
Gruß Norbert
Gibt es die Möglichkeit, einen zweiten Sensor an andere analoge Pins anzuschließen, um z.B. innen und außen zu messen?
Hallo Herr Langel,
auf der Vorderseite des Sensors sind drei Lötpins über welche man die I2c Adresse ändern kann.
Somit kann man zumindest zwei Bme280 per I2c anschließen.
Gruß,
Stefan Draeger
Hallo Stefan,
Echt eine tolle Seite. Super hilfreich.
Die einzelnen Projekte (dieses) und das Projekt 27-datalogging funktionieren super!
Leider scheitere ich seit Tagen an der Kombination der beiden. Hab schon viel zu viel Zeit reingesteckt und bin nur noch gefrustet.
Mein letzter Versuch, ob Du oder sonst jemand hier weiter weiß?!
(Arduino Nano; BME280; 0,91‘ oled > alles ueber i2c Schnittstelle. (Klappt auch)
+ sd Card + rtc (seek robot 8122)
Data soll auf SD Card, Zeit auf Oled. (Klappt Nicht!) 🙁
Würde mich sehr über helfende Tipps freuen! Danke