Raspberry Pi BH1750 Helligkeitssensor

Aus Laub-Home Wiki

Um an den Raspberry Pi einen Helligkeitssensor anzuschließen habe ich mich für den Sensor BH1750 (GY-302) entschieden und diesen auch gleich fertig als Platine gekauft. 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 zu den Jumperkabeln zwar bei liegt, es aber nicht an die Platine gelötet ist. Die Sensoren kommen direkt im dreier Pack. Auch die Jumper Kabel sind für weitere Einsatzzwecke nutzbar.

Hier die Links zu den Produkten:


Anschluß des Sensors am GPIO

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

Auf der Konsole könnt ihr es so auslesen:

Unser AZDelivery GY-302 Platine (BH1750) hat fünf Anschlüsse VCC GND SCL SDA ADDR, wir schließen nun folgendes zusammen:

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

Es kann hier gerne was den 3v3 und den Ground Anschluss angeht variert werden. Es darf nur kein 5v power sein!

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

raspi-config nonint do_i2c 0

und installieren unsere Software Pakete für das i2c Interface:

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 (23):

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

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

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

Auslesen der Daten des Sensors

Um die Daten nun auszulesen und korrekt im lux Format anzuzeigen kann folgendes Python Script verwendet werden:

/usr/local/sbin/bh1750-smbus.py

#!/usr/bin/python3
import smbus
import time

DEVICE     = 0x23
POWER_DOWN = 0x00
POWER_ON   = 0x01
RESET      = 0x07
bus = smbus.SMBus(1)

def convertToNumber(data):
  result=(data[1] + (256 * data[0])) / 1.2
  return (result)

def readLight(addr=DEVICE):
  data = bus.read_i2c_block_data(addr,0x20)
  return convertToNumber(data)

def main():
  lightLevel=readLight()
  print (format(lightLevel,'.2f') + " lux")

if __name__=="__main__":
   main()

gibt man diesem das execute Recht:

chmod +x /usr/local/sbin/bh1750-smbus.py

Und führt das Script aus:

bh1750-smbus.py

Sollte man folgende Ausgabe sehen:

91.67 lux

Auslesen der Daten des Sensors mittels Adafruit Bibliothek

Als erstes installieren wir mit pip die adafruit-circuitpython-bh1750 Bibliothek nach:

apt install python3-pip
pip3 install --user adafruit-circuitpython-bh1750

nun erstellen wir einfach ein kleines Skript:

/usr/local/sbin/bh1750.py

#!/usr/bin/python3
import board
import adafruit_bh1750
 
i2c = board.I2C()
sensor = adafruit_bh1750.BH1750(i2c)

print("%.2f Lux" % sensor.lux)

dann noch das execute Recht:

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

Und das Script ausführen:

bh1750.py

Sollte man folgende Ausgabe sehen:

91.67 Lux

Senden der Daten an MQTT Broker

Möchte man die Daten des BH1750 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 paho-mqtt

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

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

#!/usr/bin/python3

# Import required Python libraries
import paho.mqtt.client as mqtt
import board
import adafruit_bh1750
import time
import ssl

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

# do the stuff
# define BH1750
i2c = board.I2C()
lightsensor = adafruit_bh1750.BH1750(i2c)

#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("{}/lux".format(publish_topic),"{:.2f}".format(lightsensor.lux),qos,retain_message)

client.disconnect()
client.loop_stop()

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 BH1750 Sensor to MQTT Broker
* * * * * root /usr/local/sbin/bh1750-mqtt.py >/dev/null 2>&1

Git Repository

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

Quellen