Linux-Projekte für den Raspberry Pi
(in Python realisiert)
Luftdruck auf LCD-Display anzeigen [BMP183]





Bisher konnte ich in den Medien keine grafische Darstellung des Luftdruckes in meiner Umgebung finden. Daher hatte ich mich entschlossen, dies selbst mal zu versuchen. Bei der Suche nach einem einigermaßen preiswerten Luftdruckgeber, der auch an der SPI-Schnittstelle des Raspberry betrieben werden konnte, bin ich bei 'exp-tech.de' auf das Modell BMP183 -das es anscheinend dort inzwischen nicht mehr gibt- gestoßen. Der Nachfolger ist der BMP280. Ob dieser jedoch Pin- / Funktionskompatibel ist weiß ich nicht, da ich mich mit diesem noch nicht beschäftigt habe.


Eine Genehmigung von Adafruit zur Darstellung der technischen Daten des Sensors ist, auch nach über einem Jahr, leider noch nicht eingegangen-

Auch bei dem Bild handelt es sich um eine eigene Aufnahme



Eine Lösung für etwas über 10 Euro. Auch hier hieß es zunächst wieder einmal das Datenblatt zu studieren. Hier konnte ich lesen, daß es doch wohl etwas komplizierter werden würde, als ich gedacht hatte. Da hieß es, daß die Daten zunächst in Rohformat bereitgestellt würden und dann eine Korrektur erfolgen müßte. Aber erst einmal mußte das Ding verkabelt werden:


Hardware


Geliefert wurde der Sensor auf einem kleinen Platinchen von vielleicht 1,7 x 1,7 cm mit einer separaten, kleinen Stiftleiste, die in die vorhandenen Löcher eingelötet werden konnten. Das machte ich auch, denn damit konnte die Baugruppe ohne Probleme in ein Experimentierboard gesteckt und mit dem Raspberry verkabelt werden (es gibt hierzu sogar ein kleines Tutorial). Dabei gab es keinerlei Fragen, denn die Beschriftung auf dem Platinchen war eindeutig


Hier eine kurze Übersetzung die Stromversorgung betreffend:

  • V in – ist der Eingang für die Spannungsversorgung. Da der Chip selbst 3,3 V benötigt, wurde auf der Baugruppe ein Spannungsregler integriert, der mit 3,3 – 5.0 Volt arbeitet. Zum Betrieb des Boards, verwenden Se bitte die gleiche (Logik)Spannung, die auch Ihr Microcontroller nutzt

  • 3V0 – ist der 3,0 V Ausgang des Spannungsreglers. Dieser ist, bei Bedarf, mit bis zu 100 mA belastbar

  • GND – Gemeinsame Masse für Logik und Spannung

Das war eine klare Sache

Vin = 3,3 (3,0 – 5,0) Volt
3Vo = 3,0 Volt Ausgang (nicht benutzt)
GND = 0 Volt (Masse)



Die Beschreibung der Logik-Pins:

Alle Eingangs-Pins der Schaltung verwenden Level-Shifting, um sie 3-5 Volt Logikpegel-sicher zu machen.
Gleichen Logik-Pegel verwenden wie bei V in!

  • SCK – Der SPI clock-Pin. Ist ein Eingang

  • SDO – der Selial-Date Out/ Master Slave in Pin, um Daten VOM BMP183 ZUM Prozessor zu denden

  • SDI – ist der Serial Data In / Master Out Slave Pin, um Daten VOM Prozessor ZUM MBP183 zu senden.

  • CS – der chip Selekt Pin, auf Masse legen, um SPI Transaktionen zu starten. Eingang

Und weiter ging es


SCK = SCLK
SDO = MISO
SDI = MOSI
CS = CS_0



Ein paar nützliche Tips gab es auch noch:


  • Temperatur wird in Grad Celsius berechnet. Zur Umrechnung in Fahrenheit, die klassische Gleichung F = C * 9 / 5 + 32 verwenden

    Druck wird in der SI Einheit Pascal zurückgeliefert
    100 Pascal = 1 hectoPascal (hPa)

  • Es wird auch die in Kontinental-Europa unnötige Umrechnungsformel für die englisch/ amerikanischen Werte angegeben:

    1 Pascal = 0,00029533327 Inch Quecksilber oder
    1 Inch Quecksilber = 3386,39 Pascal

  • Druckumrechnung in Meter Seehöhe ist auch möglich

    (dazu wird der 'vorOrt' Druck hPa benötigt, aber auf Meereshöhe umgerechnet). Der Sensor ist ziemlich genau, hat man aber vom Ort nicht den Druck auf NN, ist es schwierig, genauere Werte als 10 Meter zu erhalten



