Python&RPi: Ein Treiber für den BMP180

Kleines Projekt und viel Erfahrung

Als ich kürzlich in der dunklen Jahreszeit wieder angefangen habe, mich mit dem Raspberry Pi zu beschäftigen und dazu auch Python zu lernen, fiel mir auch wieder das RB-Explorer 700 HAT von joy-it.net in die Hände. Das Board liegt jetzt bestimmt schon seit der Pandemie herum. Endlich gab es also eine Gelegenheit es in Betrieb zu nehmen.

Die Lernkurve ist steil.  Bei der Installation der Python-Module erfahre ich, dass pip3 externe Module nur noch in einem virtual environment angewendet werden können, außer man zwingt pip3 mit '--break-system-packages' das zu ignorieren.

Auf dem RBE700-HAT ist angeblich auch ein Luftdrucksensor BMP280 enthalten. Nur leider liefert der entsprechende Adafruit-Treiber stets einen Fehler, weil er eben diesen BMP280 nicht findet. Ein sehr genauer Blick ins Datenblatt des RBE700-HAT liefert dann jedoch den Aufschluss darüber, dass in der allgemeinen Beschreibung zwar der BMP280 aufgeführt wird, aber im Schaltplan der BMP180 eingezeichnet ist! Ein schöner Anlass dafür einen eigenen PYTHON-Treiber zu schreiben.

Die Treiberentwicklung ist ein recht lehrreiches Schaustück der Programmier-ung mit PYTHON. Ziemlich viele, verschiedene Konzepte müssen dazu angewendet werden: Objektorientierung, Iteratoren, Bitoperatoren, Datentypen (integer, float, list, tupel) u.v.m.

Die dynamische Typallokation ist mir als alterndem C-Programmierer hingegen ein Graus.  Ich zwinge mich von Anfang an dazu, Variablentypen und die Rückgabewerte von Funktionen/Methoden trotzdem explizit zu definieren. In Entwicklungsumgebungen wie pycharm hat das z.B. den Vorteil, dass Warnungen und Fehlermeldungen deutlich spezifischer werden, als bei einer automatischen Typisierung. Zum anderen finde ich persönlich, dass


def function (a):

return a+1


später mehr Dokumentation bzw. Erklärung erfodert als


def function_add_1 ( a: int ) -> int:

return a+1


Wenn ich mir nun bloß noch abgewöhnen könnte, an jedes Zeilenende ein ; setzen zu wollen, dann würde es schon ganz flüssig laufen;

Das Ergebnis dieser Treiberentwicklung biete ich hauptsächlich mir selbst als Download an. Für ein eigenes Git-Repository bin ich einfach noch nicht bereit.

Die Treiberpendants von z.B. Adafruit bieten neben den üblichen Methoden get_temperature() und get_pressure() auch immer eine Implementierung der barometrischen Höhenformel an. Ich finde das falsch, weil die barometrische Höhenformel kein Attribut eines Druck-Temperatursensors sein kann.


Meine Tests des Treibers erstrecken sich daher zunächst ausschließlich auf die Gewinnung von Temperatur- und Druckdaten. Besonders interessiert mich dabei der RMS noise des Drucksensors. Das Datenblatt des BMP180 liefert dafür entsprechende Referenzwerte. Mit numpy wird die Ermittlung von Mittelwert und RMS noise aus langen Messreihen zu einer einfachen Fingerübung.


Zwei Dinge fallen mir dabei auf:

  1. Die ermittelten Temperaturen liegen meist im Bereich von über 30°C und weisen selbst oft ein RMS noise in der Größenordnung von 0,1 K auf.
  2. Immer wenn Temperaturreihen weiter streuen, nimmt auch das Rauschen des Drucks zu.


Was ist daran so besonders? Nun, würde man aus Druck und Temperatur eine Höhe ermitteln, so würde diese um ca. +/- 0,5 Meter hin und her "hüpfen", ohne das man den Sensor bewegt hätte. Für eine unabhängige Indoor-Navigation würde das nicht ausreichen, zumal ich aus früheren Experimenten weiß, das der Luftdruck bereits beim Öffnen einer Zimmer- oder Wohnungstüre erheblich variiert.

Das Code-Fragment zum Test des BMP180-Treibers gibt es als Download. Darin kann man sehr schön die Verwendung von numpy nachvollziehen.

Zing • 5. Januar 2025