Luftdruck messen mit dem Raspberry Pi 4

  • Hallo zusammen,

    wie in meine Thread Temperaur Dashboard aus Technoline LaCrosse 868 MHz Sensorwerten beschrieben, habe ich mir mit Technoline Temperatur- und Luftfeuchtigkeitssensoren ein kleines Dashboard für meine Wohnung und deren Umgebung gebaut (siehe #25).

    Nun würde ich die Sache gern noch um einen Luftdruck-Wert ergänzen. Da der Druck überall gleich ist, dachte ich mir, dass es reicht, wenn ich einen kleinen Drucksensor BPM280 direkt im Gehäuse des Raspberry Pi anschließe. Anleitungen, wie man dessen Werte ausliest, findet man im Netz, z.B. hier.

    Alternativ gibt es aber auch einen „Umweltsensor“ BPM680, der zusätzlich noch die Luftgüte (also den CO2-Gehalt). Ist so ein Sensor im Gehäuse des Raspberry Pi sinnvoll oder misst er dort Hausnummern? Lohnt sich dieser teurere Sensor überhaupt? Wie sind evtl. eure Erfahrungen? Ich habe z.B. gesehen, dass sich Dennis89 mit so etwas befasst hat.

    Oder gibt es noch eine ganz andere, gar bessere Alternative eine barometrische Messung durchzuführen?

    Und dann habe ich noch eine Frage. Ich schreibe die Messwerte der Technoline-Sensoren mittels eines modifizierten pyLacrosse (siehe #25) in eine InfluxDB2-Datenbank. Kann ich mit einem zweiten, davon unabhängigen Skript die Messwerte des Luftdrucksensors zeitgleich in dieselbe Datenbank schreiben oder kommt es da zu Konflikten?

    Vielen Dank für eure hilfreichen Tipps im Voraus!

    Viele Grüße, Mic.

  • Moin Mic2022,

    einen BMP280 kann man sicherlich direkt an einem RPi installieren. Dem Luftdruck sollte es egal sein.
    Bei einem BMP680 sollte man das nicht machen.Da beeinfussen u.a. die Temperatur die Messwerte. Der Sensor sollte schon etwas von der Wärmequelle RPi weg sein.

    Kann ich mit einem zweiten, davon unabhängigen Skript die Messwerte des Luftdrucksensors zeitgleich in dieselbe Datenbank schreiben oder kommt es da zu Konflikten?

    Naja, zeitgleich wird nicht gehen. Aber nacheinander schon. Zu Konflikte sollte es nicht kommen.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo,


    ich sehe den Sinn nicht, wieso nicht alle Sensoren in einem Programm ausgelesen und die Werte geschrieben werden sollen?

    Das führt sonst nur zu einem undurchschaubaren Ablauf und Schwierigkeiten bei der Fehlersuche.


    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Hallo zusammen,

    vielen Dank für eure Antworten. Genau diese Bedenken, wenn ich einen BPM680 auch. Frage ist, wie brauchbar die CO2-Messung dieses Sensors überhaupt ist, sodass sich der Aufwand lohnen würde, ihn irgendwo anders zu positionieren.

    Ich denke, ich werde erst einmal beim BPM280 bleiben. Kann allerdings die Wärme im RasPi-Gehäuse auch die Werte des Drucksensors verfälschen. Wir wissen ja aus der allgemeinen Gasgleichung der Thermodynamik, dass Druck und Temperatur von einander abhängen.

    p • V = n • R • T

    Warum möchte ich, dass die Daten des Sensors über ein eigenes Skript in die InfluxDB-Datenbank geschrieben werden? Alle anderen Sensoren sind Funksensoren, die nach dem Lacrosse-Protokoll Daten senden und diese werden über mein erweitertes pyLacrosse-Python-Skript in die Datenbank geschrieben.

    Ich möchte ungern in dieses (schon etwas komplexe Skript) noch das Verarbeiten eines „Nicht-Lacrosse-Sensors“ einbauen. Da sieht am Ende keiner mehr durch. Daher die Idee ein paralleles Skript, was alle X Minuten einen Druckwert in die Datenbank schreibt, zu erstellen. In den meisten Fällen wird es sicher nicht passieren, dass beide Skripte exakt zur gleichen Millisekunde in die Datenbank schreiben aber es kann schon mal passieren. Auf der anderen Seite habe ich aber auch statt einer „CSV-Datei“ ein Datenbanksystem gewählt, was mit so etwas umgehen können sollte... dachte ich.

    Das parallele Schreiben eines Skripts und Lesen eines anderen Skripts funktioniert schon mal. Wobei ich da natürlich auch nicht weiß, ob es schon einmal zu einem exakt zeitgleichen Zugriff kam.

    Vielen Dank und Grüße, Mic.

  • Komplexität in Programmen bekommt man mit den Mitteln der Programmiersprache eigentlich in den Griff. Es gibt Funktionen, Klassen, und Packacges und Module um Code zu strukturieren.

    Da hast du wohl recht aber es passt für mich trotzdem nicht zusammen, in ein Skript, was Äpfel verarbeitet eine Birne mit einzubauen. ;) Ich glaube, ich bestelle mir erste mal so 'nen Sensor, dann sehen wir weiter. Die wichtige Info für mich war, dass der BPM680 nicht der richtige Sensor für meinen Einsatzfall ist.

    Danke euch. :)

  • Hallo,


    du verarbeitest in einem Skript Sensoren, das dürfen gerne unterschiedliche sein.

    Ja klar, der Druck hängt auch von der Temperatur ab, aber auch hier ist die Frage wofür du die Druckwerte benötigst, wie genau der Sensor letztendlich ist. Die theoretische Druckänderung bei einer Temperaturdifferenz kannst du ja leicht berechnen. Aber da du den eh verwenden willst würde ich einfach Testmessungen an verschiedenen Orten machen .


    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Das kann ich dir leider nicht beantworten. Ich habe den BMP280 schon relativ lange in einem Gewächshaus und einem Kühlschrank im Einsatz. Mich interessieren aber nur die Temperaturen und die liefert er mir total problemlos.


    Da wissen andere vielleicht mehr.


    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Moin!

    Ja, die Temperatur beeinflusst den Druck, aber das Datenblatt von Bosch sagt:

    The very low offset temperature coefficient (TCO) of 1.5 Pa/K translates to a temperature drift of only 12.6 cm/K.

    Ich denke man kann es vernachlässigen.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo zusammen,

    hat ein Stück gedauert aber jetzt habe ich es umgesetzt. Ich habe den Sensor BMP280 über die PIN-Leiste des Raspberry Pi angeschlossen und lesen die Werte alle fünf Minuten ein und schreibe sie in meine InfluxDB2-Datenbank. Ich habe mich, wie oben gesagt, dafür entschieden, für den Drucksensor ein eigenes Python-Skript zu verwenden und es nicht in pyLacrosse einzubauen. Das funktioniert nun seit einer Woche stabil. Ich gehe auch davon aus, dass ein Datenbanksystem dafür geeignet ist, dass verschiedene Datenquellen und verschiedene Datensenken drauf zugreifen.

    Wie man den Sensor BMP280 einrichtet, ist in der Laub-Home Wiki gut erklärt.

     

    Beim Skript habe ich mich nun von Dennis89 inspirieren lassen und es in Funktionen aufgeteilt. War etwas aufwändiger aber am Ende funktioniert es ziemlich gut.


    Also vielen Dank für eure Tipps.

    Grüße,
    Mic.

  • Moin Mic2022,

    danke für die Informationen.
    Sieht gut aus!

    Wenn dein Thema damit erledigt ist, es auch als solchen markieren. Das geht oben bei "Thema bearbeiten"
    Danke!
    Dann noch viel Spaß mit den RPi.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Edited once, last by Bernd666 (February 10, 2024 at 11:10 PM).

  • Mic2022 Anmerkungen zum Quelltext:

    Bei den Importen kann man ein bisschen aufräumen. `os`, `digitalio`, `influxdb_client`, `WritePrecision`, `SYNCHRONOUS`, `WriteOptions`, und `NoOptionError` werden importiert, aber nirgends verwendet‽

    `InfluxDBClient` und `Point` werden zweimal importiert.

    Das Modul `ConfigParser` gibt's in Python 3 nicht mehr, das braucht man gar nicht erst versuchen zu importieren.

    Wenn man eine Ausnahme behandelt in dem man sie einzig und alleine mit ``raise`` sofort wieder auslöst, kann man sich das auch komplett sparen.

    `codecs.open()` hat man unter Python 2.7 schon nicht mehr verwendet. In Python 3 nimmt man die normale `open()`-Funktion. Aber letztlich macht es keinen Sinn die Datei selbst zu öffnen (und dann nicht wieder zu schliessen!) statt die `read()`-Methode mit dem Pfad aufzurufen.

    `open_config_file()` öffnet die Konfigurationsdatei nicht nur sondern liest sie auch ein. Womit dann `read_config_file()` natürlich auch nicht mehr das macht was der Funktionsname suggeriert.

    Bei `file_config` sind die Worte falsch herum. Das ist keine Dateikonfiguration, sondern eine Konfigurationsdatei. Also eigentlich ja nur eine Konfiguration. Eine Verbindung zu einer Datei hat dieses Objekt nicht.

    Der Name `credentials` wird für etwas wiederverwendet was keine Anmeldeinformationen sind.

    So ein Tupel mit 7 Werten ist ein bisschen unübersichtlich.

    `bmp280_values` wäre ein guter Name für BMP280-Werte, aber für eine Funktion sollte man nicht so einen passiven Namen nehmen sondern einen der eine Tätigkeit beschreibt.

    In der Funktion ist die Ausnahmebehandlung wieder unsinnig. Da wird dann statt eines Rückgabewertes eine Ausgabe gemacht und implizit `None` zurückgegeben, was dann an späterer Stelle zu einem TypeError in einer anderen Funktion führt. `Print` ist zudem falsch geschrieben, das würde da also in einen `NameError` laufen.

    Für jede Messung das `I2C` und `Adafruit_BMP280_I2C` neu zu erstellen ist vielleicht ein bisschen umständlich.

    Grunddatentypen sollten nicht in Namen vorkommen. Das ändert man gerne mal und dann hat man entweder falsche, irreführende Namen im Quelltext oder muss alle betroffenen Namen anpassen. `value_list` stimmt auch inhaltlich nicht so ganz, weil die Werte ja in `bmp_values` stehen. In `value_list` stehen die Namen/Bezeichnungen zu den Werten.

    ``for i in range(0, len(sequence))`` ist in Python ein „anti pattern“ weil man direkt über die Elemente von Sequenzen iterieren kann. Wenn man über mehrere Sequenzen ”parallel” iterieren möchte, gibt es die `zip()`-Funktion. Besser wäre aber die Daten gleich zusammen zu übergeben und nicht in zwei getrennten Datenstrukturen.

    `bmp_frequency` ist keine Frequenz sondern eine Verzögerung.

    Ungetestet:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Post by Mic2022 (February 16, 2024 at 11:17 PM).

    This post was deleted by the author themselves (February 16, 2024 at 11:17 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!