Temperaturmessung mit dem Dallas DS18B20.


aktualisiert am 11.04.2011



Es gibt viele Möglichkeiten Temperaturen zu messen. Bisher habe ich ausschließlich PT 1000 Temperaturfühler eingesetzt.
Dieses ist aber eine kostspielige Angelegenheit. Die Auswertung des Messwerte liegt aber im vertretbaren Rahmen, auch wenn viele glauben, man müsste teuere Messumformer einsetzten. Ein einfaches Widerstandsnetzwerk mit eng tolerierten Widerständen und eine AD-Wandeler mit entsprechenden Kanälen reicht schon um sehr genau die Daten erfassen zu können. Aber wie gesagt, es ist kostspielig....

Auch installiere ich immer mehr Fühler, die im Haus verteilt sind. Lange Messleitungen oder A/D Wandler müssen zum Einsatz kommen. Ports sind in der vorhandenen Steuerung nicht mehr frei. Es musste eine andere Lösung her.

Mittlerweile werden kostengünstige Alternativen angeboten, die von analogen bis zu digitalen Fühler reichen.

Nach einigen Experimenten habe ich mich entschieden, den digitalen OnWire-Sensor DS1820 von Maxim (früher Dallas) einzusetzten. Diesen gibt es in verschiedenen Ausführungen (9 und 12 Bit) und entsprechend ist die Auflösung der Temperatur.
Folgende Typen habe ich ausprobiert:

- DS18S20 mit 9 Bit Auflösung, das entspricht einer Auflösung von 0,5 Grad C
- DS18B20 mit 12 Bit Auflösung, das entspricht einer Auflösung von 0,0625 Grad C

Da der DS18B20 mit 12 Bit Auflösung bereits für rund 1,50 Euro angeboten wird, ist er ca. 90% billiger als ein PT1000-Fühler. Der angegebene Temperaturbereich geht von -55 Grad C bis zu 125 Grad C. Ich habe den Sensor bis 127,9 Grad getestet und war erstaunt, wie genau er noch außerhalb des spezifizierten Bereiches war. Über diesen maximalen Wert steigt der Sensor irgendwann aus. Alles was dann gemessen wird, ist Mist. Diesen "Ausstieg" kann man allerdings rechtzeitig erkennen, denn der Sensor liefert auch keine eindeutige Kennung mehr. Die Kennung bzw. Abfrage des Device-Typ (B oder S) sollte vor jeder Messung immer abgefragt und die Messwerte verworfen wenn diese nicht eindeutig ist.
Es handelt sich hier aber auch um Temperaturen, die innerhalb eines Hauses und bei einer Heizungssteuerung wohl nie vorkommen werden.

Bei diesen Sensoren handelt es sich um Messfühler, die den Wert der Temperatur in Form von digitalen Signalen ausgeben. Das tolle daran ist, daß mann bis zu 127 Sensoren mit nur 2 Drähten betreiben kann. Der Begriff OnWireBus (ein Draht Bus) ist da ein wenig irritierend, da mindestens 2 Drähte benötigt werden. Den Masseanschluß zählt man großzügiger Weise nicht mit, er wird aber benötigt.
Die Sensoren können parasitär oder zusätzlich mit Spannung versorgt werden. In letzten Fall ist noch ein 3. Draht für die Versorgungsspannung erforderlich. Parasitär bedeutet in diesem Fall, daß die Spannungversorgung über die Datenleitung erfolgt. Anfänglich war ich sehr skeptisch, nach vielen Versuchen musste ich aber feststellen, das dieses hervorragend funktioniert. Und da sowieso immer eine kleine CPU in meinen Projekten werkelt, kann diese auch gleich die Daten vom DS18B20 auslesen.

DS18B20 Der Dallas-Sensor hat die Größe eines kleinen NF-Transistors. Es gibt verschiedene Gehäuseformen.
Ich bevorzuge den 3-Beiner, er lässt sich wunderbar in eine kleine Metallhülse mit Vergussmasse einbauen.

