Daten Verarbeiten

Fassen wir zusammen, was wir bisher erreicht haben. Du hast die Sensoren, DS18B20 und DHT11 an deinen Raspberry Pi angeschlossen. Du weißt, wie du die Daten ausliest. Das 7 Segment Display hast du auch mit deinem Pi verbunden und gelernt, Informationen auf diesem anzuzeigen.

Jetzt fügen wir alles zusammen.
Auf dem Display soll die Temperatur sowohl innen, als auch außen, sowie die Luftfeuchtigkeit angezeigt werden. Alle 10 Sekunden soll die Anzeige wechseln. Lege eine neue Datei an, in diese Schreiben wir unser Programm.

$ nano WetterStation.py

Außentemperatur

Die Temperatur lesen wir aus der w1_slave Datei aus, dass haben wir am Anfang des Buches beschrieben. In Python öffnen wir die w1_slave Datei und lesen den Inhalt aus.

w1="/sys/bus/w1/devices/28-00000/w1_slave"
outdoor=open(w1).readlines()

Wenn wir uns die Variable outdoor ausgeben lassen dann sieht das so aus:

['56 01 4b 46 7f ff 0c 10 7b : crc=7b YES\n',
'56 01 4b 46 7f ff 0c 10 7b t=21375\n']

Erfahrene Programmierer sehen hier, dass outdoor ein Array ist, also eine Variable mit mehreren Ebenen, in diesem Fall genau zwei. Ein einzelnes Element in einem Array sprechen wir über den Array-Namen mit eckigen Klammern an. So können wir mit outdoor[0] den ersten Teil ausgeben und mit outdoor[1] den zweiten Teil. Beachte hierbei, dass wir in der Welt des Programmierens meistens bei 0 zu zählen beginnen! Da wir den ersten Teil nicht brauchen, reicht uns der zweite Teil, den wir so ansprechen:

print outdoor[1]

Die Ausgabe sieht dann wie folgt aus:

56 01 4b 46 7f ff 0c 10 7b t=21375

Leider passt diese lange Zahl nicht auf unser Display und es sind viel zu viele Informationen, die wir nicht brauchen. Wir wollen nur die Temperatur haben. Deswegen müssen wir einen Teil abschneiden. Alles bis zum brauchen wir nicht. Um nur bestimmte Teile einer Variable zu nutzen, gibt es die einfache Möglichkeit, eckige Klammern und einen Doppelpunkt hinter die Variable zu setzen. In diesem kleinen Codebeispiel siehst du wie das geht.

variable = "Zu viel Text auf dem Schirm"
print (variable)
print (variable[8:])
print (variable[8:12])
print (variable[8:-15])

Tippe dieses kleine Programm ab und führe es aus. Bei der ersten Ausgabe geben wir den kompletten Text aus. In der dritten Zeile steht hinter der Variable noch [8:] . Das sorgt dafür, dass die Variable erst ab der achten Stelle ausgegeben wird. Zeile 4 hat hinter der 8 noch eine 12 stehen. Der Doppelpunkt steht für unseren String, die Zahl vor dem Doppelpunkt schneidet am Anfang acht Zeichen weg. Die Zahl hinter dem Doppelpunkt schneidet alles ab, was größer ist als diese Zahl. Also gibt die Zeile print variable[8:12] nur das aus, was an Position 8 bis 12 steht. Alles davor und dahinter kommt weg. In der letzten Zeile arbeiten wir mit einem Minus [8:-15]. Die 8 schneidet wieder alles weg, was vor Position 8 steht. Die 15 schneidet auch alles weg, aber durch das Minus nicht von vorne, sondern von hinten. Es werden also die letzten 15 stellen in unserem String weggeschnitten. Der Doppelpunkt ist immer unser String und mit den Werten davon und dahinter können wir den String beschneiden. Positive Zahlen schneiden von links, negative zahlen schneiden von rechts. Achte darauf, dass es nicht zu Überschneidungen kommt. print variable[8:4] schneidet alles vor der achten Position weg und alles nach der vierten. Jeweils vom Anfang des Strings, es bleibt so nichts über was noch angezeigt werden könnte.

Kommen wir zurück zu unserem Temperatur-String.

f5 01 4b 46 7f ff 0c 10 84 t=31312

Um diesen zu verkürzen, könnten wir die Zeichen vom Anfang bis zum zählen. Wir können auch von hinten bis zum zählen. Praktisch wäre es, wenn Python uns sagen könnte, wo das ist. Dafür gibt es eine Funktion, die Funktion find().

print (find.outdoor("="))

gibt uns die Position aus, in unserem Fall 28. Diese 28 ist die Position des . Da wir das nicht mit ausgeben wollen, addieren wir noch eine Position hinzu. Also 28+1. In Python Code sieht das so aus.

a = outdoor.find(“=“)
a = a+1
print (outdoor[1][a:])

Ergibt:

21375

Jetzt haben wir unseren String. Vielleicht ist es dir aufgefallen, am Ende ist ein Zeilenumbruch. Diesen schneiden wir auch heraus, indem wir am Ende des Strings noch eine Position abschneiden. print outdoor[a:-1] Was noch fehlt ist das Komma in der Temperaturanzeige. Dafür teilen wir unsere Temperatur durch 1000.

outdoor = (outdoor[a:-1]/1000)

Das war harte Arbeit und viel Theorie, um unseren Temperatur-String so herunter zu brechen. Der zweite Sensor ist wesentlich einfacher.

Deine WetterStation.py sollte jetzt so aussehen:

outdoor=open("/sys/bus/w1/devices/28-00000/w1_slave").readlines()
a = (outdoor[1].find("=")) + 1
outdoor = (int(outdoor[1][a:-1])/1000)
#print outdoor

In Zeile 1 lesen wir die ganze w1_slave Datei ein. Zeile 2 sucht mit der Funktion find() das , addiert 1 zu der Position von und speichert den Wert als Variable a. In Zeile 3 überschreiben wir. Wir nehmen die alte lange Variable outdoor, beschneiden sie mit [a:-1] und teilen das, was übrig ist durch 1000. Damit wir den Wert teilen können, müssen wir Python sagen, dass er die Variable als int(), also als Zahl behandeln soll. In der letzten Zeile geben wir die Variable outdoor aus.

Wichtig ist, dass wir in der Variablen Outdoor jetzt den reinen Temperaturwert haben.

DHT11

Im ersten Teil haben wir schon beschrieben wie der DHT11 angeschlossen und ausgelesen wird. Das kleine Script von vorhin nehmen wir jetzt als Grundlage und schreiben oder kopieren es in unsere Datei WetterStation.py .

Du kannst den Programmcode unten anfügen. Wichtig ist nur, dass du am Anfang des Scripts RPi.GPIO und dht11 importierst. Das alte Script sah so aus und kann komplett übernommen werden:

import RPi.GPIO as GPIO
import dht11

GPIO.setmode(GPIO.BCM)
sensor = dht11.DHT11(pin=17)

indoor = instance.read()
if indor.is_valid():
    print("Temperatur:" + str(indoor.temperature))
    print("Luftfeuchtigkeit:" + str(indoor.humidity))

GPIO.cleanup()

Wie du siehst, geben wir einen Text aus, in dem die Variablen temperature und humidity vorkommen, welche in dem Objekt indoor liegen. Erreichen können wir die Variablen, indem wir den namen des Objektes mit dem namen der darin liegenden Variable durch einen Punkt verbinden. Die Variablen können wir direkt für unser Display nutzen. Am besten kommentierst du die beiden Zeilen mit dem print-Befehl aus, indem du eine # davor schreibst. Dann ignoriert Python diese Zeile beim ausführen. Wichtig ist erstmla nur, dass wir zwei Variablen haben, für die Temperatur und die Luftfeuchtigkeit .

Daten auf das Display bringen

Im vorherigen Teil haben wir alle Daten gesammelt und formatiert, die wir brauchen. Diese Werte bringen wir jetzt auf das Display.

Öffne deine WetterStation.py Datei. Jetzt wollen wir das Display einbinden. Dafür fügen am Anfang den Import der verschiedenen Komponenten des 7-Segement Display Bibliothek ein und binden auch gleich die Zeit-Bibliothek time mit ein. Außerdem legen wir fest, dass wir ein Display haben. Der Anfang deiner WetterStation.py sollte jetzt so aussehen:

import RPi.GPIO as GPIO
import dht11
import time
from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.virtual import viewport, sevensegment

GPIO.setmode(GPIO.BCM)
sensor = dht11.DHT11(pin=17)

serial = spi(port=0, device=0, gpio=noop())
device = max7219(serial, cascaded=1)
seg = sevensegment(device)

Bevor wir jetzt Informationen auf dem Display anzeigen, müssen wir uns eine Reihenfolge und eine Dauer überlegen. In diesem Beispiel nehmen wir tindoor.temperature, indoor.humidity, outdoor und zeigen Sie jeweils 10 Sekunden lang an.

Unsere Anzeige soll nicht nur einmal durchlaufen, sondern als Endlos-Schleife. Dafür nutzen wir while 1: Alles, was nach der Zeile while 1: kommt und ein Leerzeichen oder einen Tab eingerückt ist, wird ausgeführt.

Das sammeln der Daten soll in der Schleife liegen, deswegen starten wir die Zeile unter seg = ... als neue Zeile. Füge dort ein:

while 1:

Achtet darauf, dass wir alles ab dem while 1: mit Space oder Tab um eins einrücken!

Im vorherigen Teil haben wir bereits gelernt, wie man Text auf dem Display ausgeben kann.

Nachdem du alles eingerückt hast, gehe ganz ans Ende deines Programms.

Jetzt schreiben wir die erste Ausgabe auf das Display. Achte darauf, auch diese mit Space oder Tab einzurücken, damit auch die Ausgabe innerhalb der Schleife liegt.

  seg.text = "1.   "+str(indoor.temperature)
  time.sleep(10)

Beachte, dass hinter der 1. noch drei Leerzeichen kommen. Das machen wir, damit der ganze linke Block vom Display genutzt wird. Der Punkt benötigt kein eigenes Zeichen, da der er beim Zeichen zuvor mit dargestellt wird.
Auch der rechte Block umfasst vier Zeichen. Da unser Temperatur-String ohne Punkt nur 3 Zeichen hat, passt dDer String also in den Block.
Das time.sleep(10) lässt das Programm 10 Sekunden schlafen. Danach endet der Durchlauf der Schleife. Danach geht es direkt hinter dem while 1: von oben mit einem neuen Durchlauf los. Die Temperatur wird neu eingelesen, formatiert und auf dem Display ausgegeben.

Unterbrechen kannst du den Kreislauf mit der Tastenkombination Strg + c .

Jetzt fügen wir noch die anderen beiden Sensoren hinzu.
Beachte dabei, dass der String der Außentemperatur bis zu 3 Nachkommastellen haben kann und somit ein Zeichen zu lang ist, um ihn auf dem Block anzuzeigen. Ähnlich wie beim Auslesen des Wertes können wir die Länge des Strings limitieren, indem wir hinten [:5] hinzufügen

  seg.text = "1.   "+str(indoor.temperature)
  time.sleep(10)
  seg.text = "2.   "+str(indoor.humidity)
  time.sleep(10)
  seg.text ="3.   "+str(outdoor)[:5]
  time.sleep(10)

Beim Feuchtigkeitssensor ist es genau wie beim Temperatursensor. Die Feuchtigkeit wird ausgegeben und das Programm schläft 10 Sekunden. Als letztes binden wir den Outdoor Sensor ein.

Starte dein Script mit dem Befehl:

$ python3 WetterStation.py

Jetzt läuft es 30 Sekunden lang und gibt dabei alle drei Werte aus. Danach werden die Sensoren neu eingelesen und die aktualisierten Daten werden auf das Display gebracht. Auf der nächsten Seite haben wir dir das ganze Programm noch einmal abgedruckt.

In dem Kit findest du neben den verwendeten Komponenten auch ein paar LEDs und Knöpfe. Die kannst du verwenden, um deine Wetterstation zu erweitern.
Du könntest eine Halterung für das Display bauen und dadrunter eine Beschriftung für die verschiedenen Werte anbringen. Vor jeden Wert bringst du eine LED an und lässt diese leuchten, wenn der entsprechende Wert angezeigt wird. Außerdem könntest du die Knöpfe neben der Beschriftung anbringen und dein Programm so umschreiben, dass beim drücken des Knopfs immer der passende Wert auf dem Display erscheint.

Wie das funktionieren kann, haben wir in einem anderen Projekt erklärt. Dieses findest du online auf:
https://codingworld.io/project/digitale-wuerfer-mit-8×8-led-matrix

Hier noch einmal das fertige Programm:

import RPi.GPIO as GPIO
import dht11
import time
from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.virtual import viewport, sevensegment

GPIO.setmode(GPIO.BCM)
sensor = dht11.DHT11(pin=17)

serial = spi(port=0, device=0, gpio=noop())
device = max7219(serial, cascaded=1)
seg = sevensegment(device)

while 1:
 w1 = "/sys/bus/w1/devices/28-01204b8ac86e/w1_slave"
 outdoor=open(w1).readlines()
 a = (outdoor[1].find("=")) + 1
 outdoor = (int(outdoor[1][a:-1])/1000)

 indoor = sensor.read()
 if indoor.is_valid():
  seg.text = "1.   "+str(indoor.temperature)
  time.sleep(10)
  seg.text = "2.   "+str(indoor.humidity)
  time.sleep(10)
  seg.text ="3.   "+str(outdoor)[:5]
  time.sleep(10)

Herzlichen Glückwunsch

Deine Wetterstation ist fertig. Auf deinem Display werden nun abwechselnd die Werte aus deinen Sensoren wiedergegeben. Du hast gelernt, wie man drei verschiedene Werte auf dem Sieben-Segment-Display anzeigen kann. Außerdem weißt du nun eine Menge über das Beschaffen und Beschneiden von Daten mit Python. Versuche, deine Wetterstation weiter zu verbessern.
Inspiration, Anleitungen und spannende Projekte dazu findest du auf CodingWorld.io

Wir hoffen, dass dir dieses Jugend Programmiert Kit gefallen hat.
Für Fragen, Tipps, Tricks und Feedback besuche uns auf CodingWorld.io