Raspberry Pi BME680 Gas Sensor

Aus Laub-Home Wiki

Der BME680 Sensor von Bosch ist ideal, wenn man das Raumklima überwachen oder eine Wetterstation für draußen bauen möchte. Er bietet neben Temperatur und Luftfeuchtigkeit auch die Möglichkeit Luftdruck und die Gaswerte in der Luft zu messen. Zusätzlich kann man noch die Standort Höhe auslesen, aber nur wenn man vorher den aktuellen SeaLevel Luftdruck übergibt. Den Sensor kann man wunderbar an einen Raspberry Pi an den I2C Bus anschließen und mit einem Python Script die Werte auslesen und diese dann in die SmartHome Zentrale einbinden.

Jumper Kabel habe ich hierzu noch zusätzlich bestellt da im Paket keine enthalten waren. Ebenfalls muss man leider löten können, da das Gegenstück (Pinleiste) zu den Jumperkabeln zwar bei liegt, es aber nicht an die Platine gelötet ist.

Achtung: Der Sensor zeigt den absoluten Luftdruck an, nicht den umgerechneten Luftdruck auf Normal Null (Meereshöhe), den man im Wetterbericht sieht. Deshalb ist der Sensorwert niedriger. Mehr Infos sind hier nachzulesen:

Hier die Links zu den Produkten:

Einen Vergleich verschiedener Temperatur Sensoren findet ihr hier:

Anschluss des Sensors am GPIO

hier die Belegung des GPIO Boards direkt von https://www.raspberrypi.org/documentation/usage/gpio/

Ihr bekommt die aktuelle Pin Belegung eines jeden Raspberry Pi mit dem Tool pinout:

Unser BME680 hat 6 Anschlüsse VCC GND SCL SDA SDO CS, wir schließen nun folgendes zusammen:

Verkabelung
Raspberry Pi GPIO Pin BME680 Pin
1 (3v3 power) VCC
6 (Ground) GND
5 (GPIO3 / SCL) SCL
3 (GPIO2 / SDA) SDA

SDO CS brauchen wir nicht. Was den 3v3 und den GND Anschluss angeht kann variiert werden.

Aktivierung des i2c Interface

Um den Sensor zu verwenden müssen wir als erstes das i2c Interface Aktivieren, dies geht ganz simple mittels raspi-config und installieren danach unsere Software Pakete für das i2c Interface:

raspi-config nonint do_i2c 0
apt install -y python3-smbus i2c-tools

nun können wir testen ob alles OK ist und der Sensor erreichbar ist:

lsmod | grep i2c_

sollte nun die geladeneren Module ausspucken:

i2c_bcm2835            16384  0
i2c_dev                20480  0

und i2cdetect -y 1 den Sensor anzeigen (77):

    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77

nachdem der Sensor nun korrekt angeschlossen und die Module geladen sind, kommen wir dazu den Wert des Sensors auszulesen.

Auslesen der Daten des Sensors

Zuerst installieren wir die benötigte Adafruit Library:

apt install python3-pip -y
pip3 install --user adafruit-circuitpython-bme680

dann können wir mittels dem folgenden Skript die Werte des Sensors auslesen:

Download hier möglich: https://github.com/alaub81/rpi_sensor_scripts/raw/main/bme680.py

/usr/local/sbin/bme680.py

#!/usr/bin/python3
import board
from busio import I2C
import adafruit_bme680

# Create library object using our Bus I2C port
i2c = I2C(board.SCL, board.SDA)
bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug=False)

# change this to match the location's pressure (hPa) at sea level
#bme680.sea_level_pressure = 1013.25

# You will usually have to add an offset to account for the temperature of
# the sensor. This is usually around 5 degrees but varies by use. Use a
# separate temperature sensor to calibrate this one.
#temperature_offset = -5
temperature_offset = 0

print("Temperature: %0.1f C" % (bme680.temperature + temperature_offset))
print("Gas: %d ohm" % bme680.gas)
print("Humidity: %0.1f %%" % bme680.relative_humidity)
print("Pressure: %0.3f hPa" % bme680.pressure)
print("Altitude = %0.2f meters" % bme680.altitude)

dann noch dem Script das Execute Recht geben:

chmod +x /usr/local/sbin/bme680.py

und einfach starten:

bme680.py

der Output sollte dann so aussehen:

Temperature: 23.0 C
Gas: 1912 ohm
Humidity: 44.8 %
Pressure: 989.394 hPa
Altitude = 89.86 meters

Senden der Daten an MQTT Broker

Möchte man die Daten des BME680 Sensors an einen MQTT Broker senden um sie dann zum Beispiel mit openHAB auszulesen, kann man dies mit einem Python Script machen Dafür muss man zu allererst noch die paho-mqtt library nach installieren:

apt install -y python3-paho-mqtt

# oder via pip3
pip3 install --user paho-mqtt

Das folgende Script liest dann die Sensor Daten aus und sendet sie einmalig an den MQTT Broker.

Download hier möglich: https://github.com/alaub81/rpi_sensor_scripts/raw/main/bme680-mqtt.py

/usr/local/sbin/bme680-mqtt.py

#!/usr/bin/python3
import board
import busio
import adafruit_bme680
import paho.mqtt.client as mqtt
import ssl

# set the variables
broker='FQDN / IP ADDRESS'
port=8883
publish_topic="house/pi-bme680"
clientid='python-mqtt-bme680'
username='mosquitto'
password='password'
insecure=True
qos=1
retain_message=True

# define BME280 Sensor
# Create library object using our Bus I2C port
i2c = I2C(board.SCL, board.SDA)
bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c, debug=False)

# change this to match the location's pressure (hPa) at sea level
bme680.sea_level_pressure = 1000

# You will usually have to add an offset to account for the temperature of
# the sensor. This is usually around 5 degrees but varies by use. Use a
# separate temperature sensor to calibrate this one.
#temperature_offset = -5
temperature_offset = 0

#MQTT Connection
client=mqtt.Client(clientid)
client.username_pw_set(username, password)
client.tls_set(cert_reqs=ssl.CERT_NONE) #no client certificate needed
client.tls_insecure_set(insecure)
client.connect(broker, port)
client.loop_start()

client.publish("{}/temperature".format(publish_topic),"{:.2f}".format((bme680.temperature + temperature_offset)),qos,retain_message)
client.publish("{}/humidity".format(publish_topic),"{:.2f}".format(bme680.humidity),qos,retain_message)
client.publish("{}/rel_humidity".format(publish_topic),"{:.2f}".format(bme680.relative_humidity),qos,retain_message)
client.publish("{}/pressure".format(publish_topic),"{:.2f}".format(bme680.pressure),qos,retain_message)
client.publish("{}/altitude".format(publish_topic),"{:.2f}".format(bme680.altitude),qos,retain_message)
client.publish("{}/gas".format(publish_topic),"{:.2f}".format(bme680.gas),qos,retain_message)

client.disconnect()
client.loop_stop()

dann noch dem Script das Execute Recht geben:

chmod +x /usr/local/sbin/bme680-mqtt.py

Möchte man das Ganze zum Beispiel alle Minute haben, kann man das Script einfach als cronjob laufen lassen. /etc/cron.d/mqtt

# sends data from BME680 Sensor to MQTT Broker
* * * * * root /usr/local/sbin/bme680-mqtt.py >/dev/null 2>&1

BME680 mit BSEC Library

Bosch hat eine eigene Library entwickelt mit der man das Maximum aus dem BME680 holen kann. Wenn ihr mehr darüber wissen wollt, schaut hier vorbei:

Git Repository

Alle Skripte die zu den Raspberry Pi Sensoren gehören findet ihr in diesem Repository: