Bibliotheken über Bibliotheken
Ein elementares Element in diesem Projekt werden die Sensoren sein – und einer der Sensoren, um den ich mich heute kümmere ist der DHT-Sensor (Abkürzung für Digital-Humidity-Temperature-Sensor). Diese gibt es in einigen Ausführungen, die mal mehr oder weniger genau und / oder geeignet für gewisse Umgebungsbedingungen sind. Allerdings soll eine genaue Spezifikation an dieser Stelle noch nicht Gegenstand der Erläuterung sein. In dem vorliegenden Fall geht es erstmal explizit um den DHT11, da ich diesen noch zu hause herumliegen hatte, was ihn zum guten Prototypen macht.
An dieser Stelle steht der geneigte Tüftler natürlich zunächst vor 2 Herausforderungen: Anschluss des Sensors am Raspberry Pi und die Programmierung der Funktion für den Raspberry Pi, sodass am Ende auch Werte angezeigt werden. Widmen wir uns also zuerst dem Anschluss – denn ohne Anschluss kann ich so viel Programmieren, wie ich will… aber ich bekomme eben keine Werte.
Wir wird also so ein Sensor an einem Raspberry Pi angeschlossen?

Der Anschluss des DHT11 am Raspberry Pi ist dankenswerter Weise nicht sonderlich kompliziert. Wir benötigen für den Sensor 5V Versorgungsspannung (VCC), wobei der Sensor allerdings generell zwischen einer Spannung von 3,3VDC und 5,5VDC betrieben werden kann. Weiterhin benötigen wir eine Verbindung zum GND, also dem Masse-Potential. Optimaler Weise beides aus der gleichen Spannungsquelle – hier also der Raspberry Pi. Schlussendlich benötigen wir noch einen Widerstand mit 4,7k Ohm, wahlweise (eigentlich häufiger verwendet, aber gerade nicht zur Hand) ist auch ein Widerstand mit 10k Ohm möglich. Dieser Widerstand wird in der Schaltung also sog. Pullup-Widerstand eingesetzt.
Ein Pullup-Widerstand dient in einer elektrischen Schaltung der besseren Signalverwertung für ein logisches HIGH. Wird ein Schaltkreis nicht geschaltet, zieht der Pullup-Widerstand das Signal automatisch auf die Betriebsspannung, also ein logisches HIGH. Wenn dagegen die Schaltung erfolgt (bspw. durch einen Taster) kommt nun ein klares LOW Signal an. Der Pullup-Widerstand (alternativ auch mittels Pulldown-Widerstand in äquivalenter Form möglich) sorgen damit dafür, dass zu jeder Zeit ein klares Signal am Eingang des Controllers ankommt. Würde diese Variante nicht verwendet werden, wäre es nicht auszuschließen, dass Störsignale (bspw. EMV) dafür sorgen, dass der Eingang Daten empfängt, die eigentlich gar nicht existieren.
Und wie programmiere ich so, dass ich Daten erhalte?
Kommen wir nun zur zweiten spannenden Herausforderung: Ich will Werte durch den DHT11 erhalten und diese auch wirklich in einem Programm auf dem Bildschirm angezeigt bekommen. Hierzu ist ein wenig Vorarbeit nötig.
Zuerst wird die richtige Bibliothek benötigt – und ja, ich sage das an dieser Stelle explizit, da ich leider in eine kleine Falle gelaufen bin, die durch veraltete Informationen gestellt wurde. Ich lief dem Phantom der „Adafruit_DHT“ Bibliothek, das schon bei der Installation über PIP für einige Fragezeichen sorgte, da diese Bibliothek scheinbar nur bis einschl. Raspberry Pi 4 überhaupt verwendet wurde. Da es sich bei meinem Gerät allerdings um einen Raspberry Pi 5 handelt, wurde dieser nicht erkannt und ich musste mittels force-Befehl bei der Installation manuell etwas nachhelfen.
(laboratory) Admin@Admin: ~$ pip install Adafruit_DHT --install-option="--force-pi"
Schlussendlich stellte sich aber beim Testen des geschriebenen Programms heraus, dass diese Bibliothek leider auch im Nachhinein den Raspberry Pi 5 nicht erkennt, was automatisch zu diversen Fehlermeldungen führte.
Nach einiger weiterer Recherche verfolgte ich jedoch eine Spur zur Lösung, die zur Webseite von Adafruit führte. Dort fand ich dann eine andere Version von der gesuchten Bibliothek – allerdings in Bezug auf „circuitpython“, was jedoch am Ende nicht viel mehr für die Umsetzung bedeutete, als ein paar zusätzliche Bibliotheken zu installieren.
(laboratory) Admin@Admin: ~$ pip install adafruit-circuitpython-dht
(laboratory) Admin@Admin: ~$ pip install adafruit-blinka

Die Installation der Bibliothek „adafruit-circuitpyhton-dht“ zog an dieser Stelle die gleichzeitige Installation diverser anderer Bibliotheken mit sich. Hier zeigt sich ein weiterer Vorteil von PIP: Die Erkennung von benötigten Zusammenhängen und Referenzen, um direkt alles benötigte mit herunterzuladen.
Im nächsten Schritt ging es dann an das Programm. Das Programm habe ich direkt auf dem Raspberry Pi geschrieben, um unnötige Datenübertragungen zu vermeiden. Dort habe ich die IDE Geany verwendet, da diese mit Syntax-Highlighting aufwartet, was das Coden etwas angenehmer gestaltet. Nach einigem Herumprobieren bezüglich der Bibliothekseinbindung und der Verwendung der korrekten Funktionen kam schließlich folgender Code als Prototyp / Testprogramm zustande (hier als Screenshot):

Zur kurzen Erläuterung (Kenntnisse in der OOP werden ab hier vorausgesetzt):
import importiert installierte Bibliotheken in die Programminstanz. Hier werden die Bibliotheken adafruit_dht, board und time eingebunden, um in diesen vorhandene Funktionen innerhalb des Programms zu verwenden. An dieser Stelle sei kurz erwähnt, dass es sich bei board und time um Bibliotheken handelt, die bereits vorinstalliert sind. Mit Hilfe dieser Bibliotheken und den zugehörigen Funktionen setzt sich schließlich das oben zu findende Programm zusammen. Von der Funktion her ist es recht einfach aufgebaut. Zunächst wird der Sensor deklariert und damit verbundene „Treiber“ innerhalb des Programms sauber zugänglich gemacht. Anschließend wird eine Endlosschleife angefangen, die sich nur durch einen Fehler mit entsprechender Fehlermeldung oder die übliche Tastenkombination zum Abbruch eines Programms beenden lässt (siehe Zeile 18 und 21). Innerhalb der Schleife gibt es noch eine kurze IF-ELSE Abfrage, bei der es nur darum geht, ob der Sensor ggf. nicht erreichbar ist, was zu der ELSE-Auswertung führt. Gilt dagegen das IF als Wahr, so werden die Temperatur und die Feuchtigkeit in einer hier angegebenen Formatierung auf dem Bildschirm / in der Konsole ausgegeben.