DS18B20
Ein Digitaltemperatursensor mit einem Temperaturbereich von -55°C bis 125°C.
Der Sensor besitzt drei Pins:
- Ground
- Data
- Power
Den Sensor und Wiederstand steckt man auf die Platine und verkabelt es entsprechend, wobei Data an einem GPIO Pin angeschlossen wird und zwischen Data und Power wird ein 4.7KΩ Wiederstand gesteckt. Wenn der Temperatursensor verdreht angeschlossen wird, kann er sehr heiss werden!
Die 1-wire Kernel Module sind vorinstalliert werden aber nicht automatisch geladen.
$ sudo modprobe w1-gpio && sudo modprobe w1-therm
Um die Module beim starten zu laden einfach in die /etc/modules
Datei eintragen.
$ ls /sys/bus/w1/devices/
Im devices Verzeichnis sollte sich nun ein Link mit dem Sensornamen befinden, der Name ist eindeutig und hat diese Form 28-0000055…., wobei die Punkte natürlich Zahlen oder Buchstaben sind.
$ ls /sys/bus/w1/devices/28-0000055....
Der Temperatursensor schreibt in die Datei w1_slave.
$ cat /sys/bus/w1/devices/28-0000055..../w1_slave
Der Inhalt der Datei hat diese Form.
15 01 4b 46 7f ff 0b 10 99 : crc=99 YES
15 01 4b 46 7f ff 0b 10 99 t=17312
Mit einem Python Skript kann man nun jede Sekunde die Temperatur lesen.
import os
import time
os.system('modprobe w1-gpio && modprobe w1-therm')
try:
while 1:
temp_file = open('/sys/bus/w1/devices/28-0000055..../w1_slave')
temp_data = temp_file.read()
temp_file.close()
data = temp_data.split("\n")[1].split(" ")[9]
temperature = float(data[2:])
temperature = temperature / 1000
print temperature
time.sleep(1)
except KeyboardInterrupt:
print 'Bye...'
Mehrere Sensoren kann man in Reihe schalten. Jeder Sensor hat einen eingebrannten eindeutigen Code zur Identifikation. Das Skript muss etwas erweitert werden, damit von mehreren Sensoren gelesen wird.
import os
import time
os.system('modprobe w1-gpio && modprobe w1-therm')
try:
sensor_list = []
for i in os.listdir('/sys/bus/w1/devices/'):
if i != 'w1_bus_master1':
sensor_list.append(i)
while 1:
for i in sensor_list:
temp_file = open('/sys/bus/w1/devices/' + i + '/w1_slave')
temp_data = temp_file.read()
temp_file.close()
data = temp_data.split("\n")[1].split(" ")[9]
temperature = float(data[2:])
temperature = temperature / 1000
print temperature,
print ''
time.sleep(1)
except KeyboardInterrupt:
print 'Bye...'