Den kleineren Bruder, der DS18S20 gibt es im gleichen Gehäuse, er hat allerdings nur eine 9-Bit Auflösung und kann somit nur in 0,5 Grad C -Schritten arbeiten.
Wird der Sensor parasitär mit Spannung versorgt, legt man die beiden äußeren Anschlüsse auf Masse und nimmt den mittleren Anschluß für den Datenaustausch und Spannungsversorgung.

Wird der Sensor direkt mit Spannung versorgt (5 Volt), dann ist ein Anschluß für Masse, einer für die Daten und der dritte Anschluß für die Speisung zuständig.

Jeder Sensor wird bei der Herstellung mit einer einmaligen Seriennummer und einen Typ-Code versehen und ist laserjustiert.

Die Seriennummer erlaubt es, mehrere Sensoren an einem Bus zu betreiben und diese auch gezielt über die Seriennummer anzusprechen. Es soll möglich sein, bis zu 127 Sensoren an einem Bus zu betrieben. Ich habe es bisher nur mit 10 Sensoren ausprobiert, klappt wunderbar.

Wenn man einmal verstanden hat, wie die Sensoren angesprochen werden, das Auslesen der Temperaturwerte funktioniert, ist das Gröbste geschafft. Ich möchte aber nicht verschweigen, daß ich doch einige Stunden gelesen, gebastelt und experimentierten musste, bis ich das alles kapiert hatte.
Ok, der Schmerz ist vorbei, die Sensoren habe ich voll im Griff, mit allen Features die der Sensor bietet.

Im Internet gibt es jede Menge Beschreibungen, Datenblätter und Hinweise um den Sensor anzusprechen bzw. auszulesen. Aus diesem Grunde gehe ich hier nicht schon wieder auf die Programmierung ein. Allerding stelle ich später noch ein Diagramm ein um deutlich zu machen, wie der Ablauf der Messung funktioniert. Hätte ich solch ein Diagramm bereits zur Entwicklungszeit zur Verfügung gehabt, wäre das Prinzip von Dallas (für mich) einfacher zu verstehen gewesen. Wenn man dann noch etwas sorgfältiger als ich die Dokumentationen ließt, klappt es auch deutlich schneller mit dem Auslesen.

Ich habe die gesamte Software für einen PIC in Assembler geschrieben und mittlerweile jede Menge Regler, Thermostate für Kühlschränke, temperaturgesteuerte Lüfter und natürlich den Sensor in die Heizungsregelung eingebunden.
Um mehrere Sensoren an einem Bus zu betrieben muss man jeden Sensor über die individuelle Seriennummer ansprechen. Dieses setzt voraus, daß die SN vorher bekannt sein muss. Ich habe es so gelöst, daß ich die SN zu jedem Sensor im EEProm ablege. Dazu besitzt die Software eine Setup-Routine mit der ich die jeweilige SN auslese und im EEProm sicher speichere. Im praktischen Betrieb kann ich so zu jedem Sensor die SN holen, ihn gezielt ansprechen, die Temperaturwerte auslesen und an die zentrale Steuerung übertaragen. Diese Routinen sind deutlich einfacher zu programmieren als die Linearisierung und den Abgleich eines PT1000-Fühler.


DS18B20-Anzeige Der erste Erfolg. Der Device-Code (28hex) steht für den DS18B20, dann die Seriennummer, die den Sensor eindeutig identifiziert. Darunter die Temperatur binär dargestellt.

Nachdem ich die ersten Werte auslesen konnte, wurde als erstes ein kleines Thermostat gebaut um im Dauertest die Genauigkeit, Wiederholgenauigkeit, die Langzeitstabilität und die Robustheit des Sensor testen zu können.

Der eigesetzte PIC 18F252 ist für solche Aufgaben natürlich vollkommen überdimensioniert. Aber für ein Display gehen eben mal 8 Anschlüsse drauf, dann noch ein paar Taster für die Setup-Routinen um die SN auslesen und im EEProm speichern zu können.

Eine wichtige Erfahrung habe ich beim Test gemacht:
Der Sensor hat eine geringe Eigenerwärmung (ca. 2 Grad C), obwohl die Messung nur rund 750 mS dauert. Nach der Messung ist die Stromaufnahme auch sehr gering. Sobald der Sensor aber auf einer kleinen Kupferplatte oder einem kleinen ALU-Kühlkörper montiert wurde, spielte die Eigenerwärmung keine Rolle mehr. Wohin soll so ein kleines Bauteil seine Verlustleistung abgeben auch wenn sie noch so gering ist ? Bei Temperaturmessungen an Rohrleitungen oder anderen Gegenständen spielt die Eigenerwärmung keine Rolle, wird allerdings die Lufttemperatur gemessen, muss der Sensor unbedingt auf eine kleine Metallfläche geklebt oder sonst wie befestigt werden.

Prototyp Temperaturregeler Der kleine 3-Beiner im Prototyp.
Die Vergleichsmessungen habe ich mit einem geeichten Messegerät vorgenommen.
Die Genauigkeit ist wirklich verblüffend.

Das Relais, der Elko und der Stecker sind nur für die Programmierung des PIC innerhalb der Schaltung und ist für den praktischen Betrieb nicht erforderlich.


Um das Prinzip des Datenaustausch bzw. des Messvorgangs besser verstehen zu können habe ich zwei Messdiagramme eingestellt.
Diese wurden mit dem Picoscope der Serie 3000 erstellt.

den DS18b20 ansprechen So wird der DS18B20 angesprochen:
Das Signal kurz auf 0-Pegel legen, dann eine Pause und nun die Adresse des Sensor über den Bus senden.

Nach eine Pause von ca. 750 ms (bei parasitärer Speisung) antwortet der angesprochene Sensor. Die Speisung (parasitär) wird dadurch erreicht, daß ein Widerstand mit 4,7 K einfach zwischen + 5 Volt und Datenleitung gelegt wird. Wenn der Datenpegel logisch 1 ist, also 5 Volt über den Vorwiderstand anliegen, versorgt sich der Sensor mit dieser Spannung selbst.

Auflösung 1 ms pro Raster.

den DS18b20 ansprechen Es werden 8 Sensoren angesprochen:
Dort wo der Pegel auf unter 4 Volt einbricht, beginnt der Sensor mit der Wandlung. Nach rund 750 ms kommt die Antwort, dann wird der nächste Sensor angesprochen. Schön zu erkennen: es sind nur 3 Sensoren angeschlossen. Die anderen Anfragen laufen ins Leere.

Auflösung 1 s pro Raster.


Hier gibt es einen Schaltplan für einen Temperaturregler der sowohl als Heizthermostat oder als Kühlthermostat eingesetzt werden kann. Die jeweilige Funktion wird mit dem Jumper ausgewählt. Im Thermostat werkelt ein PIC 18F252 von der Firma MicroChip. Auch habe ich ein Display vorgesehen. Es können die Solltemperatur, die Hysterese und der Messzyclus eingestellt werden. Die Schaltung ist für einen Dallas DS18-B-20 ausgelegt.
Ein wenig muss ich die Software noch 'aufräumen'. Dann wird an dieser Stelle auch der Quellcode und das Hexfile zum Download bereitgestellt.
Es ist aber zu beachten, daß die Software für einen 18er PIC geschrieben wurde. Ich habe jede Menge der neuen Befehle, die in der 16er-Reihe nicht vorhanden sind, hier eingesetzt.
So ist der Befehl movff q, z in den Vorgängerversionen nicht vorhanden und muss durch jede Menge Einzelbefehle ersetzt werden.
Da der Preisunterschied zwischen 16F und 18F nicht so erheblich ist, empfehle ich den Einsatz des 18F252, wie im Schaltplan angegeben.


-------