Auf der Homepage von Adafruit gibt es auch ein Tutorial zu diesem Druckmesser. Leider hat sich Adafruit seit über einem Jahr nicht imstande gesehen, mir auf meine Bitte zur Veröffentlichung hier zu antworten



Nun gab es wieder verschiedene Genauigkeits-Modi zur Auswahl:


Die Genehmigung für einen Auszug aus dem Osram Datenblatt habe ich noch nicht abgefragt


Hier entschied ich mich erst einmal für den Standard-Modus.
Da konnte ich wohl nicht viel falsch machen?





Dann ging es richtig los:


Im E-EPROM des Druckmessers sind, für jedes einzelne Gerät, etliche Kalibrationswerte gespeichert. Diese müssen zunächst per SPI eingelesen werden. Dann wird der eingelesene (Roh) Wert des Luftdrucks über eine kleine Routine kalibriert und im Anschluß geschieht das Ganze genauso mit der eingelesenen (Roh) Temperatur.


Da läßt sich alles auch mit den Routinen durchführen, die zum Download bereitgestellt werden, aber diese sind für den Arduino geschrieben. Da habe ich das lieber selbst gemacht.

Leider habe ich die Genehmigung zur hier geplanten Darstellung der Berechnung der Werte bei Osram noch nicht angefragt


Im E-EPROM des Druckmessers sind, für jedes einzelne Gerät, etliche Kalibrationswerte gespeichert. Diese müssen zunächst per SPI eingelesen werden. Dann wird der eingelesene (Roh) Wert des Luftdrucks über eine kleine Routine kalibriert und im Anschluß geschieht das Ganze genauso mit der eingelesenen (Roh) Temperatur.


Da läßt sich alles auch mit den Routinen durchführen, die zum Download bereitgestellt werden, aber diese sind für den Arduino geschrieben. Da habe ich das lieber selbst gemacht.

Leider habe ich die Genehmigung zur hier geplanten Darstellung der Berechnung der Werte bei Osram noch nicht angefragt



Programmiert war der SPI-Zugriff relativ schnell. Bei der Umsetzung der Kalibrier-Routinen sind dann aber die üblichen Fehler passiert:
Schreibfehler, Ablesefehler (das Ablaufdiagramm ist ziemlich klein geschrieben), Syntaxfehler, u.s.w.
Gott sein Dank waren in dem Ablaufdiagramm Beispielwerte angegeben. Damit konnten die eigenen Programmierschritte kontrolliert werden.
Die Werte des Drucksensors müßten eigentlich noch auf Meereshöhe umgerechnet werden, damit ein Vergleich möglich ist. Da mich aber nur die absoluten Werte interessieren, habe ich mir diese Mühe nicht auch noch gemacht (man müßte einen Referenzwert des Wohnort haben, der schon auf Meereshöhe umgerechnet worden ist. JAAA, das Internet kennt alles. Aber das Ganze dann einpflegen, diesen Aufwand wollte ich mir nicht antun!)
Nachdem das Auslesen und die Kalibrierung dann geschafft waren, ging es daran, das Ganze auch auf dem LCD-Display auszugeben.
Hier konnte ich auf bereits vorangegangene Projekte zurückgreifen. Daher ging das relativ schnell von der Hand.

Die Luftdruckwerte werden nun auf einem separaten Raspberry (mit einer micro USV) alle 2 Sekunden eingelesen und über jeweils 20 Sekunden wird ein Mittelwert gebildet. Dieser dann fortlaufend in einer Datei auf der SD-Karte abgespeichert. Allerdings nur im 5 Minuten-Takt. Das Programm für den Luftdrucksensor befindet sich ___HIER___
Der Rechner läuft permanent 24x7. Wird ein Datumswechsel erkannt, wird die aktuelle Datei geschlossen und eine neue, mit dem aktuellen TagesDatum angelegt.

Um auf die Daten von anderen im lokalen Netzwerk vorhandenen Rechnern zugreifen zu können, wurde ein kleiner, eigener Socket-Server installiert, der beim Start des Rechners automatisch per cronjob gestartet wird.

Auf diese Daten wird dann, per lokalem Socket-Client, zugegriffen und die aufbereitete Grafik am monochromen LC-Display ausgegeben.


Hier ein paar Beispiele:


Noch einmal der Hinweis:

Bei den Darstellungen handelt es sich um absolut gemessene Werte. Sie sind NICHT auf Meereshöhe umgerechnet!




Auch hier wieder die Hinweise:

  • Alle hier gezeigten Grafiken wurden mit dem selbst erstellten Python-Programm 'LCDcopy' aus dem Bildschirmpuffer angefertigt

  • Nein, das monochrome Display kann KEINE Farben darstellen. Diese wurde bei der GIF-Erstellung aus den originalen Grauwerten 'umcodiert'