Go Down

Topic: DS18B20 als defekt erkennen (Read 2276 times) previous topic - next topic

Rudi01

Hallo zusammen

ich verwende in meiner Solaranlagensteuerung zwei DS18B20 Temperatursensoren die an einem Eingang hängen .
Als Defekterkennung habe ich bis jetzt ,die Abfrage ob die Temperatur unter einen bestimten Wert gesunken ist, verwendet.
Aber es gibt auch Situationen bei denen die Temperatur dann bei 85°C ligt. Da funktioniert die Plausibilitätsabfrage nicht .

Gibt es da ein eleganteren Weg um die korrekte Funktion der Sensoren zu überprüfen?

mde110

Wie wäre es mit Redundanz?
Daran könnten auch defekte und Unplausibilitäten erkannt werden.

Ich kenne mich mit den DS18B20 recht gut aus. Ich habe auch ein paar "teils" defekte Sensoren. Sie funktionieren unter bestimmten timing Umständen gut, unter anderen Umständen garnicht. Eine Erkennung ob defekt oder nicht kenne ich von DS aus nicht.
Frägst du auch die 127,5°C als Defekt ab?

Rudi01

Hi
Danke für die promte Antwort.
Das mit der Redundanz verstehe ich jetzt nicht.
Zur Zeit frage ich die Temperatur der Sensoren unter 8°C sind. Wenn ja dann wird der Sensor als defekt deklariert.
Dies funktioniert aber nur wenn vom Sensor keine Daten kommen wenn z.B. die + Leitung eines Sensors fehlt dann wir 85°C angezeigt und in Diesem Fall wird der Sensor nicht als defekt deklariert.

mde110

...
Das mit der Redundanz verstehe ich jetzt nicht.
...

Mehrere Sensoren (zwei oder drei) und dann gegeneinander die Temp überprüfen.

Wenn eine Leitung des Sensors fehlt, dann fehlt er auch bei der Adressabfrage in der Lib. Du musst natürlich regelmäßig die Anzahl der Sensoren und deren Adressen über die Lib abfragen.

mwyraz

Ich denke, die Sensoren liefern einfach "nix", wenn sie kaputt sind. Die 85 °C entstammen der lib (DS18S20.cpp):

Code: [Select]

    if (present==0) {
      ds18s20[no].temp=85.0;
      return;
      }


Mache da einfach etwas, das außerhalb der Sensor-Norm liegt) hin, z.B. -200°C, schon ist es sinnvoll prüfbar.

maverick1509

@mde110 meinst du nicht -127°C ??
Das zeigen meine jedenfalls an, wenn sie z.B. nicht erreichbar sind.

maverick1509

@mwyraz: guter Ansatz, ich hab immer gedacht,das die 85° vom DS18B20 kommen.
Da es diesen Wert aber auch real gibt, war hier eine Abfrage auf defekt schwierig.
Wenn das aber aus der lib kommt, dann kann man ja auch einen wirklich unrealistischen Wert einsetzen um abzufragen.
Werde ich mal testen.
Gruß

Rudi01

Wenn eine Leitung des Sensors fehlt, dann fehlt er auch bei der Adressabfrage in der Lib. Du musst natürlich regelmäßig die Anzahl der Sensoren und deren Adressen über die Lib abfragen.
Genau sowas schwebt mir vor doch wie wird sowas gemacht?

jurs


Gibt es da ein eleganteren Weg um die korrekte Funktion der Sensoren zu überprüfen?


Also ich persönlich kenne ja gar nix von DS18B20 Sensoren, aber wenn ich mir die Arduino-Library zum Sensor ansehe, dann sehe ich dort, dass der Sensor seine Daten mit einer CRC Prüfsumme sendet und die Library eine Funktion zum Berechnen des CRC-Wertes aus den Daten hat.

Der elegante Wert zum Prüfen auf gültige Werte vom Sensor dürfte also darin bestehen:
- Daten mit CRC Prüfsumme vom Sensor empfangen
- Aus den Daten (ohne CRC Prüfsumme) selbst die CRC Prüfsumme errechnen
- Feststellen, ob die vom Sensor gesendete Prüfsumme mit der errechneten Prüfsumme übereinstimmt
Und dann nur davon ausgehen, dass gültige Daten vom Sensor empfangen wurden, wenn die vom Sensor empfangene Prüfsumme mit der selbst aus den empfangenen Daten errechneten Prüfsumme übereinstimmt.


mde110

#9
Feb 10, 2013, 08:48 pm Last Edit: Feb 10, 2013, 08:56 pm by mde110 Reason: 1

Also ich persönlich kenne ja gar nix von DS18B20 Sensoren, aber wenn ich mir die Arduino-Library zum Sensor ansehe, dann sehe ich dort, dass der Sensor seine Daten mit einer CRC Prüfsumme sendet und die Library eine Funktion zum Berechnen des CRC-Wertes aus den Daten hat.

Der elegante Wert zum Prüfen auf gültige Werte vom Sensor dürfte also darin bestehen:
- Daten mit CRC Prüfsumme vom Sensor empfangen
- Aus den Daten (ohne CRC Prüfsumme) selbst die CRC Prüfsumme errechnen
- Feststellen, ob die vom Sensor gesendete Prüfsumme mit der errechneten Prüfsumme übereinstimmt
Und dann nur davon ausgehen, dass gültige Daten vom Sensor empfangen wurden, wenn die vom Sensor empfangene Prüfsumme mit der selbst aus den empfangenen Daten errechneten Prüfsumme übereinstimmt.


Das macht die Lib schon.
Code: (DallasTemperature.cpp) [Select]

...
 Valid = _wire->crc8(deviceAddress, 7) == deviceAddress[7];
...
 readScratchPad(deviceAddress, scratchPad);
 isConn = _wire->crc8(scratchPad, 8) == scratchPad[SCRATCHPAD_CRC];
...


Rudi, wie ist es nun mit Redundanz aus?

mde110


Genau sowas schwebt mir vor doch wie wird sowas gemacht?


Code: (DallasTemperature.h) [Select]

// returns true if address is valid
bool validAddress(uint8_t*);

// attempt to determine if the device at the given address is connected to the bus
bool isConnected(uint8_t*);

Rudi01

Hi

also das mit der Redundanz ist an sich keine schlechte Idee.Doch da muss ich a für jeden Messwert 2 Sensoren vorsehen da wird`s in den Themeraturmeßröhrchen ein wenig eng.
Außerdem muss dann der redundant Sensor über eine eigene Stomversorgung und auch einen separaten Dateneingang verfügen.

Leider kenne ich mich in der Programmierung noch nicht so gut aus.

Könnte mir da vielleicht jemand das ein wenig erklären.
bool validAddress(uint8_t*);

Lässt sich da nichts mit einer Art Adressabfrage machen.
Ich suche mal den Code und stelle ihn mal hier ein.

mwyraz

Du kannst "beliebig" viele DS1820 an eine Leitung hängen. D.h. einfach "Huckepack" übereinander löten.
Allerdings ist zu beachten, dass bei der 2-Draht-Variante die Sensoren einer nach dem anderen ausgelesen werden müssen - mit genügend Zeit dazwischen, um den internen Kondensator aufzuladen. Bei der 3-Draht-Verkabelung kannst Du alle direkt auslesen ohne warten zu müssen.

Hintergrund:

Dei der 2-Draht-Variante (Parasitic Power genannt) laden die Sensoren einen internen Kondensator über den Pegel auf der Signalleitung auf. Beim Senden wird die Leitung ja immer kurz auf Masse gezogen, es steht also keine Versorgungsspannung zur Verfügung. Der interne Kondensator reicht aber, dass einer der Sensoren seine Daten senden kann. Die Kondensatoren  der ggf. vorhandenen weiteren Sensoren sind in der Zwischenzeit aber leer. D.h. es muss mind. die Zeit für eine neue Messung gewartet werden, bevor der nächste Sensor ausgelesen werden kann.

Bei der 3-Draht-Variante wird der Sensor über eine extra Leitung dauerhaft mit Strom versorgt. Damit kann man die Daten mit der Geschwindigkeit auslesen, die der 1-Wire-Bus hergibt.

In jedem Fall können viele (bis zu einigen Hundert?) 1-Wire-Sensoren über zwei bzw. drei Adern angeschlossen werden und benötigen alle zusammen nur einen Daten-Pin vom Arduino.

Wenn möglich, würde ich immer die 3-Draht-Variante wählen.


Rudi01

Ich verwende die 33-Draht Variante .Doch wenn mal die Versorgungsspannung ausfällt oder die Masseverbindung oder was auch möglich wäre ein defekter Sensor zieht die Datenleitung nach Masse oder Plus und schon funktioniert das mit der Redundanz auch nicht mehr.
Ich finde eine korrekte Redundanz sollte aus zwei möglichst getrennten Systemen bestehen.

mwyraz

Kommt darauf an, was du mit der Redundanz absichern möchtest. Wenn die Leitung defekt ist (oder ein Sensor auf Masse zieht), bekommst du keine Sensordaten und weißt, dass da was faul ist. Um dennoch eine Temperatur zu erhalten, benötigst Du eine zweite Sensorstrecke.

Wenn der Arduino defekt sein könnte, bräuchtest du einen zweiten, um den redundant auszulegen.

Wenn Du nur sicherstellen möchtest, dass Du keine falschen Sensordaten bekommst (also ein Sensor falsch misst, jedoch formal korrekte Signale in den Bus sendet), benötigst Du 2 Sensoren an einem Kabel.

Wenn Du 2 "relativ" unabhägige Sensoren haben willst, benötigst Du 4 Adern (Masse, Versorgung, 2x Daten).

Go Up