Interessanter Fehler mit Temperatursensoren DS18B20

Guten Morgen!

Ich wollte heute mal meinen freien Tag nutzen um mit einem schon länger ruhenden Projekt weiterzumachen. Und zwar geht es um die Erfassung der Temperatur an verschiedenen Stellen in einer Zisterne sowie der Außenlufttemperatur mit einem ESP8266.

Die Sensoren sind alle angebracht und auch verdrahtet, nun kommt die eigentliche Programmierung.
Und die möchte noch nicht so richtig.

Mit Beispielprogrammen, die nach angeschlossenen Sensoren suchen, funktioniert alles problemlos, ich kann die Adressen und Temperaturwerte von allen fünf Sensoren auslesen.

Jetzt möchte ich jedem Sensor einen mehr oder weniger sinnvollen Namen geben und diesem seine feste Adresse zuweisen. Das führt zu einem interessanten Fehler:

Wenn ich mein Programm aufspiele funktioniert es nicht, es kommt fünf mal der gleiche, unplausible Wert zurück. Wenn ich danach das auf fünf Sensoren erweiterte Beispielprogramm (nach Sensoren suchen und alle Sensordetails ausgeben) starte funktioniert es immernoch. Wenn ich danach mein Programm aufspiele funktioniert das plötzlich auch!
Nur nach einmal Stromversorgung trennen und wieder anschließen funktioniert es eben nicht mehr. Erst wenn ich wieder das Beispielprogramm aufspiele und starte und dann wieder mein Programm funktioniert es wieder. Ich verstehe das nicht…

Hier mein Code, eigentlich sehr simpel:

#include <OneWire.h>
#include <DallasTemperature.h>

#define oneWirePin D6

float behaelter_luft, behaelter_oben, behaelter_mitte, behaelter_unten, aussenluft = 0.00;

OneWire oneWire(oneWirePin);
DallasTemperature sensors(&oneWire);

DeviceAddress sensor4 = { 0x28, 0xAA, 0xA0, 0xC0, 0x13, 0x13, 0x02, 0x2C };
DeviceAddress sensor3 = { 0x28, 0x0F, 0xE2, 0x7C, 0x1B, 0x13, 0x01, 0xB5 };
DeviceAddress sensor2 = { 0x28, 0x2A, 0x82, 0xDC, 0x1B, 0x13, 0x01, 0x50 };
DeviceAddress sensor1 = { 0x28, 0xAA, 0x21, 0xB8, 0x13, 0x13, 0x02, 0x9E };
DeviceAddress lufttemperatur = { 0x28, 0x70, 0x01, 0x77, 0x1B, 0x13, 0x01, 0x09 };

void setup() {
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(sensor4, 12);
  sensors.setResolution(sensor3, 12);
  sensors.setResolution(sensor2, 12);
  sensors.setResolution(sensor1, 12);
  sensors.setResolution(lufttemperatur, 12);
}

void loop() {
  updateTemperature();
  Serial.println(behaelter_luft);
  Serial.println(behaelter_oben);
  Serial.println(behaelter_mitte);
  Serial.println(behaelter_unten);
  Serial.println(aussenluft);
  Serial.println();
  delay(1000);
}

void updateTemperature(){
  behaelter_luft = sensors.getTempC(sensor4);
  behaelter_oben = sensors.getTempC(sensor3);
  behaelter_mitte = sensors.getTempC(sensor2);
  behaelter_unten = sensors.getTempC(sensor1);
  aussenluft = sensors.getTempC(lufttemperatur);
}

Ich habe auch schon zum Spaß an zig Stellen ein paar ms Delay eingebaut, nicht, dass den Sensoren irgendwas zu schnell geht oder so. Das brachte alles keine Veränderung.

Hat da jemand eine Idee? Oder sieht eine andere Möglichkeit, den Sensoren feste Adressen zu geben damit ich auch weiß, welchen ich auslese?

Ich kann ja nicht die erste sein, die ein paar DS18B20 Sensoren auslesen möchte…

LG Britta

Und wieder war der Teufel ein Eichhörnchen!

Für alle, die das gleiche Problem haben:

Ich habe im Code (wieso auch immer) das "requestTemperatures" vergessen. So liegt nach einem Neustart kein Temperaturwert in den Sensoren bereit. Wird zuerst das Beispielprogramm geladen wird dort die "requestTemperatures" Funktion aufgerufen und in den Sensoren liegt ein gültiger Wert bereit, der dann auch von meinem Programm ausgelesen werden konnte, allerdings natürlich nur als konstanter Wert.

Ein simples "sensors.requestTemperatures();" in meine Code vor dem Aufruf "updateTemperature();" löste das Problem.

LG Britta

Schön daß Du den Fehler gefunden hast. Und wie gesagt das Forum wirkt Wunder. Man findet selbst den Fehler. ;) ;) ;) Andere nennen das zwar Rubber Duck Debugging, aber was soll's. https://de.wikipedia.org/wiki/Quietscheentchen-Debugging

Grüße Uwe