In vorherigen Artikeln habe ich ja bereits meinen kleinen Einplatinencomputer Raspberry Pi (Modell B) und das zugehörige Kamera-Modul vorgestellt. Das Unternehmen PiFace bietet weitere spannende Module an:
- PiFace Real Time Clock: Echtzeit-Uhr, die keine Internet-Verbindung benötigt
- PiFace Digital: Erweiterung um LEDs, Relais und Ein- und Ausgänge
- PiFace Control and Display: LCD-Display mit 16×2 Zeichen und zusätzlichen Schaltern
Ich habe mir das „PiFace Control and Display (CAD)“ gegönnt und einige der netten PiFace-Beispiele ausprobiert. Mit Hilfe eines kleinen selbst entwicklten Python-Skripts und den Wetterdaten von Openweathermap ist der Raspberry Pi jetzt eine Wetterstation, der die aktuellen Wetterdaten aus dem Internet abfragt und anzeigt: Temperatur, Luftdruck, Luftfeuchtigkeit, Wind, Wetterlage
Zunächst einmal sollte man die Installationsschritte der Anleitung Setting up PiFace Control And Display befolgen. Die ausführliche Dokumentation ist auf GitHub erhältlich. Falls alles korrekt installiert ist, dann sollte man das folgende Skript ausführen können. Es erscheint dann im beleuchteten Display „Hello World“ und im Terminal wird für jeden Schalter der aktuelle Zustand als 0 (nicht gedrückt) oder 1 (gedrückt) ausgegeben.
import pifacecad as p cad = p.PiFaceCAD() cad.lcd.clear() cad.lcd.backlight_on() cad.lcd.write("Hello World") print("Taster 1: {}".format(cad.switches[0].value)) print("Taster 2: {}".format(cad.switches[1].value)) print("Taster 3: {}".format(cad.switches[2].value)) print("Taster 4: {}".format(cad.switches[3].value)) print("Taster 5: {}".format(cad.switches[4].value)) print("Rocker Taste: {}".format(cad.switches[5].value)) print("Rocker Links: {}".format(cad.switches[6].value)) print("Rocker Rechts: {}".format(cad.switches[7].value))
Das Programm kann man bei installiertem Python (Version 3) auf folgende Weise starten:
- interaktiv:
indem man mit"python3"
in einem Terminal die interaktive Python-Shell öffnet und jede Zeile eintippt und ausführt - als Python-Skript:
indem man die Zeilen in eine Datei speichert und mit"python3 mein-skript.py"
ausführt - als Shell-Skript:
indem man in der Datei (der 2. Variante) die Zeile"#! /usr/bin/python3"
vorranstellt, die Datei mit"chmod a+x mein-skript.py"
ausführbar macht und anschließend das Skript mit"./mein-skript.py"
ausführt
Leider funktionieren einige von den mitgelieferten Beispiele (Verzeichnis: /usr/share/doc/python3-pifacecad/examples
) bei mir nicht. Die Zustände der Schalter lassen sich zwar per Polling abfragen, allerdings lösen registrierte Interrupt-Handler nicht aus. Der Fehler ist bekannt und wahrscheinlich durch ein Update für den Pi 2 entstanden. Die Lösungsmöglichkeiten habe ich nicht weiter verfolgt, da ich mit der Polling-Variante zufrieden bin.
Mit einem kostenlosen API-Key von Openweathermap können wir einige (auch zukünftige) Wetterdaten abfragen. Beispielsweise die aktuellen Wetterdaten für die Lat/Lng-Koordinaten (8.81, 53.08) mit deutscher Ausgabe:
Anfrage: http://api.openweathermap.org/data/2.5/weather?lat=53.08&lon=8.81&appid=ABC&lang=de Antwort: {"coord":{"lon":8.81,"lat":53.08},"weather":[{"id":800,"main":"Clear","description":"klarer Himmel","icon":"01n"}],"base":"cmc stations","main":{"temp":271.037,"pressure":1037.38,"humidity":89,"temp_min":271.037,"temp_max":271.037,"sea_level":1038.16,"grnd_level":1037.38},"wind":{"speed":1.31,"deg":25.0061},"clouds":{"all":0},"dt":1456699111,"sys":{"message":0.0095,"country":"DE","sunrise":1456640015,"sunset":1456678905},"id":2944388,"name":"Bremen","cod":200}
Mit den beiden Programmcode-Schnipseln und ein bischen zusätzlichem Python-Code kann das folgende Skript entstehen. Jede Sekunde werden die Schalter abgefragt, ob ein anderer Schalter als zuvor gedrückt wird. Falls das der Fall ist, erfolgt eine Abfrage der aktuellen Wetterdaten und abhängig von dem gedrückten Schalter wird Temperatur, Luftdruck, Luftfeuchtigkeit, Wind oder Wetterlage angezeigt.
#! /usr/bin/python3 import sys if sys.version[0] != '3': print ('You must run piface-weather with python3') sys.exit(0) import json from pprint import pprint import datetime import pifacecad import codecs from urllib.request import urlopen from time import sleep def formatTimestamp(timestampString): return datetime.datetime.fromtimestamp(int(timestampString)).strftime('%Y-%m-%d %H:%M:%S') lat = "52.9" lon = "8.58" appId = "xyz" weatherUrl = 'http://api.openweathermap.org/data/2.5/weather?lat=' + lat + '&lon=' + lon + '&lang=de&units=metric&appid=' + appId cad = pifacecad.PiFaceCAD() cad.lcd.backlight_on() cad.lcd.cursor_off() cad.lcd.blink_off() valueChanged = True currentSelection = 0 # Abbruch wenn Rocker gedrückt wird while cad.switches[5].value != 1: if valueChanged: jsonFile = urlopen(weatherUrl) jsonFileContent = jsonFile.read().decode('utf-8') jsonObject = json.loads(jsonFileContent) temperature = jsonObject['main']['temp'] humidity = jsonObject['main']['humidity'] pressure = jsonObject['main']['pressure'] weather = jsonObject['weather'][0]['description'].encode('ascii', 'ignore').decode('ascii') windDirection = jsonObject['wind']['deg'] windSpeed = jsonObject['wind']['speed'] sunRise = jsonObject['sys']['sunrise'] sunSet= jsonObject['sys']['sunset'] print print("{}: {} {}".format("Temperatur", temperature, "Grad")) print("{}: {} {}".format("Luftfeuchtigkeit", humidity, "%")) print("{}: {} {}".format("Luftdruck", pressure, "hPa")) print("{}: {}".format("Wetterlage", weather)) print("{}: {} {}".format("Wind-Richtung", windDirection, "Grad")) print("{}: {} {}".format("Wind-Geschwindigkeit", windSpeed, "km/h")) print("{}: {} {}".format("Sonnenaufgang", formatTimestamp(sunRise), "Uhr")) print("{}: {} {}".format("Sonnenuntergang", formatTimestamp(sunSet), "Uhr")) print cad.lcd.clear() if currentSelection == 0 : cad.lcd.write("{}\n{} {}".format("Temperatur", temperature, "Grad")) if currentSelection == 1 : cad.lcd.write("{}\n{} {}".format("Luftdruck", pressure, "hPa")) if currentSelection == 2 : cad.lcd.write("{}\n{} {}".format("Luftfeuchtigkeit", humidity, "%")) if currentSelection == 3 : cad.lcd.write("{}\n{} {}".format("Wind",windSpeed, "km/h")) if currentSelection == 4 : cad.lcd.write("{}\n{}".format("Wetterlage", weather)) oldSelection = currentSelection if cad.switches[0].value == 1 : currentSelection = 0 if cad.switches[1].value == 1 : currentSelection = 1 if cad.switches[2].value == 1 : currentSelection = 2 if cad.switches[3].value == 1 : currentSelection = 3 if cad.switches[4].value == 1 : currentSelection = 4 valueChanged = oldSelection != currentSelection sleep(1) cad.lcd.clear() cad.lcd.backlight_off()
Das Skript der kleinen Wetterstation möchte ich natürlich nicht manuell starten, sondern es soll automatisch im Hintergrund ausgeführt werden, sobald der Raspberry Pi hochfährt. Dazu muss man lediglich in der Datei /etc/rc.local
vor der letzten Exit-Zeile unser Skript eintragen:
#!/bin/bash -e # # rc.local for raspimjpeg # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi /home/pi/piface/piface-weather.py & exit 0
Die Openweathermap-API bietet noch viele weitere Abfragen, beispielsweise zu UV-Werten und Wettervorhersagen. Es gibt also immer weitere kleine Aufgaben zu erledigen, wenn man einen Raspberry Pi hat.