Ideaspark Mikrocontroller: Schritt-für-Schritt-Anleitung zur Anbindung des BME680 über SPI
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.
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
KomponenteESP8266FarbeUmweltsensor BME680VCC5VrotGNDGNDschwarzSCLD1grauSDAD7violettSDOD2braunCSD8blauOLED DisplaySCLD5gelbSDAD6grünVCC5VrotGNDGNDschwarz
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 "DateiBeispieleAdafruit BME680 Librarybme680test.ino" verwenden.
//Bibliotheken für den BME680 Sensor
#include
#include
#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
Read the full article