Raspberry Pi BME680 Gas Sensor
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:
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 f00: -- -- -- -- -- -- -- -- -- -- -- -- -- 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: