DS18B20-Temperatur-Sensoren am one-wire-bus anordnen

Die DS18B20-Sensoren sind gut geeignet um Temperaturen in der Beute zu messen. Das liegt vor allem an ihrer Anbindungsmöglichkeit als one-wire-Sensoren. D.h. alle Temperaturfühler hängen, wie an einer Kette, am gleichen Kabel. Dabei ist man bei der Topologie der Anordnung recht flexibe. Man könnte eine Stern-Topologie nutzen, die oben erwähnte “Perlenkette” oder, wie wir beim Temperature Array, eine Topologie, die an einen Rechen erinnert.

D.h. von einem zentralen Kabel, das am Arduino oder ESP hängt und über die Wabenoberträger läuft gehen Abzweigungen nach unten in die Wabengassen, wo die Temperatur dann gemessen wird.

Das vermeidet Unmengen an Kabelsalat, der entstehen würde, wenn man jeden Sensor mit einem eigenen Kabel direkt am Microcontroller anschließen müsste!

Problem: Von welcher Stelle kommen denn welche Temperaturen?!

Damit handeln wir uns aber ein kleines Problem ein. Hätte man Einzelsensoren direkt am Arduino, könnte man sagen, der Sensor ganz rechts ist an pin #2 angeschlossen, der nächste an #3, der nachfolgende an #4 usw. Ein mapping von Wabengasse auf Arduino-pin, zu Sensor(wert) ist so sehr einfach möglich.

Bei one-wire-Sensoren ist das anders, sie hängen ja alle an einem pin. Um die Messposition zu identifizieren gibt es zwei Möglichkeiten:

  • über die explizite ID der Sensoren
  • über die “Reihenfolge” der Sensoren

Im Arduino-Code schaut das so aus:

Möglichkeit 1: Über die explizite Adresse

// Assign address manually. The addresses below will beed to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
DeviceAddress insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
DeviceAddress outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

Möglichkeit 2: Über den Index

// by index
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

Nun ist der Index aber nicht die physikalische Reihenfolge am Kabel, sondern es geht auch hier nach der explizite Adresse, die kleinste ist 1, die nächstgrößere 2 usw., man muss sie nur nicht als hex-Code vorher auslesen, in den sketch einschreiben.

Lösung

Nun wäre es schön, wenn die Index-Reihenfolge der physikalischen Anordung am Kabel entspräche, damit hätten wir dann ein perfektes mapping, Sensor #0 ist in der Wabengasse 1, Sensor #1 in Gasse 2 usw.

Dazu müssen wir die Sensoren physikalisch umstecken! So geht es am einfachsten:

  1. wir schließen alle Sensoren – egal in welcher Anordung – an unser Kabel an und lassen den Testsketch laufen.

  2. Nun beobachten wir im Seriellen Monitor die Sensorwerte und ziehen – im laufenden Betrieb! – einen Sensor vom bus ab.

  3. Daraufhin erscheint im Seriellen Monitor eine Fehlermeldung und zwar genau an der Position wo der Sensor eigentlich physikalisch hin soll! Diese Position notieren wir uns für genau den gerade abgezogenen Sensor,

  4. Das machen wir für alle restlichen Sensoren.

  5. Nun schließen wir alle Sensoren wieder an, allerdings nicht in der Reihenfolge wie gerade, sondern in der frisch notierten!

Der Sensor mit der niedrigsten ID hängt nun am Anfang des Kabels, der mit der höchsten am Ende und wir können ohne Auslesen der pysikalischen ID das Mapping einfach über den Index machen.

Der einzige Nachteil dieser Methode ist: Falls wir einen Sensor tauschen müssen oder wollen, muss das ganze procedere nochmals erfolgen, denn wir wissen nicht an welcher Stelle der neue Sensor in der Reihe eingeschoben werden muss.

3 Likes

An dieser Stelle lief mir gerade eine Beschreibung des “1-Wire Search Algorithm” in Form einer Application Note von Maxim über den Weg. Es geht dabei um den Suchalgorithmus und kann vielleicht Klarheit darüber bringen, wie die Dinge unter der Haube ablaufen.

If the ROM numbers of the slave devices on the 1-Wire network are not known, then using a search algorithm can discover them. This document explains the search algorithm in detail and provides an example implementation for rapid integration. This algorithm is valid for all current and future devices that feature a 1-Wire interface.

https://www.maximintegrated.com/en/app-notes/index.mvp/id/187

Die esp32-owb Bibliothek implementiert eine solche Suchfunktionalität bereits.