Pages: [1] 2   Go Down
Author Topic: DS18B20 als defekt erkennen  (Read 1992 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
    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.
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 10
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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ß
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3039
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
...
  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?
« Last Edit: February 10, 2013, 02:56:03 pm by mde110 » Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 7
Posts: 302
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Genau sowas schwebt mir vor doch wie wird sowas gemacht?

Code: (DallasTemperature.h)
// 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*);
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
Logged

Pages: [1] 2   Go Up
Jump to: