Ein Bluetooth LE Temperatur- und Luftfeuchtesensor

Arduino Uno

Netatmo bietet mit seinen Raumklima-Sensoren eigentlich alles, was das Herz begehrt. Allerdings ist der Versand der Klimadaten und sogar von Bild- und Tondaten dieser Sensoren in die Cloud für mich ein K.O.-Kriterium.  Da bei mir schon ein zentraler Server auf Basis eines Raspberry Pi läuft (Nachrichtenticker), wollte ich diesen nutzen, um  dort die Klimadaten aus verschiedenen Zimmern zentral zu sammeln und anzuzeigen.

Zunächst kaufte ich mir dazu einen fertigen Bluetooth LE Sensor zum Experimentieren. Allerdings stieß ich damit schnell an Grenzen, da die Daten in kryptischer Form übertragen werden. Deshalb entschloss ich mich, selbst einen Bluetooth LE Sensor aufzubauen. So konnte ich Erfahrungen mit dem Bluetooth LE Protokoll sammeln und habe außerdem den Vorteil, den Sensor nach Belieben erweitern zu können, beispielsweise um Helligkeits-, Staub- oder Luftqualitätswerte.

Hardware

Für den Sensor kamen folgende Bauteile zum Einsatz:

  • Adafruit Feather 32u4 Bluefruit LE,
  • Adafruit Si7021 Temperature & Humidity Sensor Breakout Board,
  • LiPo Akku 3,7V 2000mAh mit JST-PH Connector

für zusammen etwa 45€ sowie etwas Bastelmaterial (Karton) für das Gehäuse. Der Zusammenbau ist sehr unproblematisch: Der Stecker des Akkus wird in das Feather-Board gesteckt und der Sensor an die I²C-Leitungen des Boards mit zwei Drähten angelötet.

Software

Die Software setzt sich aus zwei Komponenten zusammen: Zum einen muss das Feather-Board die Daten aus dem Sensor auslesen und per Bluetooth LE verschicken. Zum anderen muss auf dem Raspberry Pi eine Software diese Daten auslesen und anzeigen.

Für das Bluetooth LE Board hatte ich die Herausforderung, soweit es geht den Stromverbrauch durch geschickte Programmierung zu senken, damit eine Akku-Ladung möglichst lange hält. Hier sei vorweggenommen, dass mir dies sehr gut gelungen ist, so dass mittlerweile der gesamte Sensor mehrere Wochen autark betrieben werden kann.

Der Einstieg in die Programmierung des Bluefruit-Feather-Boards gestaltet sich aufgrund der sehr guten Einführung auf der Webseite des Herstellers problemlos. Allerdings lagen dann mit meinem Ziel des Stromsparens doch noch einige Stolpersteine im Weg.

Zunächst galt es, den Prozessor des Boards möglichst lange im Tiefschlaf zu halten. Dafür gibt es verschiedene Bibliotheken, wie die Sleepy-Dog-Bibliothek und die Low-Power-Bibliothek. Ich entschied mich, letztere zu nutzen.

Dabei hatte es mich einige Zeit gekostet herauszufinden, dass der Prozessor auf dem Board im Tiefschlafmodus (Power-Down) ebenfalls den USB-Port abschaltet. Die serielle Ausgabe kann somit zum Debuggen nicht mehr benutzt werden, und für die Installation geänderter Software auf dem Board muss vorher ein Reset des Boards erfolgen. Der Gewinn allerdings ist eine Stromersparnis um einen Faktor 2000!

Des Weiteren wollte ich die Temperatur-, Feuchte- und Akkuverbrauchswerte im sogenannten Advertising-Block des Bluetooth-Senders mitgeben, damit vom Empfänger keine explizite Verbindung zum Sensor aufgebaut werden muss. Das spart noch einmal Strom. Um dies zu erreichen,  habe ich die Daten in die Hersteller-Daten („manufacturer data“) des Advertising-Blocks codiert. Leider müssen dazu auch sämtliche anderen Advertising-Daten auf dem Feather-Board neu geschrieben und der Sender dann zurückgesetzt werden. Da ich die Werte aber nur alle 8 Sekunden erneuere, hält sich die Anzahl der Software-Resets des Senderbausteins noch in Grenzen.

Der Quellcode für meinen Hardware-Aufbau des Sensors findet sich hier angehängt: BLE_Sensor_Code.zip.

Nachdem mein Sensor nun fleißig Daten liefert, wollte ich diese natürlich auf meinem Raspberry Pi anzeigen. Voraussetzung dafür ist, dass die notwendigen Bluetooth LE-Bibliotheken „bluez“ und „tinyb“ auf dem Raspberry installiert sind (siehe dazu mein Blog zur Installation).

Insbesondere die tinyb-Bibliothek erleichtert die Programmierung sehr. Auch hierbei gab es allerdings wieder einen Stolperstein. Bluetooth wird auf Linux über den sogenannten D-Bus angesprochen. Da Bluetooth LE Geräte ihre Eigenschaften im sogenannten Advertising veröffentlichen, wird zunächst eine Erkennung dieser Geräte angestoßen  (Scan des Frequenzbandes und Auswertung empfangener Daten). Diese Erkennung stoppt man programmatisch, sobald das betreffende Gerät gefunden wird. Allerdings meldet der Bus seinen tatsächlichen Status nicht zurück. So kann es passieren, dass der Bus noch aktiv ist, während das eigene Programm sich beendet. Der Bus bleibt dann in einem undefinierten Zustand, und Bluetooth muss komplett neu gestartet werden. Das Ganze ließ sich bei mir nur verhindern, indem ich vor Beenden meines Programms zwei Sekunden warte. Eine wirklich schlechte Lösung, aber ich habe keinen anderen Weg gefunden, den echten Status vom Bus zu bekommen.

Mein Programm (C-Code plus Makefile) kann man ebenfalls hier herunterladen: ReadSensorData.zip.

Ich hoffe, dass beide Programme instruktiv sind. Und wie immer: Über Fragen und Anregungen freue ich mich.

2 Gedanken zu „Ein Bluetooth LE Temperatur- und Luftfeuchtesensor“

    1. Hallo Marcel,

      Leider liegt der Sensor jetzt schon etwas in der Schublade. Wenn ich mich recht erinnere, lief er so um die 4 Wochen. Bei 2000 mAh wäre das ein durchschnittlicher Verbrauch von knapp 3 mA, was zwar immer noch etwas hoch ist, mir aber ausgereicht hatte.

      Liebe Grüße,
      Michael

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.