Raspberry Pi BME280 Luftdruck Sensor
Um an den Raspberry Pi einen Luftdruck Sensor anzuschließen habe ich mich für den Sensor BME280 entschieden und diesen auch gleich fertig als Platine gekauft. Der Sensor liefert neben dem Luftdruck ebenfalls die Temperatur und Luftfeuchtigkeit. Jumper Kabel habe ich hier 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:
- GY-BME280 Barometrischer Sensor für Luftdruckmessung
- AZDelivery Jumper Wire Kabel 3 x 40 STK. je 20 cm M2M/ F2M / F2F für Arduino und Raspberry Pi Breadboard inklusive E-Book!
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 AZDelivery BME280 hat 4 Anschlüsse VIN
GND
SCL
SDA
, wir schließen nun folgendes zusammen:
Raspberry Pi GPIO Pin | BME280 Pin |
---|---|
1 (3v3 power) | VIN
|
6 (Ground) | GND
|
5 (GPIO3 / SCL) | SCL
|
3 (GPIO2 / SDA) | SDA
|
Es kann hier gerne was den 3v3
und den GND
Anschluss angeht variert 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 (76
):
0 1 2 3 4 5 6 7 8 9 a b c d e f00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
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-bme280
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/bme280.py
/usr/local/sbin/bme280.py
#!/usr/bin/python3
import board
import busio
from adafruit_bme280 import basic as adafruit_bme280
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x76)
# change this to match the location's pressure (hPa) at sea level
# need to be configured for the real altitude. Check your next Weatherstation for the pressure
#bme280.sea_level_pressure = 1013.25
bme280.mode = adafruit_bme280.MODE_NORMAL
time.sleep(1)
print("Temperature: %0.1f C" % bme280.temperature)
print("Humidity: %0.1f %%" % bme280.humidity)
print("relative Humidity: %0.1f %%" % bme280.relative_humidity)
print("absolute Pressure: %0.1f hPa" % bme280.pressure)
print("Altitude = %0.2f meters" % bme280.altitude)
dann noch dem Script das Execute Recht geben:
chmod +x /usr/local/sbin/bme280.py
und einfach starten:
bme280.py
der Output sollte dann so aussehen:
Temperature: 21.7 C Humidity: 47.1 % relative Humidity: 47.1 % absolute Pressure: 969.7 hPa Altitude = 368.94 meters
Senden der Daten an MQTT Broker
Möchte man die Daten des BME280 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/bme280-mqtt.py
/usr/local/sbin/bme280-mqtt.py
#!/usr/bin/python3
import board
import busio
from adafruit_bme280 import basic as adafruit_bme280
import paho.mqtt.client as mqtt
import ssl
# set the variables
broker='FQDN / IP ADDRESS'
port=8883
publish_topic="house/pi-bme280"
clientid='python-mqtt-bme280'
username='mosquitto'
password='password'
insecure=True
qos=1
retain_message=True
# do the stuff
# define BME280 Sensor
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x76)
# change this to match the location's pressure (hPa) at sea level
# needs to be set for the right altitude
#bme280.sea_level_pressure = 1010
bme280.mode = adafruit_bme280.MODE_NORMAL
time.sleep(1)
#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(bme280.temperature),qos,retain_message)
client.publish("{}/humidity".format(publish_topic),"{:.2f}".format(bme280.humidity),qos,retain_message)
client.publish("{}/rel_humidity".format(publish_topic),"{:.2f}".format(bme280.relative_humidity),qos,retain_message)
client.publish("{}/pressure".format(publish_topic),"{:.2f}".format(bme280.pressure),qos,retain_message)
client.publish("{}/altitude".format(publish_topic),"{:.2f}".format(bme280.altitude),qos,retain_message)
client.disconnect()
client.loop_stop()
dann noch dem Script das Execute Recht geben:
chmod +x /usr/local/sbin/bme280-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 BME280 Sensor to MQTT Broker * * * * * root /usr/local/sbin/bme280-mqtt.py >/dev/null 2>&1
Git Repository
Alle Skripte die zu den Raspberry Pi Sensoren gehören findet ihr in diesem Repository: