Seite 1 von 1

BME280 am Raspberry5, auslesen mit Python3-Script

Verfasst: Sonntag 8. September 2024, 19:52
von __MiB__
Hallo,

Ich bin neu hier und möchte mich in Python einarbeiten, indem ich eine Wetterstation baue. Einsteigen möchte ich mit dem BME280 und einem kleinen OLED-Display0.96, das ich sogar schon testweise mit einem Python-Script zum Laufen gebracht habe.
Mit der Hardware (sprich Elektronik/Messtechnik) kenne ich mich aus, beschäftige ich mich doch seit meiner Kindheit damit, incl. dem Routen und Anfertigen von Platinen sowie Schaltungsentwicklung. Nur mit dem Programmieren hapert es, wobei ich schon beim Thema bin.

Um den BME280 zu testen, habe ich aus dem Fundus des www ein Script heruntergeladen, es in Thonny kopiert und gestartet.
Die Python3-Umgebung habe ich vorher schon (hoffentlich) vollständig eingerichtet.

Hier das Test-Script:

Code: Alles auswählen

import time
import smbus2
import bme280

# BME280 sensor address (default address)
address = 0x77

# Initialize I2C bus
bus = smbus2.SMBus(1)

# Load calibration parameters
calibration_params = bme280.load_calibration_params(bus, address)

# def celsius_to_fahrenheit(celsius):
#     return (celsius * 9/5) + 32

while True:
    try:
        # Read sensor data
        data = bme280.sample(bus, address, calibration_params)

        # Extract temperature, pressure, and humidity
        temperature_celsius = data.temperature
        pressure = data.pressure
        humidity = data.humidity

        # Print the readings
        print("Temperature: {:.2f} °C".format(temperature_celsius))
        print("Pressure: {:.2f} hPa".format(pressure))
        print("Humidity: {:.2f} %".format(humidity))

        # Wait for a few seconds before the next reading
        time.sleep(2)

    except KeyboardInterrupt:
        print('Program stopped')
        break
    except Exception as e:
        print('An unexpected error occurred:', str(e))
        break
Die Ausgabe in der Shell lautet:

Code: Alles auswählen

>>> %Run BME280_2.py
Traceback (most recent call last):
  File "/home/mib/Python3/BME280_2.py", line 12, in <module>
    calibration_params = bme280.load_calibration_params(bus, address)
AttributeError: module 'bme280' has no attribute 'load_calibration_params'
>>> 
Was mir Probleme dabei macht, ist folgendes:
Woher kommt dieses 'load_calibration_params' in 'bme280.load_calibration_params(bus, address)'?

Ist das irgendwo definiert oder hat sich der Ersteller des Scripts das ausgedacht und mal einfach so genannt? Zumindest beim Autor des Scrips muss es doch funktioniert haben.

Finden kann ich es jedenfalls nirgends außer in diesem Python-Script.
Vielleicht kann mir hier jemand erklären, wie solche Ausdrücke zustande kommen, denn es gibt scheinbar in Python noch mehr solcher Konstrukte.

Ich freue mich auf neue Erkenntnisse.

Vielen Dank im Voraus für die Infos :)

Re: BME280 am Raspberry5, auslesen mit Python3-Script

Verfasst: Dienstag 10. September 2024, 14:06
von Sirius3
Es scheint wohl verschiedene bme280-Pakete zu geben, und Du hast das falsche installiert.
Eine kurze Internetrecherche ergab, dass das wohl das richtige ist: https://pypi.org/project/RPi.bme280/

Die Fehlerbehandlung ist ungünstig. Eine sprechende Fehlermeldung durch einen gekürzten Text zu ersetzen erschwert nur die Fehlersuche.
Konstanten schreibt man nach Konvention komplett gross. In neuen Programmen benutzt man f-Strings statt format.

Code: Alles auswählen

import time
import smbus2
import bme280

# BME280 sensor address (default address)
ADDRESS = 0x77

def main():
    bus = smbus2.SMBus(1)
    calibration_params = bme280.load_calibration_params(bus, ADDRESS)

    try:
        while True:
            # Read sensor data
            data = bme280.sample(bus, ADDRESS, calibration_params)

            print(f"Temperature: {data.temperature:.2f} °C")
            print(f"Pressure: {data.pressure:.2f} hPa")
            print(f"Humidity: {data.humidity:.2f} %")

            # Wait for a few seconds before the next reading
            time.sleep(2)
    except KeyboardInterrupt:
        print('Program stopped')

if __name__ == "__main__":
    main()

Re: BME280 am Raspberry5, auslesen mit Python3-Script

Verfasst: Dienstag 10. September 2024, 17:13
von Dennis89
Hallo,
__MiB__ hat geschrieben: Sonntag 8. September 2024, 19:52 Woher kommt dieses 'load_calibration_params' in 'bme280.load_calibration_params(bus, address)'?
Ist das irgendwo definiert oder hat sich der Ersteller des Scripts das ausgedacht und mal einfach so genannt? Zumindest beim Autor des Scrips muss es doch funktioniert haben.
Diese Funktion hat sich derjenige ausgedacht, der die Bibliothek geschrieben hat, die der Code benutzt, den du gefunden hast. Wenn man wissen will, was die Funktion macht, dann kann man sich in diesem Fall bei Github hier der Code ansehen.

Was du mit "mehr solcher Konstrukte" meinst, müsstest du vielleicht an einem Beispiel zeigen.

Grüße
Dennis

Re: BME280 am Raspberry5, auslesen mit Python3-Script

Verfasst: Dienstag 10. September 2024, 18:16
von __MiB__
Sirius3 hat geschrieben: Dienstag 10. September 2024, 14:06 Es scheint wohl verschiedene bme280-Pakete zu geben, und Du hast das falsche installiert.
Eine kurze Internetrecherche ergab, dass das wohl das richtige ist: https://pypi.org/project/RPi.bme280/
Vielen Dank für diese Info, die Installation des RPi.bme280-Pakets hat tatsächlich funktioniert!

Woher soll man wissen, dass es verschiedene gibt, bzw welches das richtige ist...
Da ist man wirklich auf das Wissen der Community angewiesen!

Vielen Dank nochmals!

Re: BME280 am Raspberry5, auslesen mit Python3-Script

Verfasst: Dienstag 10. September 2024, 18:42
von noisefloor
Hallo,
Woher soll man wissen, dass es verschiedene gibt, bzw welches das richtige ist...
Das sollte hoffentlich auf der Seite stehen, von der du den Code hast - weil ohne die Info der Code ggf. ja nicht läuft, wie du festgestellt hast.

Vielen Module (aber nicht alle) sind beim Python Package Index auf www.pypi.org gelistet. Wenn man da nach bme280 sucht, bekommt man wirklich viele Suchtreffer.

Gruß, noisefloor