Original-URL des Artikels: https://www.golem.de/news/mitmachprojekt-temperatur-messen-und-senden-mit-dem-raspberry-pi-1604-120188.html    Veröffentlicht: 20.04.2016 09:01    Kurz-URL: https://glm.io/120188

Mitmachprojekt

Temperatur messen und senden mit dem Raspberry Pi

Mit wenigen Handgriffen und günstigen Bauelementen lässt sich ein Raspberry Pi in eine Temperatur-Messstation verwandeln. Wir zeigen, wie das funktioniert.

Wer in der wunderbaren Welt der Elektronikspielereien noch neu ist, für den ist der Raspberry Pi ein praktisches Werkzeug für erste Experimente. Und dabei lässt sich sogar auf eine Software-Neuinstallation verzichten. In unserer Anleitung zeigen wir, wie mit einem Sensor die Temperatur gemessen und der Wert an einen Internetserver übermittelt wird; mit Hilfe einer LED werden mögliche Fehler angezeigt. Mit dem fertigen Aufbau kann der Leser an unserem großen Projekt zur Messung der Bürotemperatur teilnehmen.

Die erste Voraussetzung ist natürlich ein Raspberry Pi - welches Modell, spielt dabei keine Rolle, allerdings sollte es eine Verbindung zum Internet haben, sei es per Ethernet oder WLAN. Die Liste der erforderlichen Bauelemente ist kurz, es gibt sie für wenig Geld bei allen Elektronikhändlern:



Die GPIO-Leiste verwenden

Die Bauelemente werden wir mit den GPIO-Pins des Raspberry Pi verbinden. Damit hier keine Verwechslungen auftreten, sind die Pins nummeriert. Zum besseren Verständnis des Systems ist es hilfreich, den Raspberry Pi so vor sich zu legen, dass sich die GPIO-Leiste rechts oben befindet. Der oberste Pin links ist Pin 1, rechts davon auf der Außenseite befindet sich Pin 2. Unterhalb von Pin 1 befindet sich auf der Innenseite Pin 3, rechts davon Pin 4 und so weiter.

In einigen Fällen wird zur Identifizierung und Ansprache der Pins allerdings nicht die physische Nummerierung verwendet, sondern deren Bezeichnung entsprechend der Prozessordokumentation. Dem Namen der Pins wird ein GPIO vorangestellt, gefolgt von einer Nummer. Die Nummer entspricht in einigen Fällen der physischen Nummerierung des Pins, aber nicht immer. So ist zum Beispiel der Pin mit der physischen Nummer 7 der Pin GPIO04. Bei Bauanleitungen und in Softwareprogrammen muss also stets darauf geachtet werden, ob bei Pin-Angaben die physische Position oder die GPIO-Bezeichnung gemeint ist. Eine Übersichtsgrafik der Pins gibt es auf der Raspberry-Pi-Webseite.

Das Steckbrett vorbereiten

Ein Steckbrett verfügt am Rand üblicherweise über zwei Leisten, die jeweils mit einer roten und einer blauen, manchmal auch schwarzen Linie markiert sind. Die Leiste mit der blauen Linie verbinden wir mit dem Masse-Anschluss des Raspberry Pi. Der befindet sich an Pin 6, dem dritten Pin an der Außenseite. Die Leiste mit der roten Linie wird mit dem Pin 1 des Raspberry Pi verbunden, wo es eine 3,3-Volt-Versorgung bereitstellt.

Den DS18B20 benutzen

Als Erstes wird der Temperatursensor mit dem Raspberry Pi verbunden. Das Bauelement DS18B20 wirkt zwar unscheinbar, ist aber tatsächlich ein kleiner Mikrochip. Er liefert uns die gemessene Temperatur über eine One-Wire-Datenleitung und ist äußerst populär. Wer eine Messstation mit externen Temperatursensoren besitzt, wie sie zum Beispiel auch für die Serverraumüberwachung verwendet wird, hat wahrscheinlich schon einige dieser Sensoren. Denn zu den Vorteilen des DS18B20 zählen die einfache Verfügbarkeit, eine standardisierte Anwendung und die unkomplizierte Auswertung.

Der Temperatursensor hat drei Beinchen. Wir betrachten den Sensor im Folgenden von vorn, von der flachen, bedruckten Seite her. Das linke Bein ist der Masse-Anschluss, im Englischen Ground genannt und meist mit GND abgekürzt. Am rechten Bein muss eine Spannung von 3,3 Volt angelegt werden. Das mittlere ist die eigentliche Datenleitung.

