Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Ideaspark Mikrocontroller: Schritt-für-Schritt-Anleitung zur Anbindung des BME680 über SPI

Posted on 12. Februar 202410. März 2024 by Stefan Draeger

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 1 – Installieren der Bibliotheken für das Projekt
  • Schritt 2 – auslesen der Sensorwerte vom Umweltsensor BME680 am Ideaspark ESP8266
    • Wichtiger Hinweis: vor dem Upload externe Spannungsversorgung trennen!
  • 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.

Schaltung - Umweltsensor BME680 & OLED Display am ESP8266
Schaltung – Umweltsensor BME680 & OLED Display am ESP8266
KomponenteESP8266Farbe
Umweltsensor BME680
VCC5Vrot
GNDGNDschwarz
SCLD1grau
SDAD7violett
SDOD2braun
CSD8blau
OLED Display
SCLD5gelb
SDAD6grün
VCC5Vrot
GNDGNDschwarz

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.

Programm – Umweltsensor BME680 & ESP8266 von Ideaspark, serielle AusgabeHerunterladen

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.

Programm – Anzeigen der Umweltdaten vom Sensor BME680 auf dem OLED Display des ESP8266 von IdeasparkHerunterladen

1 thought on “Ideaspark Mikrocontroller: Schritt-für-Schritt-Anleitung zur Anbindung des BME680 über SPI”

  1. Michael sagt:
    13. Februar 2024 um 12:51 Uhr

    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 😉

    Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}