Raspberry Pi BMP280 Luftdruck Sensor

Aus Laub-Home Wiki
BMP280 Sensor
BMP280 Sensor

Um an den Raspberry Pi einen Luftdruck Sensor anzuschließen habe ich mich für den Sensor BMP280 entschieden (ist der Nachfolger vom BMP180) und diesen auch gleich fertig als Platine gekauft. Der Sensor liefert neben dem Luftdruck ebenfalls die Temperatur. 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:

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

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

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-bmp280

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/bmp280.py

/usr/local/sbin/bmp280.py

#!/usr/bin/python3

import board
import busio
import adafruit_bmp280

i2c = busio.I2C(board.SCL, board.SDA)
bmp280 = adafruit_bmp280.Adafruit_BMP280_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
#bmp280.sea_level_pressure = 1013.25

print("Temperature: %0.1f C" % bmp280.temperature)
print("Pressure: %0.1f hPa" % bmp280.pressure)
print("Altitude = %0.2f meters" % bmp280.altitude)

dann noch dem Script das Execute Recht geben:

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

und einfach starten:

bmp280.py

der Output sollte dann so aussehen:

Temperature: 24.8 C
Pressure: 999.7 hPa
Altitude = 113.59 meters

Senden der Daten an MQTT Broker

Möchte man die Daten des BMP280 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/bmp280-mqtt.py

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

#!/usr/bin/python3

import board
import busio
import adafruit_bmp280
import paho.mqtt.client as mqtt
import ssl

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

# do the stuff
# define BMP280 Sensor
i2c = busio.I2C(board.SCL, board.SDA)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address=0x76)

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

#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(bmp280.temperature),qos,retain_message)
client.publish("{}/pressure".format(publish_topic),"{:.2f}".format(bmp280.pressure),qos,retain_message)
client.publish("{}/altitude".format(publish_topic),"{:.2f}".format(bmp280.altitude),qos,retain_message)

client.disconnect()
client.loop_stop()

dann noch dem Script das Execute Recht geben:

chmod +x /usr/local/sbin/bmp280-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 BMP280 Sensor to MQTT Broker
* * * * * root /usr/local/sbin/bmp280-mqtt.py >/dev/null 2>&1

Git Repository

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