In „Klimadaten mit dem Raspberry Pi“ bauen Sie mit einem preisgünstigen Raspberry Zero eine Mini-Wetterstation auf. Gemessen werden Temperatur, relative Luftfeuchte und Luftdruck. Die Daten werden an einen Webservice übertragen und sind dann im Internet einsehbar. Als Sensoren kommen der DHT22 für Temperatur und Feuchte sowie ein BMP280 für den Druck zum Einsatz. In diesem Blog gibt es bereits Anleitungen für den DHT22, die aber nur teilweise mit dem neuen RaspiOS getestet sind. Daher finden Sie hier quasi eine Neuauflage. Zudem werden die Daten nun auf einen Server im Internet geschickt. Im Grundsatz beruht das Vorhaben auf dem Konzept des hohlen Baumstamms.
Auslöser für diese Anleitung ist ein Vorhaben „Stadt Land Fluß revisited“ des Lise Meitner Gymnasiums in Willich Anrath.
Zu einem Vergleich der Anbringung von Temperatursensoren gibt es erste Messergebnisse: Klimadaten im Vergleich – Temperatursensor im oder am Gehäuse
Stand 12.03.2022
Das benötigen Sie
- Einen Raspberry Pi Zero WH Version 1.1
(Wenn Sie einen Pi 4 oder Zero 2 verwenden wollen, schauen Sie sich bitte die Hinweise unten auf der Seite an) - Ein 5V-Netzteil
- Ein Breadboard
- Ein paar Kabel m-m und w-m
- Einen Feuchtesensor DHT22
- Einen Luftdrucksensor BME280
- Einen WLAN-Zugang (einfaches WLAN, kein Enterprise Network)
- Einen Rechner (Windows, MacOS, Linux)
- Einen Texteditor mit Syntax Highlighting (Sublime Text, Notepad++)
Aufsetzen des Raspberry Pi Zero
Anmerkung: Im Schülerworkshop erhalten Sie eine bereits vorbereitete Micro-SD-Karte und können diesen Abschnitt überspringen – gehen Sie gleich zu „Die SD-Karte für den headless-Betrieb“ vorbereiten„. Wenn Sie später noch einmal alleine das Aufsetzen nachvollziehen wollen, finden Sie in den folgenden Zeilen die Anleitung dazu.
Das Betriebssystem herunterladen
Die Mini-Wetterstation soll headless – also ohne Monitor und Tastatur – laufen, somit verzichten Sie auf eine grafische Benutzungsoberfläche.
Für den Raspberry Zero Version 1.x benötigen Sie die 32-Bit-Version des RaspiOS. Laden Sie sie herunter von
https://www.raspberrypi.com/software/operating-systems/
Scrollen Sie bis „Raspberry Pi OS with desktop and recommended software Release date: January 28th 2022 System: 32-bit“ (Das Release Datum kann sich geändert haben).
Das Betriebssystem auf SD-Karte „brennen“
Hierzu haben Sie mehrere Möglichkeiten.
Wenn Sie gern im Terminal auf einem Macbook arbeiten, folgen Sie der Anleitung unter https://cbrell.de/blog/raspilab-wetterstation-grundsystem-aufsetzen/.
Unter Linux (z.B. Raspberry Desktop / Debian) geht es mit der Befehlsfolge
df -h sudo umount /dev/sdb1 sudo dd if=<name des Images.img> of=/dev/sdb1 bs=4M
Dabei zeigt Ihnen der Befehl df -h die richtige Bezeichnung für Ihre SD-Karte an, das muss nicht zwingend sdb1 sein.
Wenn Sie lieber Werkzeuge mit grafischer Benutzungsoberfläche verwenden, haben Sie diese drei Möglichkeiten, die SD-Karte zu brennen:
- Raspberry Pi Imager
OS: Windows, Linux, macOS
Funktionen: Schreiben eines Images
Dateiformate: .img
Download: https://www.raspberrypi.com/software/ - balenaEtcher
OS: Windows, Linux, macOS
Funktionen: Schreiben eines Images, Klonen eines Images Dateiformte: .img
Download: https://www.balena.io/etcher/ - ApplePiBaker
OS: macOS
Funktionen: Schreiben eines Images, Erstellen eines Images, Klonen eines Images
Dateiformate: .img, .7zip, .zip
Download: https://www.tweaking4all.com/software/macosx-software/applepi-baker-v2/
Die SD-Karte für den „headless-Betrieb“ vorbereiten
Praktisch ist es wenn sich der Raspberry nach dem Start gleich in Ihr WLAN einwählt und Sie mit ssh und der Konsole darauf arbeiten können.
Stecken Sie die SD-Karte in Ihren PC (oder Mac), dann sehen Sie eine Partition mit Namen „boot“. Diese Partition kann von Linux, Mac und Windows beschrieben werden und enthält alle Dateien für den Start des Raspberrys.
Verwenden Sie nun einen Texteditor, der „flache“ Textdateien erzeugt. Word oder Pages (Mac) sind ungeeignet. Gut sind Editoren mit Syntax-Highlighting und Zeilennummern wie „Sublime Text“ (Mac + PC) oder „Notepad++“ (nur PC).
Erzeugen Sie in „boot“ eine (leere) Datei mit Namen „ssh“. Dadurch können Sie später mit ssh über das WLAN auf den Raspberry zugreifen.
Achtung: Im Workshop Lise Meitner ist bereits ein temporäres WLAN eingestellt, Überspringen Sie diesen Schritt und fahren Sie mit „Der erste Start“ fort.
Erzeugen Sie in „boot“ eine Datei mit Namen „wpa_supplicant.conf“. Dadurch kennt der Raspberry Ihr WLAN und kann sich einwählen. In der Datei soll stehen (Zeilenumbrüche sind wichtigAchtung: Das funktioniert nicht in einem Firmennetzwerk (enterprise network).
country=DE ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="wlan-bezeichnung" psk="passwort" key_mgmt=WPA-PSK }
Der erste Start
Stecken Sie die SD-Karte in den Raspberry und schließen Sie das Netzteil an.
In der Administrationsoberfläche Ihres Routers finden Sie nach etwa 100 Sekunden die IP-Adresse.
Sie wird die Form 192.168.x.y haben. x ist oft 0,1 oder 2, y kann Werte bis 255 annehmen.
Wenn Sie ein Macbook oder einen Linux-Rechner haben, verwenden Sie ein Terminal mit
ssh pi@<Ihre IP-Adresse>
Sie werden nach dem Passwort gefragt: Geben Sie „raspberry“ ein.
Das funktioniert auf Mac, unter Linux und auch sehr gut unter Windows 10. Ebenso können Sie auf Windows die Software PuTTY verwenden, die Sie unter https://www.putty.org/ finden – das ist aber nicht erforderlich.
Lebensdauer der SD-Karte verlängern
Anmerkung: In Schülerworkshops erhalten Sie eine SD-Karte mit vorbereitetem Image (bzw. das vorbereitete Image zum Brennen), auf der die Schutz-Maßnahmen schon eingerichtet sind. Dann können Sie diesen Schritt überspringen.
Wenn Sie nur experimentieren wollen, können Sie auf die Lebensdauer-Verlängerung verzichten. Planen Sie, die Mini-Wetterstation mehrere Jahre zu betreiben, dann sind die Maßnahmen unumgänglich. Jeder Schreibzugriff verkürzt die Lebensdauer der SD-Karte. Kern der Maßnahmen sind also Reduzierung der Schreibzugriffe: Einrichtung einer Ramdisk für notwendige Schreibzugriffe, Vermeidung möglichst vieler Logging-Mechanismen. Das Vorgehen ist unter RaspiLab Wetterstation Zugriffe auf SD-Karte minimieren und Lebensdauer erhöhen beschrieben.
Verzeichnisse für die Sensoren einrichten
Um später einfach mit dem PC Programme ändern zu können, landen alle Programme und Konfigurationsdateien im Verzeichnis boot der SD-Karte.
Nach Abschluss aller Arbeiten werden Sie unter boot die folgenden Struktur vorfinden:
boot+ +-AA+ +-CONF+ | +sensor.txt +PY+ | +bmp.py | +dht.py | +transfer.py +SH+ +klima.sh
Abb. 1: Verzeichnisstruktur
Um auf dem Raspberry im Verzeichnis boot zu arbeiten, benötigen Sie root-Rechte und stellen schreibenden Befehlen „sudo“ voran.
Wechseln Sie in das Verzeichnis boot und schauen Sie sich die existierende Verzeichnisstruktur an mit
cd /boot ls
Legen Sie, wenn nicht vorhanden, AA an (damit können Sie später einfach alle Dateien „in einem Rutsch“ sichern).
sudo mkdir AA
Wechseln Sie in AA
cd AA
legen Sie die restlichen Verzeichnisse an, wenn nicht vorhanden
sudo mkdir CONF sudo mkdir PY sudo mkdir SH
Feuchtesensor DHT22 einrichten
Anmerkung: In Schülerworkshops erhalten Sie eine SD-Karte, auf der der DHT22 schon eigerichtet ist. Dann können Sie diesen Schritt überspringen und gleich mit dem Anschluss und den Tests beginnend mit „Feuchtesensor anschließen“ fortfahren.
Bibliothek installieren
Für den DHT22 gibt es eine neuere Bibliothek, die wiederum Python3 erfordert. Für die Installation benötigen Sie einen Python-Paketmanager mit Namen pip. Wechseln Sie wieder in das Nutzerverzeichnis /home/pi. Die Bibliothek richten Sie ein mit
sudo pip3 install --user Adafruit_DHT
Nach der Einrichtung sehen Sie die Bibliothek im pi-Nutzerverzeichnis.
Feuchtesensor anschließen
Für den Feuchtesensor benötigen Sie 3,3V, Masse und eine Datenleitung. Die Datenleitung schließen Sie an GPIO 17 = Anschluss 11 an die Pin-Leiste des Raspberrys an. Die Zählung beginnt an der SD-Karten-Seite.
Raspberry Pi Pinbelegung # SD-Karten-Seite +------------+------+-----+-------+------+---- | GPIO|Pin|Pin| | +============+======+=====+=======+------+----- | +VCC |3,3V. | | 1 | 2 | | 5 V +------------+-------+----+-------+------+----- | | SDA1| 2 | 3 | 4 | |5 V +------------+------+-----+---+---+------+----- | | SCL1| 3 | 5 |..... +------------+------+-----+---+-- | |GPCLK0| 4 | 7 | +------------+------+-----+---+-- | |GND | | 9 | +------------+------+-----+---+-- |DHT22 |CE1_1 |17 |11 | +------------+------+-----+---+--
Abb. 2: Bedeutung der GPIO-Pins am Raspberry
Abb. 3 zeigt die Beschaltung des DHT22. Der Widerstand mit 4,7 Kilo-Ohm ist ein sogenannter Pull-Up-Widerstand und sorgt dafür, dass am Anschluss „Signal GPIO“ eine definierte Spannung anliegt. Es funktioniert auch mit einem Widerstand von 5,6 Kilo-Ohm.
Abb. 3: Beschaltung des DHT22
Abb. 4 zeigt das komplett bestückte Steckbrett mit DHT22, BMP280 und Widerständen. Die Spannungsversorgung (VCC) der Sensoren erfolgt über einen 75 Ohm Widerstand, das verhindert meist einen Defekt, falls eine Kabel vertauscht wird. Führen Sie die Verkabelung in zwei Schritten durch: Erst DHT22, dann DHT22 testen, dann BMP280.
Abb.4: Verkabelung des DHT22 und des BMP280 auf dem Steckbrett. Der Raspberry wird durch ein einfaches Haushalts-Gummi fixiert.
Abb. 5: Details Sensoren
Abb. 5 zeigt Details der Anschlüsse der Sensoren. Die Steckbretter haben Nummern, der weiße DHT22 ist an den Nummern 30 (VCC), 31 (Daten), 32 (nichst) und 33 (Masse) eingesteckt, der BMP280 an den Nummern 20, 21 (nicht benutzt), 22, 23 (für IC2), 24 (Masse) und 25 (VCC)
Abb. 6: Verkabelung am Raspberry
Bei dem Steckbrett sind die Anschlüsse am Rand blau und rot miteinander verbunden. Die anderen Anschlüsse sind senkrecht dazu verbunden und nummeriert.
Am Raspberry werden die Anschlüsse 1,3,5, 9 und 11 verwendet (Abb. 6 und Abb. 7).
Raspi Kabelfarbe Nr. Stechbrett Bedeutung --------------------------------------------- 1 orange 35 zum 75 Ohm Vorwiderstand 3 grün 22 SDA des BMP280 (Daten I2C) 5 blau 23 SLC des BMP280 (Daten I2C) 9 Masse blaue Randleiste 11 gelb 31 DHT22 Datenleitung, Pull-Up-Widerstand 5,6k zwischen VCC und 31 Vorwiderstand 75 Ohm zwischen 35 und roter Randleiste Erster Test des Feuchtesensors
Abb. 7: Verbindungen zwischen Raspberry und Steckbrett
Feuchtesensor interaktiv ausprobieren
In Ihrem Nutzerverzeichnis /home/pi sehen Sie mit dem Befehl
ls
die Dateien wie in Abb. 8
pi@weatherstation:~ $ ls Adafruit_Python_DHT bme280.py DHT22_PI4.py DHT22_ZERO.py __pycache__ pi@weatherstation:~ $
Abb. 8 Dateien in /home/pi
Für den ersten Test verwenden Sie Python interaktiv im Terminal. Nacheinander geben Sie ein: python (ruft Python interaktiv auf), import … (bindet Bibliothek ein), Aufruf der Bibliotheksfunktion Adafruit_DHT.read_retry (fragt Sensor bis zu 15 mal ab, 17 ist die GPIO-Nummer), print (gibt die Daten im Terminal aus), exit (verlässt Python wieder). Der Dialog mit den vollständigen Aufrufen sieht wie in Abb. 9 aus.
pi@weatherstation:~ $ python Python 3.9.2 (default, Mar 12 2021, 04:06:34) [GCC 10.2.1 20210110] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import Adafruit_DHT >>> hum, temp = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 17) >>> print (hum, temp) 56.400001525878906 11.5 >>> exit() pi@weatherstation:~ $
Abb. 9: Reihenfolge der Python-Befehle, um den DHT22 auszulesen.
Anstatt die Befehle interaktiv einzugeben, können Sie sich auch in eine Datei mit der Endung .py schreiben wie im nächsten Schritt.
Python-Programm für den Feuchtesensor DHT22
DHT22 Programm Stufe eins
Das Python-Programm soll den Namen dht.py bekommen. Wechseln Sie in das Verzeichnis /boot/AA/PY und legen Sie mit dem Editor nano die Datei dht.py an.
cd /boot/AA/PY sudo nano dht.py
Schreiben Sie den Quelltext aus Abb. 10 ab. Wichtig dabei ist:
- Groß / Kleinschreibung ist entscheidend
- Python regiert empfindlich auf Einrückungen
#!/usr/bin/python # -*- coding: iso-8859-1 -*- # dht.py # misst Temperatur und rel. Luftfeuchte # 01.03.2022 # Import für den Sensor import Adafruit_DHT # Import für Dateioperationen: import os # Import Zeitfunktionen import time print ("--- Ich bin dht.py und messe Temperatur und Feuchte ---") # Variable gpiopin auf Anschluss 13 setzen gpiopin=17 # Bibliothek nutzen # Vor-Lesen, da unzuverlässig hum, temp = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, gpiopin) # Testausgabe print("1: Temperatur: {:.1f} °C rel. Luftfeuchte: {:.1f} %".format(temp, hum))
Abb. 10: Erstes Auslesen des DHT22 – Python Quellcode
Speichern Sie das Programm mit der Tastenkombination STRG+o und ENTER. Verlassen Sie nano mit der Tastenkombination STR+x. Da das Programm in der FAT32 Partition der SD-Karte liegt, geben Sie nicht mit chmod 777 dht22.py die Ausführungsrechte.
Testen Sie das Programm mit
./dht.py
DHT22 Programm Stufe Zwei
Das Programm soll nun die Feuchtedaten in die Ramdisk in eine Date dht.txt schreiben, damit die Daten später weiter verwendet werden können. Laden Sie dazu Ihr Programm in den Editor und vervollständigen Sie es, so dass es wie in Abb. 11 aussieht:
#!/usr/bin/python # -*- coding: iso-8859-1 -*- # dht.py # misst Temperatur und rel. Luftfeuchte # 01.03.2022 # Import für den Sensor import Adafruit_DHT # Import für Dateioperationen: import os # Import Zeitfunktionen import time print ("--- Ich bin dht.py und messe Temperatur und Feuchte ---") # Variable gpiopin auf Anschluss 13 setzen gpiopin=17 # Bibliothek nutzen # Vor-Lesen, da unzuverlässig hum, temp = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, gpiopin) # Testausgabe print("1: Temperatur: {:.1f} °C rel. Luftfeuchte: {:.1f} %".format(temp, hum)) # Sekunde warten time.sleep(2) hum, temp = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, gpiopin) print ("1: Temperatur: {:.1f} °C rel. Luftfeuchte: {:.1f} %".format(temp, hum)) # Daten vorbereiten (Ganzzahlwerte, Zeichenkette) hum=str(int(round(hum,0))) temp=str(int(round(temp*10,0))) # Daten in Ramdisk speichern print ("Dateien schreiben") dateiname ='/mnt/ramdisk/hum.txt' fh = open(dateiname,'w') fh.write(hum) fh.close dateiname='/mnt/ramdisk/temp.txt' fh = open(dateiname,'w') fh.write(temp) fh.close print ("Beendet")
Abb. 11: Auslesen des DHT22 und speichern der Messwerte – Python Quellcode
Testen Sie das Programm erneut. Es sollte nun in der Ramdisk eine Datei dht.txt angelegt haben. Überprüfen Sie das mit
ls /mnt/ramdisk
schauen Sie sich den Inhalt der Datei an mit
cat /mnt/ramdisk/dht.txt
Drucksensor BMP280 einrichten
Anmerkung: Die vollständige Einrichung ist unter RaspiLab Wetterstation sechste Mission Druck messen mit dem BMP280 beschrieben. Das benötigen Sie nur, wenn Sie einen Raspberry ganz neu aufsetzen. In den Schülerworkshops sind die erforderlichen Bibliotheken schon geladen, Sie müssen hier nur noch den konkreten Sensor anpassen.
Testen Sie, ob der Sensor angeschlossen ist mit
i2cdetect -y 1
Die Ausgabe sollte wie folgt aussehen:
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
Abb. 12: I2C Kennung
Überprüfen Sie mit
nano bme280.py
ob in der Datei bme280.py die richtige DEVICE-Adresse eingetragen ist. Die Zeile
DEVICE = 0x76 # Default device I2C address
sollte die mit i2cdetect ermittelte Zahl (hier 0x76) adressieren. Ggf. ändern Sie das.
Erster Test des Drucksensors
Mit einem Aufruf von bme280.py sehe Sie die ersten Ausgaben des Sensors wie in Abb. 14
pi@weatherstation:~ $ bme280.py Chip ID : 88 Version : 0 Temperature :4.86 C Pressure :1018.4934962943406 hPa Humidity :0.0 % pi@weatherstation:~ $
Abb. 14 : Nutzung des BMP280 mit einem Python-Programm
Bibliotheksfunktion ins Zielverzeichnis
Die Datei bme280.py beinhaltet die Bibliotheksfunktionen, in einem weiteren Schritt werden Sie die Datei in Ihrem eigenen Programm einbinden.
Alle Python-Programme sollen in das Verzeichnis /boot/AA/PY. Kopieren Sie also die Bibliotheksfunktionen in das Verzeichnis mit
sudo cp /home/pi/bme280.py /boot/AA/PY/bme280.py
Python-Programm für den Drucksensor BMP280
BMP280 Programm Stufe eins
Das Python-Programm soll den Namen bmp.py bekommen. Wechseln Sie in das Verzeichnis /boot/AA/PY und legen Sie mit dem Editor nano die Datei bmp.py an.
cd /boot/AA/PY sudo nano dht.py
Schreiben Sie den Quelltext in Abb. 15 ab.
#!/usr/bin/python # -*- coding: iso-8859-1 -*- # bmp.py # misst Druck und Temperatur # 01.03.2022 # Import für den Sensor import bme280 # Import für Dateioperationen: import os print ("--- Ich bin bmp.py und messe Druck ---") # Bibliothek nutzen und Daten abholen temp,pres,hum =bme280.readBME280All() # Testausgabe print("Temperatur: {:.1f} °C Druck: {:.1f} mbar".format(temp, pres))
Abb. 15: Auslesen des BMP280 – Python Quellcode
Speichern Sie das Programm mit der Tastenkombination STRG+o und ENTER. Verlassen Sie nano mit der Tastenkombination STR+x.
Testen Sie das Programm mit
./bmp.py
BMP280 Programm Stufe zwei
Das Programm soll nun den Luftdruck in die Ramdisk in eine Date bmp.txt schreiben. Laden Sie dazu Ihr Programm in den Editor und vervollständigen Sie es wie in Abb. 16.
#!/usr/bin/python # -*- coding: iso-8859-1 -*- # bmp.py # misst Druck und Temperatur # 01.03.2022 # Import für den Sensor import bme280 # Import für Dateioperationen: import osprint ("--- Ich bin bmp.py und messe Druck ---") # Bibliothek nutzen und Daten abholen temp,pres,hum =bme280.readBME280All() # Testausgabe print("Temperatur: {:.1f} °C Druck: {:.1f} mbar".format(temp, pres)) # Daten vorbereiten (Ganzzahlwerte, Zeichenkette) pres=str(int(round(pres,0))) temp=str(int(round(temp*10,0))) # Daten in Ramdisk speichern print ("Datei schreiben") dateiname ='/mnt/ramdisk/pres.txt' fh = open(dateiname,'w') fh.write(pres) fh.close dateiname='/mnt/ramdisk/temp2.txt' fh = open(dateiname,'w') fh.write(temp) fh.close print ("Beendet")
Abb. 16: Auslesen des BMP280 und speichern der Messwerte
Speichern und testen Sie das Programm erneut. Es sollte nun in der Ramdisk eine Datei bmp.txt anlegen. Überprüfen Sie das mit
ls /mnt/ramdisk
schauen Sie sich den Inhalt der Datei an mit
cat /mnt/ramdisk/bmp.txt
Klimadaten ins Internet
Internet-Übertragung vorbereiten
Zukünftig werden mehrere Mini-Wetterstationen Daten auf den Internet-Server schicken. Damit Sie Ihren Sensor wiederfinden, benötigen Sie eine (sechsstellige) Sensorkennung. Damit nicht beliebige Daten auf dem Server landen, gibt es für jede Sensorkennung einen geheimen Upload-Code.
Schülerinnen und Schüler in den Workshops erhalten die Kennungen in Papierform. Eine Kennung mit Upload-Code ist freigegeben und kann von allen genutzt werden.
Weiterhin sind die Koordinaten der Mini-Wetterstation nötig, um Wetterdienstdaten anbinden zu können. Die GPS-Koordinaten Länge und reit werden mit 5 Nachkommstellen, aber ohne Punkt oder Komma angegeben.
Die Daten stehen in einer Datei sensor.txt im Verzeichnis /boot/AA/CONF
Legen Sie die Datei an mit
sudo nano /boot/AA/CONF/sensor.txt
und schreiben Sie Sensorkennung, Upload-Code, Breite und Länge in die Datei. Schreiben Sie alles in eine Zeile, trennen Sie die Daten mit einem Semikolon. Die Sensorkennung 100547 ist zum Test freigegeben, ebenso der upload-Code 124863. Statt der hier eingetragenen Koordinaten ermitteln Sie Ihre Koordinaten z.B. mit Google Maps und tragen sie ein. Mit den vorgestellten Daten funktioniert das System schon einmal …
100547;124863;5124613;653588 # SensorID;codeUp;lat;lon
Hinweis Lise Meitner Gymnasium: Sie erhalten vier weitere Sensorkennungen nur für das Lise Meitner
Koordinaten: Die Koordinaten stehen als Ganzzahl in der Datei. Nehmen Sie die Koordinaten aus Google Maps, runden Sie auf genau 5 Nachkommastellen und löschen Sie den Dezimaltrenner.
Client-Program zum Daten-Upload
Mit einem Python-Prgramm mit Namen transfer.py übertragen Sie nun die Daten aus den Textdateien in der Ramdisk an einen Webservice im Internet. Lege Sie dazu mit dem Editor nano das Programm im Verzeichnis /boot/AA/PY an mit
cd /boot/AA/PY sudo nano transfer.py
Schreiben Sie den Quelltext in Abb. 17 ab.
#!/usr/bin/python # -*- coding: iso-8859-1 -*- # transfer.py # Claus Brell 11.02.2021, 01.03.2022 # liest Messwerte aus Dateien und # und uebertraegt sie an einen Webservice # Import fuer Dateizugriff import os # Import fuer http Aufruf import requests print ("--- ich bin transfer.py (Datenübertragung) ---") # Variablen vorbelegen url="https://210301.de/klima/WS/upWS.php?x=" #Eigene Sensornummer etc lesen fh = open("/boot/AA/CONF/sensor.txt") zeilen=fh.readlines() sensorparm=zeilen[0].rstrip() fh.close() print ("Sensor: ",sensorparm) # Daten aus den Messungen lesen # Temperatur fh = open("/mnt/ramdisk/temp.txt") zeilen=fh.readlines() temp=(zeilen[0].rstrip()) fh.close() print ("Temp: ",temp) # Feuchte fh = open("/mnt/ramdisk/hum.txt") zeilen=fh.readlines() hum=(zeilen[0].rstrip()) fh.close() print ("rel. Feuchte: ",hum) # Druck fh = open("/mnt/ramdisk/pres.txt") zeilen=fh.readlines() pres=(zeilen[0].rstrip()) fh.close() print ("Druck: ",pres) # Aufruf Webservice zusammenstellen url+=sensorparm+';'+temp+';'+hum+';'+pres r = requests.get(url) print ('Kontrolle URL: '+r.url) print(r)
Abb. 17: Übertragen der Daten auf den Internet-Server – Python Quellcode
Speichern Sie das Programm mit der Tastenkombination STRG+o und ENTER. Verlassen Sie nano mit der Tastenkombination STR+x.
Testen Sie das Programm mit
./transfer.py
Daten im Internet anschauen
Das Ergebnis sollten Sie gleich im Internet sehen können. Rufen Sie mit dem Browser die Seite auf:
https://210301.de/klima
Das Ergebnis sollte in etwa so aussehen wie in Abb. 18.
Abb.18: Wetterdaten der Mini-Wetterstation im Internet
Klimadaten mit dem Raspberry Pi automatisieren
Shellscript steuert alle Python-Programme
Mit einem Shell-Script verbinden Sie nun die drei Python-Programme, so dass eine Datenerfassung und ein Datentransfer mit einem einzigen Aufruf erfolgt. Das Shell-script soll den Namen klima.sh bekommen. Wechseln Sie in das Verzeichnis /boot/AA/SH und legen Sie mit dem Editor nano die Datei klima.sh an
cd /boot/AA/SH sudo nano klima.sh
Schreiben Sie den Quelltext aus Abb. 19 ab.
#!/bin/bash # Aufruf der Temperatur- und Feuchtemessung /boot/AA/PY/dht.py # Aufruf Druckmessung /boot/AA/PY/bmp.py # Aufruf Uebertragung an Webservice /boot/AA/PY/transfer.py
Abb. 19: Shellscript zur Steuerung der Python-Programme
Speichern Sie das Programm mit der Tastenkombination STRG+o und ENTER. Verlassen Sie nano mit der Tastenkombination STR+x.
Testen Sie nun den gesamten Ablauf mit
/boot/AA/SH/klima.sh
Sie sehen nacheinander die Ausgaben der einzelnen Python-Programme
Automatik mit CRON
Die Mini-Wetterstation soll nun automatisch alle 15 Minuten Klimadaten messen und ins Internet übertragen. Diese Aufgabe übernimmt CRON. CRON st ein Dienst, der zeitgesteuert Programme aufrufen kann. Sie können Einträge in CRON vornehmen mit
crontab -e
Tragen Sie am Ende der Datei Zeilen wie in Abb. 20 ein und speichern Sie.
# alle 15 Minuten Klimadaten abrufen */15 * * * * /boot/AA/SH/klima.sh # zweimal am Tag Neustart 5 12 * * * sudo shutdown -r now 5 0 * * * sudo shutdown -r now
Abb. 20: CRON-Einträge
Abschluss
Stellen Sie nun den gesamten Aufbau in ein geeignetes Gehäuse, in dem die Elektronik regengeschützt, aber mit Zugang zur Außenluft, untergebracht ist. Bewährt hat sich, in eine Kunststoff-Butterbrotdose, in eine passende Tupperware- oder – stabiler – eine Lock&Lock-Dose mit einem Förstner-Bohrer ein 3 cm Loch in den Boden zu bohren. Vier selbstklebende Filz- oder Silikonpads als Füßchen sorgen für eine ausreichende Belüftung.
Eingedrungenes Wasser kann abfließen, das Stromkabel für den Raspberry Pi können Sie ebenfalls durch das Loch führen.
Stellen Sie die Box und an eine schattige Stelle in den (Schul-) Garten, so dass der Raspberry noch WLAN-Empfang hat…
Viel Spaß beim Datensammeln.
##########################
(**) Wenn Sie Ihre Wetterstation realisiert haben und nun identische Kopien davon anfertigen wollen, finden Sie hier eine kleine Anleitung zum Verkleinern und Duplizieren des SD-Karten-Abbildes.
(*) Hinweis für die Übertragung auf Raspberry Pi 4 oder Raspberry Pi Zero V2
Diese Anleitung ist für den „alten“ Zero geschrieben – selbst dieser hat für die hier beschriebene Aufgabe eigentlich zuviel Rechenpower. Ein Raspberry Zero V2 wäre überdimensioniert. Außerdem hat sich bei den neuen Raspberrys Einiges geändert, so dass eine neue Anleitung erforderlich wäre. Es sollen hier lediglich ein paar Denkanstöße gegeben werden, eine detailiertere Aufbereitung folgt, wenn es keine alten Zeros mehr gibt:
Für Raspberry Pi 4 und Zero 2: sudo pip3 install --user adafruit-circuitpython-dht sudo nano /usr/local/sbin/dht22_pi4.py Testprogramm: Inhalt von /usr/local/sbin/dht22_pi4.py: #!/usr/bin/python3 import time, adafruit_dht, board # set the variable dht22gpiopin = 'D17' # Initial the dht device, with data pin connected to: dhtboard = getattr(board, dht22gpiopin) # you can pass DHT 22 use_pulseio=False if you don't want to use pulseio # this may be necessary on the Pi zero but will not work in # circuit python dhtDevice = adafruit_dht.DHT22(dhtboard, use_pulseio=False) # Standard is, but not working on the raspberry pi boards #dhtDevice = adafruit_dht.DHT22(dhtboard) try: # Print the values to the serial port temperature, humidity = dhtDevice.temperature, dhtDevice.humidity print("Temperature: {:.1f} °C Humidity: {:.1f} %".format(temperature, humidity)) except RuntimeError as error: # Errors happen fairly often, DHT's are hard to read, just keep going time.sleep(2.0) # Print the values to the serial port temperature, humidity = dhtDevice.temperature, dhtDevice.humidity print("Temperature: {:.1f} °C Humidity: {:.1f} %".format(temperature, humidity)) sudo chmod +x /usr/local/sbin/dht22_pi4.py sudo pip3 install --user adafruit-circuitpython-dht dht22_pi4.py