Den DS18B20 anschließen

Der DS18B20 wird wie in der Abbildung gezeigt in die Reihen auf das Steckbrett gesteckt. Die Reihe, in der das linke Beinchen steckt, wird mit der blau markierten Leiste mit Hilfe eines Kabels verbunden. Die Reihe mit dem rechten Beinchen verbinden wir mit dem der rot markierten Leiste. Die mittlere Reihe mit dem Beinchen der Datenleitung können wir direkt mit Pin 7 des Raspberry Pi verbinden, das ist der vierte Pin auf der Innenseite der GPIO-Leiste. Schließlich wird noch ein 4,7-kOhm-Widerstand in die mittlere und rechte Reihe gesteckt.

Die LED anschließen

Auch die LED stecken wir auf zwei Reihen auf das Steckbrett. Das je nach LED lange oder abgeknickte Beinchen (der Anode) verbinden wir mit dem Pin 11 des Raspberry Pi, dem sechsten Pin auf der Innenseite der GPIO-Leiste. Das eine Ende des 220-Ohm-Widerstands wird in die gleiche Reihe gesteckt wie das noch nicht verbundene, kurze Beinchen der LED (die Kathode), das andere Ende in eine freie Reihe. Diese wird mit der blau markierten Leiste per Kabel verbunden. Damit haben wir die Schaltung vollständig aufgebaut.

Raspberry Pi konfigurieren

Der Raspberry Pi unterstützt den DS18B20 mit Hilfe zweier Kernelmodule, die wir aber erst aktivieren müssen.

Zuerst wird in der Datei /boot/config.txt folgender Aufruf eingetragen:



Damit weiß Linux, dass der Pin GPIO04, gemeint ist hier der physische Pin 7, für die One-Wire-Kommunikation verwendet werden soll.

Als Nächstes fügen wir zwei Einträge in /etc/modules ein:



Die erste Zeile lädt das One-Wire-Kernel-Modul, die zweite ein Modul, das für die Auswertung des Temperatursensors zuständig ist. Jetzt müssen wir den Raspberry Pi neu starten.

Temperaturdaten auslesen

Das w1-therm-Kernelmodul legt für unseren Temperatursensor ein Verzeichnis in /sys/bus/w1/devices an. Der Name dieses Verzeichnisses entspricht der eindeutigen ID des Sensors. Sie - und damit auch der Verzeichnisname - ist unveränderlich. Bei unserem Sensor lautet diese 28-01146403b1ff. Innerhalb des Verzeichnisses existiert ein Dateiobjekt mit dem Namen w1_slave. Diese virtuelle Datei liefert uns die Temperatur. So können wir einen kleinen Test auf der Kommandozeile durchführen.



Die Temperatur befindet sich am Ende der zweiten Zeile und muss noch durch 1000 geteilt werden. Außerdem ist die angegebene Genauigkeit illusorisch. Der Wert sollte auf die erste Stelle nach dem Komma gerundet werden.

Temperaturdaten übermitteln

Um die Temperatur an einen Server zu übermitteln, schreiben wir ein Python-Skript. Es liest die Ausgabe der w1_slave-Datei, extrahiert die Temperaturangabe und übermittelt sie an den Golem.de-Server. Das vollständige Skript steht auf Github zur Verfügung.

Das Skript beginnt mit der Deklaration der erforderlichen Python-Module und der Angabe der ermittelten Sensor-ID und des Pfades:

import re, os, urllib2 import RPi.GPIO as GPIO sensorid = "28-01146403b1ff" sensorpfad = "/sys/bus/w1/devices/%s/w1_slave" % sensorid

Über das urllib2-Modul werden wir die Datenübertragung durchführen, das Rpi.GPIO-Modul gestattet uns den Zugriff auf die GPIO-Pins des Raspberry Pi. Am Ende des Skriptes befindet sich unser Hauptprogramm:

if __name__ == '__main__': GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(pin_led, GPIO.OUT) temp = lies_temp(sensorpfad) if None != temp: send_temp(temp)

Mit GPIO.setmode(GPIO.BOARD) legen wir fest, dass zur Adressierung der GPIO-Pins deren physische Nummern verwendet werden. GPIO.setup(pin_led, GPIO_OUT) weist den Prozessor an, den mit pin_led bezeichneten Pin mit Strom zu versorgen, wenn wir das wünschen. Danach rufen wir unsere selbst geschriebene Funktion lies_temp() auf, um die Temperatur zu ermitteln. War das erfolgreich, dann versenden wir den Wert mit der eigenen Funktion send_temp().

