Wir messen…..Temperaturen

Ab heute messen sind wir in der Lage Temperaturen mit dem Raspberry zu messen und diese zu protokollieren.

Die Schaltung hierfür ist wirklich simpel. Ich habe sie mit Fritzing mal „skizziert“.

DS18B20 Breadboard Skizze
DS18B20 Pin-Layout

Den DS18B20 Sensor mit 3,3V (PIN 1 am RPi / Pin 3 am DS18B20) und GND (Pin 6 am RPi und Pin 1 am DS18B20) versorgen. Die Datenleitung (Pin 2 am DS18B20) geht an den GPIO4 (PIN 7) am Raspberry. Um einen sauber definiertes Signal auf der Datenleitung (DQ) zu haben wird zwischen die Datenleitung und 3,3V ein 4,7KΩ Widerstand geschaltet

Möchte man, so wie ich, mehrere Temperaturen messen und benötigt mehrere Temperatursensoren, so kann man diese einfach parallel schalten, der Pullup-Widerstand wird nur einmal benötigt.

Normalerweise werden Devices auf dem 1-Wire-Bus mit einer Versorgungsspannung von 5V betrieben. Beim Raspberry muss man doch auf die verringerte Spannung von 3,3V zurückgreifen, da die GPIO-Schnittstellen nur diese 3,3V vertragen und durch höhere Spannungen unwiderruflich zerstört werden.

Nun zu den Dingen die wir an der Tastatur machen müssen…..

Als erste müssen wir die Kernelmodule nachladen, das geschieht mit

modprobe w1-gpio pullup=1
modprobe w1-therm

Wichtig ist der Parameter pullup=1, er gibt an, dass die parasitäre Speisung über den Pullup-Widerstand vorhanden ist.

Um zu sehen ob wir alles richtig verdrahtet haben und die Kernelmodule geladen wurden, geben wir nun folgendes ein:

ls -la /sys/bus/w1/devices

Sollte etwas ähnliches wie bei mir angezeigt werden

Auflistung der erkannten Temperatursensoren

Der Name der ersten beiden Verzeichnisse besteht aus dem „Family-Code“ der Sensoren und deren eindeutigen Identifikationsnummer. Sensoren vom Typ DS1820 und DS18S20 haben den Family-Code 10, DS18B20 den Code 28 und DS1822 den Code 22.

Ich nutze zwei Sensoren vom Typ DS18B20, meine verfügen über ein Anschlussleitung von 2m Länge und sind am Ende vergossen damit ich diese ins Erdreich stecken kann.

DS18B20 Wasserdicht mit 2m Anschlußleitung

Nun sind wir schon in der Lage den Sensor abzufragen und die gemessene Temperatur zu empfangen. Der Befehl dafür lautet folgendermaßen:

cat /sys/bus/w1/devices/28-0119278a81d4/w1_slave

den Teil der Sensor-ID müsst Ihr natürlich an Euren Sensor anpassen. Zurück bekommen wir dann sowas:

62 01 4b 46 7f ff 0c 10 92 : crc=92 YES
62 01 4b 46 7f ff 0c 10 92 t=22125

t=22125 ist die gemessene Temperatur. Damit kann man nun ja erstmal nicht soviel anfangen. Oder?

Es Bedarf ein wenig der Formatierung und dazu erstellen wir uns ein kleines Script. Das geht am einfachsten mit dem Befehl:

nano temp.sh

In die soeben erstelle Datei schreiben wir nun folgendes:

#! /bin/bash

# Umgebungsvariablen definieren
WDIR=/home/pi/tomatenpi/
ETCDIR=$WDIR/etc
OUTDIR=$WDIR/output

# Temperatur auslesen
tempread=`cat /sys/bus/w1/devices/28-0119278a81d4/w1_slave`

#Formatieren
temp=`echo "scale=1; "\`echo ${tempread##*=}\`" / 1000" | bc`

#Ausgabe auf der Konsole
echo "Die gemessene Temperatur beträgt" $temp "°C"

Schauen wir uns das Script mal etwas genauer an:

Ich arbeite gerne mit Umgebungsvariablen, da ich mir so im Laufe eines Scripts viel „Pfade-tipperei“ erspare und ich meine Scripte und Abläufe so gut Strukturen kann. Den Vorteil sehen wir später noch genauer.

Den Teil „Temperatur auslesen“ kennen wir schon, der ist unverändert.

Der Teil Formatieren bedarf vielleicht ein paar erklärende Worte:

scale = 1 -> damit kürzen wir die Ausgabe auf eine Stelle hinter dem Komma bzw. Punkt. Anschließend lesen wir den Wert der Variable $tempread ein und teilen diesen durch 1000 unter Zuhilfenahme des kommandozeilenbasierten Rechners „bc“. Das ganze wird in die Variable „temp“ verpackt

Sollte das Script nicht den gewünschten Erfolg bringen, dann muss das Paket bc nachinstalliert werden.

Der letzte Absatz des Scripts zeigt den nun formatierten Messwert auf der Konsole an, ergänzt um den Satz „Die gemessene Temperatur beträgt …°C.

Das sieht dann so aus:

pi@tomatenPi:~/tomatenpi/etc $ ./temp.sh 
Die gemessene Temperatur beträgt 22.0 °C

Soweit so gut, auf der Konsole haben wir den Messwert nun schonmal, aber um diesen weiterzuverarbeiten benötigen wir den Wert ja irgendwo abgespeichert.

Dazu muss lediglich eine Zeile ergänzt oder geändert werden. Aufgrund der einfacheren Fehlersuche, habe ich eine Zeile hinzugefügt und die Ausgabe auf der Konsole auskommentiert. So sieht das ganze dann aus:

# Ausgabe zu Testzwecken auf Konsole
#echo "Die gemessene Temperatur beträgt" $temp "°C" 

# Ausgabe in Datei
echo $temp > $OUTDIR/temp.txt # Ausgabe in Datei

Nun erfolgt die Ausgabe der Temperatur in die Datei temp.txt, ausgegeben wird nur der reine Temperaturwert, ohne Einheit (°C).

Damit ist der erste Teil des Projektes bereits erledigt. Im nächsten Teil widmen wir uns dem verarbeiten der Messwerte mit dem rrdtool.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert