Klimadaten mit dem Raspberry Pi – Temperatur, Feuchte, Druck ins Internet

Bild: Ein Gehäuse für den Feuchtigkeitssensor aus dem 3D-Drucker

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

  1. 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)
  2. Ein 5V-Netzteil
  3. Ein Breadboard
  4. Ein paar Kabel m-m und w-m
  5. Einen Feuchtesensor DHT22
  6. Einen Luftdrucksensor BME280
  7. Einen WLAN-Zugang (einfaches WLAN, kein Enterprise Network)
  8. Einen Rechner (Windows, MacOS, Linux)
  9. 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:

  1. Raspberry Pi Imager
    OS: Windows, Linux, macOS
    Funktionen: Schreiben eines Images
    Dateiformate: .img
    Download: https://www.raspberrypi.com/software/
  2. balenaEtcher
    OS: Windows, Linux, macOS
    Funktionen: Schreiben eines Images, Klonen eines Images Dateiformte: .img
    Download: https://www.balena.io/etcher/
  3. 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.

Feuchtesensor DHT22 Beschaltung

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.

Bild Wetterstation auf Steckbrell

Abb.4: Verkabelung des DHT22 und des BMP280 auf dem Steckbrett. Der Raspberry wird durch ein einfaches Haushalts-Gummi fixiert.

Bild Wetterstation Details Sensoren

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)

Bild Details Anschlüsse Wetterstation Raspberry

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.

Screenshot Klimadaten im Internet

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

 

 

 

Teile diesen Beitrag.