LED an- und ausschalten

In lies_temp() lesen wir die oben ermittelte Datei aus und extrahieren die Temperatur. Tritt dabei ein Fehler auf, leuchtet die LED auf.

def lies_temp(pfad): temp = None try: datei = open(pfad, "r") zeile = datei.readline() ... except IOError: print "Konnte Sensor nicht lesen" GPIO.output(pin_led, GPIO.HIGH) return temp

Die LED leuchtet, wenn an dem betreffenden Pin eine Spannung durch den Prozessor angelegt wird. Das erreichen wir mit dem Aufruf GPIO.output(pin_led, GPIO.HIGH). Soll die LED wieder ausgeschaltet werden, muss stattdessen die Konstante GPIO.LOW übergeben werden.

Eine URL aufrufen

Schließlich muss noch die Temperatur übermittelt werden. Dazu packen wir die Temperatur als Parameter in eine URL und rufen diese URL mit einer HTTP-GET-Anfrage auf. Treten dabei wieder Probleme auf, so leuchtet die LED ebenfalls auf:

def send_temp(temp): send_url = url % temp try: result = urllib2.urlopen(send_url); except urllib2.HTTPError as error: print error.code, error.reason GPIO.output(11, GPIO.HIGH)

Die URL send_url wird in der Funktion aus zwei Teilen zusammengebaut: dem vordefinierten Rumpf in der Variablen url und dem Temperaturwert. Der Rumpf wurde am Anfang des Skriptes definiert. Wie diese Rumpf-URL aufgebaut ist, kann der technischen Dokumentation unseres Messprojekts entnommen werden. Teil der Dokumentation ist auch ein Formular, um sich die URL einfach zusammenzuklicken. Für die Rumpf-URL ist es wichtig, dass der Servername enthalten ist und die Temperatur eingefügt wird.

Die eigentliche HTTP-Anfrage wird mit der Funktion urllib2.urlopen durchgeführt. Sie liefert die Serverantwort zurück. Da aber unser Server im Erfolgsfall keine weitere Rückgabe liefert, müssen wir diese Antwort nicht weiter auswerten. Tritt bei der Verarbeitung ein Fehler auf, wird das durch das Except-Konstrukt abgefangen und der Fehler ausgegeben.

Regelmäßig messen

Damit ist unser Skript fertig, und wir können es auf der Kommandozeile aufrufen. Dabei ist zu beachten, dass im Erfolgsfall keinerlei Ausgaben erfolgen. Doch es soll auch regelmäßig automatisch aufgerufen werden. Das können wir dem Betriebssystem überlassen, wofür wir lediglich einen Cronjob anlegen müssen. Dazu wird auf der Kommandozeile crontab -e aufgerufen. Unter Umständen fragt das Programm als Erstes, welches Programm zum Bearbeiten verwendet werden soll.

Ist die Datei geöffnet, wird Folgendes auf einer Zeile eingetragen:

Unter _Skript-Pfad_ sind der Pfad und der Name des Skriptes einzutragen. Die Anweisung besagt, dass alle 30 Minuten rund um die Uhr das Skript aufgerufen werden soll. Ist diese Anweisung der einzige Eintrag in der Datei, muss nach dem Eintrag unbedingt noch eine Leerzeile folgen. Jetzt muss die Datei nur noch gespeichert werden, und die regelmäßige Messung läuft sofort an.

Jetzt zum Freizeitforscher werden

Mit dem Schaltungsaufbau und dem regelmäßigen Skriptaufruf ist alles vorhanden, um an unserem großen Projekt teilzunehmen: Wie warm ist es in euren Büros?. Wir hoffen, dass möglichst viele Bastler mitmachen - jetzt vielleicht auch du?

In dieser Artikelserie sind bereits erschienen:

  • ESP8266


  •  (am)


    Verwandte Artikel:
    Raspad: Raspberry Pi kommt ins Bastel-Tablet-Gehäuse   
    (06.03.2018, https://glm.io/133180 )
    Android-App für Raspberry programmieren: werGoogelnKann (kann auch Java)   
    (23.08.2017, https://glm.io/129559 )
    Mitmachprojekt: HTTPS vermiest uns den Wetterbericht   
    (10.08.2017, https://glm.io/129378 )
    Mitmachprojekt: Frostbeulen, zieht nach Österreich!   
    (08.03.2017, https://glm.io/126288 )
    Mitmachprojekt: Temperatur messen und senden mit dem Arduino   
    (21.04.2016, https://glm.io/120189 )

    © 1997–2019 Golem.de, https://www.golem.de/