Raspberry Pi BME280 Luftdruck Sensor

Aus Laub-Home.de Wiki
Zur Navigation springen Zur Suche springen

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:

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:

GPIO-Pinout-Diagram-2.png

Unser AZDelivery BME280 hat 4 Anschlüsse VIN GND SCL SDA, wir schließen nun folgendes zusammen:

Verkabelung
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  f

00: -- -- -- -- -- -- -- -- -- -- -- -- -- 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:

/usr/local/sbin/bme280.py

#!/usr/bin/python3
import board
import busio
import 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.

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

#!/usr/bin/python3

import board
import busio
import 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

Quellen