Hallo und herzlich willkommen bei dem Jugend Programmiert Projekt Wetterstation .
In diesem Projekt bauen wir zusammen mit dir eine digitale Wetterstation. Dabei lernst du, wie man verschiedene Sensoren für Temperatur und Luftfeuchtigkeit ausliest und die Daten verarbeitet. Außerdem steuern wir ein Siebensegment Display an und geben auf diesem unsere Daten aus.
Inhalte | Seite |
---|---|
Einleitung & Vorbereitung | Seite 2 |
DS18B20 anschließen & auslesen | Seite 3 |
DHT11 anschließen & auslesen | Seite 5 |
Sieben Segment Display | Seite 9 |
Daten verarbeiten | Seite 17 |
Daten auf das Display bringen | Seite 22 |
Einleitung & Vorbereitung
Wir freuen uns, dass du dich für eines unserer Projekte entschieden hast. Wie immer gehen wir von einer frischen und aktuellen Raspbian Installation auf deinem Raspberry Pi aus. Bringe dein System auf einen aktuellen Stand. Öffne ein Terminal und gebe den folgenden Befehl ein:
$ sudo apt-get update && sudo apt-get upgrade
Als nächstes aktivieren wir ein paar Einstellungen in der Raspberry Pi Konfiguration. Dies ist notwendig, damit der Pi ein paar GPIO Pins anders ansteuert. Dies brauchen wir für die Sensoren. Aber keine Angst, das ist ganz einfach. Gebe in deinem Terminal den Befehl ein:
$ sudo raspi-config
SPI für das Display
In dem Menü wählen wir zuerst Nr. 3 Interface Options aus. Jetzt wählst du Punkt P4 SPI aus. Auf die Frage, ob wir das SPI Interface aktivieren wollen, antworten wir mit Yes/Ja und bestätigen das mit OK .
1-Wire für den Outdoor Sensor
Im raspi-ronfig
Menü gehst du wieder auf Nr. 3 Interface Options und dort auf P7 1-Wire . Das Aktivieren des one-wire Interace bestätigen wir mit Yes/Ja und Ok, der Pi am besten einmal neustarten.
Das war es schon. Jetzt ist dein Pi bereit, die Sensoren auszulesen.
DS18B20 – Der Outdoor Sensor
Der DS18B20 ist ein Temperatursensor, der über das One-Wire Interface ausgelesen wird. Das bedeutet, dass der Sensor nur einen GPIO Pin für die Datenübertragung braucht. Dazu kommen aber noch Strom, also + und – . Der Sensor ist wasserdicht und kann daher auch unter Wasser genutzt werden. Das gilt natürlich nur für die Spitze und das Schwarze Kabel. Am anderen Ende findest du drei Kabel in den Farben rot, schwarz und gelb. Rot ist für Strom, schwarz für Ground (minus) und über das gelbe Kabel werden die Daten übertragen. Bei dem Sensor ist auch ein 4,7kΩ (Ohm) Widerstand dabei, den werden wir gleich brauchen.
Entferne ein kleines Stück, ca. 0,5 cm der Isolierung der drei Kabel. Falls du keine Abisolierzange hast, kannst du das vorsichtig mit einem Cuttermesser machen. Jetzt nimmst du dein Breadboard und drei Jumperkabel M/F. Das steht für Male und Female, männlich und weiblich, damit ist einfach der Stecker mit Pin auf der einen und ohne Pin auf der anderen Seite gemeint. Jetzt steckst du das Kabelende ohne Isolierung in das Breadboard und fixierst es mit einem der Stecker. Wenn du mehr über die Funktionsweise des Breadboards erfahren möchtest, dann kannst du online unser Tutorial dazu schauen:
https://codingworld.io/starterkit-6Zahlen-gpio
Der One-Wire Sensor ist super einfach auszulesen. Alle paar Sekunden schickt der Sensor Daten an den GPIO Pin 4. Dieser überträgt die Daten in eine Datei und speichert sie auf deinem Raspberry Pi. Öffne das Terminal und gebe den folgenden Befehl ein:
$ cd /sys/bus/w1/devices/
Mit cd
(Change Direcory) gehen wir in einen bestimmten Ordner. In diesem Ordner gibt es einen Ordner mit einer Nummer. Lasse dir alle Dateien und Ordner mit dem Befehl ls
anzeigen. Einer der Ordner heißt 28-XXXXX. Die Nummer ist die ID deines Sensors. Jeder Sensor hat eine eigene ID und auch einen eigenen Ordner, es ist sogar möglich mehrere DS18B20 Sensoren an einem GPIO Pi an zu schließen. Wir wechseln in den Ordner des Sensors.
$ cd 28-XXXXXXX
In diesem Ordner gibt es eine Datei mit dem Namen w1_slave, in der stehen die Temperaturdaten. Der Befehl cat
gibt den Inhalt einer Datei direkt aus. Das machen wir jetzt.
$ cat w1_slave
Die Ausgabe sollte so aussehen:
0a 00 4b 46 7f ff 0c 10 64 : crc=64 YES
0a 00 4b 46 7f ff 0c 10 64 t=16625
Die erste Zeile ist eine Prüfnummer, damit der Pi weiß, dass er die richtigen Daten bekommen hat. Die zweite Zeile ist die interessante. Am Ende steht dort t=16625 Das ist die Temperatur.
Natürlich wäre es immer etwas umständlich, den Ordner heraus zu suchen und sich dann die Temperatur ausgeben zu lassen. Wechsel zurück in dein Heimverzeichnis mit dem Befehl
$ cd
Der Terminal hat sehr viele praktische Funktionen. Es gibt auch eine, die es erlaubt, den Inhalt der w1_slave direkt auszugeben. Der Befehl dazu lautet:
$ cat /sys/bus/w1/devices/??-*/w1_slave
Dieser Befehl sollte auf jedem Raspberry Pi funktionieren. Die „?“ stehen für jedes mögliche Zeichen, der „*“ steht für jede beliebige Zeichenfolge. Einzig das „-“ ist fest. Es wird ein Ordner benutzt der an dritter Position ein „-“ hat. Aus diesem Ordner wird der Inhalt der Datei „w1_slave“ ausgegeben.
DHT11 Luftfeuchtigkeit und Temperatur
Der zweite Sensor in unserem Kit ist der DHT11. Der Sensor kann die Temperatur und die Luftfeuchtigkeit in einem Raum messen. Um Ihn anzusprechen, müssen wir ein paar Dinge vorbereiten. Als Erstes laden wir uns eine Bibliothek herunter, mit der wir den Sensor auslesen können.
$ git clone https://github.com/coding-world/DHT11_Python
Der Befehl lädt die ganze Bibliothek in den Ordner DHT11_Python. In diesen Ordner wechseln wir mit dem Befehl:
$ cd DHT11_Python
Jetzt installieren wir die Bibliothek mit diesem Befehl:
$ sudo python3 setup.py install
Die Bibliothek ist nun auf deinem PI installiert und wir können sie in unser Pythonprogramm einlesen.
Anschließen
Anschlüsse am Pi | Anschlüsse am DHT |
3,3V | 1. Pin DHT |
GPIO17 | 2. Pin DHT |
Widerstand 4,7kΩ | Zwischen 1. Pin DHT und 2. Pin DHT |
GND (Ground) | 4. Pin DHT |
Wenn du den DS18B20 schon angeschlossen hast, wirst du merken, dass GPIO Pin 4 schon belegt ist. Deswegen verbinden wir die Datenleitung des DHT11 mit dem GPIO Pin 17 !
Zwischen dem 1. und dem 2. Pin am DHT musst du noch einen Widerstand anschließen. Das dient nicht nur zur Stromversorgung des Sensors, sondern auch dazu, dass dieser Messwerte liefern kann, die akkurater sind. Am besten eignet sich dafür der Widerstand mit 4,7kΩ. Widerstände erkennst du an ihrem aufgemalten Farbcode. Beim 4,7kΩ lautet dieser: Gelb, Lila, Schwarz, Braun und Gold.
Bitte achte genau darauf, den Sensor in dieser Reinfolge anzuschließen! Wenn du den 3,3V und den GND Pin verwechselst, kommt es zu einem Kurzschluss und der Sensor kann dadurch kaputt gehen und sehr sehr warm werden. Achte darauf! Solltest du bemerken, dass der Sensor unnnormal warm wird oder sich sogar das Plastik verbiegt, schalte sofort deinen Raspberry Pi aus oder entferne die Verbindung zwischen dem Breadboard und dem Sensor!
Wenn du alles richtig angeschlossen hast, können wir den Sensor auslesen. Dafür erstellen wir eine neue Datei und schreiben ein kleines Script zum Testen.
$ nano dht11_einfach.py
Das unbeschriebene Blatt mit Code füllen:
import RPi.GPIO as GPIO
import dht11
GPIO.setmode(GPIO.BCM)
sensor = dht11.DHT11(pin=17)
indoor = sensor.read()
if indoor.is_valid():
print("Temperatur: " + str(indoor.temperature))
print("Luftfeuchtigkeit: " + str(indoor.humidity))
GPIO.cleanup()
Am Anfang binden wir wie immer die benötigten Bibliotheken ein. In Zeile 4 setzen wir das Pinout der library auf BCM (das entspricht der GPIO Nummerrierung). In Zeile 5 sagen wir der library dann welchen GPIO-Pin wir für den Senesor nutzen möchten (17). In Zeile 7 werden die Senesorwerte ausgelesen, welche wir als Objekt erhalten und dieses in der Variable indoor
speichern.
Danach geben wir wie gewohnt alle Informationen in der Konsole aus.
Führe deinen Code aus mit diesem Befehl:
$ python3 dht11_einfach.py
Die Ausgabe sollte ungefähr so aussehen:
Temperatur: 19.0°C
Luftfeuchtigkeit: 21.0%
Falls es zu Fehlern kommt, kontrolliere bitte ob du die Bibliothek mit dem Befehl sudo python3
installiert hast und der Sensor richtig verbunden ist.
Guten Abend
Gibt es eine Möglichkeit die DHT11_Python Bibliothek runterzuladen? Ich habe nämlich kein GitHub Account
Hallo ribo, um die Bibliothek runterzuladen brauchst du natürlich keinen GitHub Account. Du kannst das repository direkt auf deinem Pi mit dem Befehl
git clone https://github.com/coding-world/DHT11_Python.git
clonen, wenn du git installiert hast. Das kannst du mitsudo apt install git
machen. Alternativ kannst du dir das repository auch als zip runterladen:wget https://github.com/coding-world/DHT11_Python/archive/refs/heads/master.zip
Das Kommando „git clone https://github.com/coding-world/DHT11_Python“ funktioniert doch direkt? (Irre ich mich da? Wird dadurch etwas nicht vollständig heruntergeladen bzw. in den folgenden Darstellungen oben doch nicht richtig eingebunden?)
Besonders die weiteren Frage stelle ich, weil ich hier bei der folgenden Fehlermeldung hängenbleibe:
NameError: name ‚result‘ is not defined
pip install dht11 #zeigt mir, dass dieses schon vorhanden ist.
Hallo,
funktioniert nicht immer. Habe das mit einer while-Schleife behoben:
import RPi.GPIO as gpio
import dht11, time
gpio.setmode(gpio.BCM)
sensor = dht11.DHT11(pin = 17)
indoor = sensor.read()
while not (indoor.is_valid()):
indoor = sensor.read()
if indoor.is_valid():
print(‚Temperatur: ‚ + str(indoor.temperature))
print(‚Luftfeuchtigkeit: ‚ + str(indoor.humidity))
gpio.cleanup()
So geht das immer (bei mir)