|
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'