BME280 am Raspberry5, auslesen mit Python3-Script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
__MiB__
User
Beiträge: 7
Registriert: Sonntag 8. September 2024, 19:07

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 :)
Sirius3
User
Beiträge: 18251
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
__MiB__
User
Beiträge: 7
Registriert: Sonntag 8. September 2024, 19:07

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!
Benutzeravatar
noisefloor
User
Beiträge: 4173
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten