In diesem Beitrag möchte ich dir zeigen, wie du den Umweltsensor BME680 am ESP8266 von Ideaspark programmierst. Der Mikrocontroller verfügt bereits über ein OLED Display und daher ist dieser Mikrocontroller ideal dafür geeignet Sensordaten sehr einfach zu visualisieren.
Den Umweltsensor BME680 habe ich dir bereits für den Arduino im Beitrag Arduino Lektion #113: Umweltsensor BME680 vorgestellt und gezeigt, wie dieser über I2C programmiert wird. Hier möchte ich nun die andere Schnittstelle (SPI) nutzen, um diesen mit dem ESP8266 zu verbinden.
Die Idee zu diesem Beitrag habe ich aus einem Kommentar vom Beitrag ESP8266 Programmierung mit 0,96″ OLED Display von Ideaspark: Eine Schritt-für-Schritt-Anleitung entnommen, wo mich ein aufmerksamer Leser gefragt hat, wie dieser Sensor am Mikrocontroller programmiert wird. Daher geht zunächst ein Gruß an Michael B. heraus.
Inhaltsverzeichnis
- Benötigte Ressourcen für dieses Projekt
- Aufbau der Schaltung – Sensor BME680 am ESP8266 von Ideaspark
- Programmieren in der Arduino IDE
- Schritt 2 – auslesen der Sensorwerte vom Umweltsensor BME680 am Ideaspark ESP8266
- Schritt 3 – Anzeigen der Sensordaten auf dem OLED Display
Benötigte Ressourcen für dieses Projekt
Wenn du dieses Projekt nachbauen möchtest, dann benötigst du:
- einen ESP8266 von Ideaspark* mit OLED Display, oder
- einen ESP8266 mit separatem 0,96″ OLED Display,
- einen Umweltsensor BME680*, sowie
- einige Breadboardkabel*,
- zwei 400 Pin Breadboards*
Zusätzlich verwende ich für den Sensor noch eine externe Spannungsversorgung über ein Power Supply Modul* für das Breadboard. An diesen kann man entweder eine Powerbank via USB oder eine 9V Batterie via Jack Adapter anschließen.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau der Schaltung – Sensor BME680 am ESP8266 von Ideaspark
Da der Ideaspark wie bereits erwähnt über ein eigenes OLED Display verfügt, brauchen wir dieses nicht separat anschließen bzw. verkabeln. In der Schaltung zeige ich dir jedoch, wie ein solches an den ESP8266 angeschlossen wird.
Komponente | ESP8266 | Farbe |
---|---|---|
Umweltsensor BME680 | ||
VCC | 5V | rot |
GND | GND | schwarz |
SCL | D1 | grau |
SDA | D7 | violett |
SDO | D2 | braun |
CS | D8 | blau |
OLED Display | ||
SCL | D5 | gelb |
SDA | D6 | grün |
VCC | 5V | rot |
GND | GND | schwarz |
Programmieren in der Arduino IDE
Die Programmierung erfolgt in diesem Projekt in der Arduino IDE. Diese Entwicklungsumgebung kannst du dir unter https://www.arduino.cc/en/software für macOS, Windows & Linux herunterladen. Ich empfehle dir hier die neue Version 2.x.
Schritt 1 – Installieren der Bibliotheken für das Projekt
Bevor wir jedoch beginnen können, müssen wir zwei Bibliotheken installieren.
Für den Umweltsensor BME680 verwende ich die Adafruit BME680 Bibliothek, welche du sehr einfach über den internen Bibliotheksverwalter der Arduino IDE installieren kannst. Dazu musst du nur nach “adafruit bme680” suchen und die Schaltfläche “INSTALLIEREN” klicken.
Die gewählte Bibliothek hat jedoch einige Abhängigkeiten, welche wir zusätzlich installieren müssen. Dieses wird uns angezeigt und hier klicken wir auf “ALLE INSTALLIEREN”.
Für das OLED Display gibt es diverse andere Bibliotheken auch von Adafruit, jedoch habe ich mit der U8G2 Library sehr gute Erfahrungen gesammelt, da diese nicht nur leichtgewichtig ist, sondern auch noch wenig Code benötigt, um Daten anzuzeigen.
Zunächst suchen wir nach u8g2 und klicken dort ebenso auf die Schaltfläche “INSTALLIEREN”.
In meinem Fall ist diese bereits in der Version 2.34.22 installiert.
Schritt 2 – auslesen der Sensorwerte vom Umweltsensor BME680 am Ideaspark ESP8266
Im ersten Schritt zur Programmierung wollen wir zunächst die Sensorwerte auslesen und auf der seriellen Schnittstelle anzeigen.
Dazu können wir das Beispiel unter “Datei\Beispiele\Adafruit BME680 Library\bme680test.ino” verwenden.
//Bibliotheken für den BME680 Sensor #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" /** Konfiguration des Sensors am ESP8266 Da der verwendete ESP8266 von Ideaspark bereits über ein I2C OLED Display verfügt welches über D5 & D6 angeschlossen ist, müssen wir andere Pins für die SPI Kommunikation verwenden! **/ #define BME_SCK D1 #define BME_MISO D2 #define BME_MOSI D7 #define BME_CS D8 #define SEALEVELPRESSURE_HPA (1013.25) //erzeugen eines Objektes vom Typ Adafruit_BME680 mit der SPI Konfiguration Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); void setup() { //starten der seriellen Kommunikation mit 9600 Baud. Serial.begin(9600); while (!Serial){ //Warten bis die serielle Schnittstelle bereit steht. } //starten der Kommunikation mit dem Sensor. //Wenn dieses nicht funktioniert, soll eine Fehlermeldung ausgegeben //und eine Endlosschleife gestartet werden. if (!bme.begin()) { Serial.println("Es konnte kein Sensor vom Typ BME680 gefunden werden!"); Serial.println("Prüfen Sie die Verkabelung / Konfiguration!"); while (1) ; } //Setup der Sensordaten (wurde vom Beispiel belassen) bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms } void loop() { //anfordern der aktuellen Sensordaten if (!bme.performReading()) { Serial.println("Fehler beim lesen der Sensordaten!"); return; } //Funktion String(sensorwert, 2) kürzt den Wert auf zwei Stellen nach dem Komma. //auslesen der Temperatur String temp = "Temperatur: "; temp = temp + String(bme.temperature, 2); temp = temp + " *C"; //auslesen des Luftdrucks String luftdruck = "Luftdruck: "; luftdruck = luftdruck + String(bme.pressure / 100.0, 2); luftdruck = luftdruck + " hPa"; //auslesen der rel. Luftfeuchtigkeit String relLuftfeuchtigkeit = "rel. Luftfeuchtigkeit: "; relLuftfeuchtigkeit = relLuftfeuchtigkeit + String(bme.humidity, 2); relLuftfeuchtigkeit = relLuftfeuchtigkeit + "%"; //auslesen der ungefähren Höhe String hoehe = "ungef. Höhe: "; hoehe = hoehe + String(bme.readAltitude(SEALEVELPRESSURE_HPA), 2); hoehe = hoehe + " m"; //berechnen der Luftqualität String luftqualitaet = "Luftqualität: "; luftqualitaet = luftqualitaet + String(bme.gas_resistance / 1000.0,2); luftqualitaet = luftqualitaet + " kOhm"; //ein Trenner Serial.println("**************************"); //Ausgeben der ermittelten Daten auf der seriellen Schnittstelle Serial.println(temp); Serial.println(luftdruck); Serial.println(relLuftfeuchtigkeit); Serial.println(hoehe); Serial.println(luftqualitaet); //eine kleine Pause von 2 Sekunden delay(2000); }
Dieser Code erzeugt die Ausgabe der Sensordaten auf der seriellen Schnittstelle.
Wichtiger Hinweis: vor dem Upload externe Spannungsversorgung trennen!
Damit ich den Code erfolgreich hochladen konnte, musste ich die externe Spannungsversorgung trennen. Da ich ein kleines Power-Modul für das Breadboard verwende, ist dort ein Schalter drauf, welchen ich dazu einfach betätigen musste.
Nach dem erfolgreichen Upload erhalte ich zunächst eine Fehlermeldung vom Mikrocontroller, diese wird aber mit Betätigen des Schalters und damit die Spannungsversorgung zum Sensor wieder nichtig.
Es konnte kein Sensor vom Typ BME680 gefunden werden!
Prüfen Sie die Verkabelung / Konfiguration!
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
Soft WDT reset
Exception (4):
epc1=0x402027ac epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>>>stack>>>
ctx: cont
sp: 3ffffe50 end: 3fffffd0 offset: 0160
3fffffb0: feefeffe 00000000 3ffee91c 40204e18
3fffffc0: feefeffe feefeffe 3fffdab0 40101001
<<<stack<<<
Schritt 3 – Anzeigen der Sensordaten auf dem OLED Display
Im letzten Schritt wollen wir nun die Sensordaten auf dem OLED Display anzeigen. Wie du das OLED Display des ESP8266 von Ideaspark programmierst, habe ich dir ja bereits im oben verlinkten Beitrag ausführlich gezeigt. Hier möchte ich jetzt daran anknüpfen und den kleinen Code in den bestehenden einfügen.
//Bibliotheken für den BME680 Sensor #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" //Bibliothek für das OLED Display #include <U8g2lib.h> #include <Wire.h> //das OLED Display ist über I2C angeschlossen #define SDA_PIN 12 //GPIO12 / 6 #define SCL_PIN 14 //GPIO14 / 5 /** Konfiguration des Sensors am ESP8266 Da der verwendete ESP8266 von Ideaspark bereits über ein I2C OLED Display verfügt welches über D5 & D6 angeschlossen ist, müssen wir andere Pins für die SPI Kommunikation verwenden! **/ #define BME_SCK D1 #define BME_MISO D2 #define BME_MOSI D7 #define BME_CS D8 #define SEALEVELPRESSURE_HPA (1013.25) //erzeugen eines Objektes vom Typ Adafruit_BME680 mit der SPI Konfiguration Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); //erzeugen einer instanz von U8G2_SSD1306_128X64_NONAME_F_SW_I2C mit der Konfiguration U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL_PIN, SDA_PIN, U8X8_PIN_NONE); void setup() { //starten der seriellen Kommunikation mit 9600 Baud. Serial.begin(9600); while (!Serial) { //Warten bis die serielle Schnittstelle bereit steht. } //starten der Kommunikation mit dem Sensor. //Wenn dieses nicht funktioniert, soll eine Fehlermeldung ausgegeben //und eine Endlosschleife gestartet werden. if (!bme.begin()) { Serial.println("Es konnte kein Sensor vom Typ BME680 gefunden werden!"); Serial.println("Prüfen Sie die Verkabelung / Konfiguration!"); while (1) ; } //Setup der Sensordaten (wurde vom Beispiel belassen) bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms //beginn der Kommunikation mit dem Display u8g2.begin(); u8g2.clearBuffer(); //setzen der Schriftgröße auf 8 Punkte u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0, 26, "BME680 Sensordaten"); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0, 47, "https://draeger-it.blog"); u8g2.sendBuffer(); delay(1500); } void displayText(String textLine1, String textLine2) { u8g2.clearBuffer(); //setzen der Schriftgröße auf 10 Punkte u8g2.setFont(u8g2_font_ncenB10_tr); u8g2.setCursor(10, 12); u8g2.print(textLine1); //setzen der Schriftgröße auf 14 Punkte u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.setCursor(10, 40); u8g2.print(textLine2); u8g2.sendBuffer(); delay(2500); } void loop() { //anfordern der aktuellen Sensordaten if (!bme.performReading()) { Serial.println("Fehler beim lesen der Sensordaten!"); return; } //Funktion String(sensorwert, 2) kürzt den Wert auf zwei Stellen nach dem Komma. String tempValue = String(bme.temperature, 2); String lftdrkValue = String(bme.pressure / 100.0, 2); String relLuftfeuchtigkeitValue = String(bme.humidity, 2); String hoeheValue = String(bme.readAltitude(SEALEVELPRESSURE_HPA), 2); String luftqualitaetValue = String(bme.gas_resistance / 1000.0, 2); //auslesen der Temperatur String temp = "Temperatur: " + tempValue + " *C"; //auslesen des Luftdrucks String luftdruck = "Luftdruck: " + lftdrkValue + " hPa"; //auslesen der rel. Luftfeuchtigkeit String relLuftfeuchtigkeit = "rel. Luftfeuchtigkeit: " + relLuftfeuchtigkeitValue + "%"; //auslesen der ungefähren Höhe String hoehe = "ungef. Hoehe: " + hoeheValue + " m"; //berechnen der Luftqualität String luftqualitaet = "Luftqualitaet: " + luftqualitaetValue + " kOhm"; //ein Trenner Serial.println("**************************"); //Ausgeben der ermittelten Daten auf der seriellen Schnittstelle Serial.println(temp); Serial.println(luftdruck); Serial.println(relLuftfeuchtigkeit); Serial.println(hoehe); Serial.println(luftqualitaet); //Ausgeben der Sensordaten auf dem OLED Display displayText("Temperatur:", tempValue + " *C"); displayText("Luftdruck:", lftdrkValue + " hPa"); displayText("rel. Feuchte:", relLuftfeuchtigkeitValue+ " %"); displayText("Hoehe:", hoeheValue + " m"); displayText("Luftqualitaet:", luftqualitaetValue + " kOhm"); //eine kleine Pause von 2 Sekunden delay(2000); }
Im nachfolgenden Video erkennst du das die Sensordaten nacheinander auf dem Display angezeigt werden. Wenn dir die Pause zwischen den Werten zu kurz ist, dann kannst du dieses in der Funktion “displayText” anpassen.
Hier, das gesamte Projekt zum Download als ZIP-Datei.
Klasse Beitrag, besten Dank Stefan!
Meine Frage wäre jetzt wie diese Daten auf eine SD-Speicherkarte in einer CSV-Datei abgespeichert werden könnten, zwecks visuelle Betrachtung (z.B. in Excel etc.), hier wäre ein Beispiel echt klasse 😉