Temperatursensor DS18B20
https://cdn-learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf
http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-Onewire/
Diese Beschreibung bezieht sich auf:
Raspberry Pi Model B Revision 2.0 (512MB) - Raspberry Pi (c)2011.12 Raspbian Jessie Lite - Release date 2017-04-10, Kernel version 4.4
Schaltungsaufbau
Hier wird die verkabelte Version mit dem Sensor im Stahlrohr verwendet. Da es verschiedene Ausführungen gibt, ist die Zuordnung der Kabelfarben zur Beschaltung entscheidend.
Meine Sensoren haben folgende Farben:
VDD = rot (Versorungsspannung +3V3) DQ = gelb (Daten) GND = schwarz (Masse)
Zwischen die 3,3-V-Leitung und die Datenleitung wird ein 4,7-Kiloohm-Widerstand (Pullup) geschaltet.
Für die Verkabelung mit dem Raspberry Pi B benötigt man sodann noch die Belegung der GPIO-Pins.
Danach wird die Schaltung testweise auf einem Breadboard aufgebaut. Der Anschluss des Sensors dürfte aber nur gelingen wenn man die Kabelenden zuerst sorgfältig mit Lötzinn härtet!
Weitere Sensoren können parallel angeschlossen werden, indem man sie in die gleichen Reihen am Breadboard einsteckt. Es ist dazu auch kein weiterer Widerstand erforderlich.
Ist der Aufbau vollbracht, könnte das Ergebnis wie folgt aussehen und wir können uns erleichtert der Software widmen.
Der 1-Wire-Bus
1-Wire ist ein digitaler, serieller Bus, der mit einer Datenader und einer Masseleitung auskommt. Der DS18B20 enthält neben dem 1-wire-Interface den Temperatursensor und einen Analog-Digital-Wandler. Zuerst wird die 1-wire-Unterstützung in der Datei /boot/config.txt aktiviert indem dort am Ende folgende zwei Zeilen eingetragen werden:
# Temperatursensor 1-wire dtoverlay=w1-gpio gpiopin=4
Damit wird der Pin 4 des GPIO für 1-wire reserviert. Nach dem reboot muss die 1-wire-Unterstützung im Kernel als Modul nachgeladen werden werden (als root-User). Es werden zwei Module benötigt, eines für den 1-wire-Bus allgemein und eines für die Temperaturmessung mit dem DS18B20:
sudo modprobe w1-gpio sudo modprobe w1-therm
Damit die Module bei jedem Neustart geladen werden, muss man sie noch in /etc/modules am Ende der Datei eintragen.
# /etc/modules w1-gpio w1-therm
Ob das Laden der Kernel-Module nach dem Reboot erfolgreich war, kann mit
sudo lsmod
überprüft werden.
Wie bei allen GPIOs werden auch hier die Daten über virtuelle Dateien im Verzeichnis /sys verarbeitet. Die Module legen im Verzeichnis /sys/bus/w1/devices mehrere symbolische Links auf Unterverzeichnisse an. Der Name dieser Verzeichnisse setzt sich aus dem Family-Code (hier 28) und einer eindeutigen ID zusammen. Mein Sensor hat so die Nummer 28-0516a328deff.
cd /sys/bus/w1/devices ls
Je nach Ergebnis zum Beispiel:
cd 28-0516a328deff
Die Temperatur kann sodann durch Auslesen der (Pseudo-)Datei w1_slave ermittelt werden:
cat w1_slave
Als Ergebnis sollte man in etwa folgende Anzeige erhalten:
33 00 4b 46 ff ff 02 10 f4 : crc=f4 YES 33 00 4b 46 ff ff 02 10 f4 t=25625
YES in der ersten Zeile besagt, dass der Prüfwert korrekt war, t=25625 in der zweiten Zeile ist die Temperatur 25,625 Grad Celsius. Falls dieser Wert plausibel ist, haben wir einen großen Schritt geschafft.
Python Skript
Nun noch ein kleines Pythonprogramm, da die Temperaturwerte ausliest und in einer Schleife am Schirm ausgibt.
#!/usr/bin/env python # -*- coding: utf-8 -*- # Auslesen DS18B20 #---------------------- import os, sys, time def Temp(): # 1-wire Slave Datei lesen file = open('/sys/bus/w1/devices/28-0516a328deff/w1_slave') filecontent = file.read() file.close() # Temperaturwerte auslesen und konvertieren stringvalue = filecontent.split("\n")[1].split(" ")[9] temperature = float(stringvalue[2:]) / 1000 # Temperatur ausgeben wert = '%6.2f' % temperature return(wert) Zaehler = 0 Anzahl = 20 Pause = 1 while Zaehler <= Anzahl: messdaten = Temp() print "Temperatur: ", messdaten time.sleep(Pause) Zaehler = Zaehler + 1 print "Temperaturabfrage beendet"
Kalibrierung meiner Sensoren
28-0516a328deff +0.1 28-0316a3428cff +0.0 28-05168511c6ff +0.0 28-0516851390ff -0.05 (vor der Rundung)