Forum: Projekte & Code Projekt Multi_DS18x20


von Jens M. (jensma)


Angehängte Dateien:

Lesenswert?

Diese Beispiel soll zeigen wie man mehrere Dallas OneWire 
Temperatursensoren verwalten und fest den Messstellen zuordnen kann.
Die Verwaltung geschieht durch den nichtflüchtigen UserData Speicher in 
den Sensoren.
In diesen Speicher wird der Index (genauer Index+1) des Messwertarrays 
abgespeichert.
Man braucht dadurch kein zusätzlicher Speicher im Flash oder EEProm für 
die Verwaltung der Sensoradressen.
Zur Laufzeit wird (zusätzlich zur Bibliothek) im Ram für jeden Sensor 
nur ein float Wert für die Temperatur benötigt.
Mit der Funktion ReadMultiDS18x20 werden alle Sensorwerte gelesen und in 
das Messwertarray geschrieben.
Sollte ein Sensor nicht mehr funktionieren so steht als Wert ein nan 
(Not a Number) im Speicher.

Die Zuordnung der Sensoren zu einem Messwert macht man mit der Funktion 
InitMultiDS18x20.
Dies kann auch extern mit einem anderen System erfolgen.
Dazu bringt man zuerst alle Sensoren auf etwa dieselbe Temperatur.
Dann startet man die Funktion InitMultiDS18x20. Darin wird die höchste 
Sensortemperatur ermittelt.
Nun erwärmt man den Sensor der ersten Messstelle auf höchste 
Sensortemperatur +1 Kelvin.
Dies macht man nun der Reihenfolge nach mit allen Sensoren.

Dies ist das erste System das man durch Handauflegen parametrieren kann 
:-).


Weitere Vorteile dieses Systems:
Ein Sensor kann getauscht werden, indem man vorher die UserData des 
Ersatzsensors mit dem Wert Index+1 der Messstelle beschreibt.
Man kann sogar redundante Messstellen aufbauen. Hat man 2 Sensorem mit 
demselben Index im UserData am Bus, so werden beide gelesen.
Beide Werte werden nacheinander in das Messwertarray gschrieben. Der 
letzte gewinnt.
Meldet sich ein Sensor nicht mehr, so hat man immer noch den Wert des 
anderen Sensors.

Viele Grüße
JensMa

von Falk B. (falk)


Lesenswert?

Jens M. schrieb:
> Diese Beispiel soll zeigen wie man mehrere Dallas OneWire
> Temperatursensoren verwalten und fest den Messstellen zuordnen kann.

Soll. Schafft es aber nur unzureichend.

Ich hab mal spontan meinen "Bus" aus meinen Tests angeschlossen.

Beitrag "Re: Onewire + DS18x20 Library"

Siehe Anhang.

Da "erkennt" deine Software andere Onewire ICs als DS18x20. Nanana, 
schon mal was von einer ID-Prüfung gehört? Ist ja wohl nicht soo schwer.
1
// returns the number of DS18xxx Family devices on bus
2
uint8_t getDS18Count(void);
3
4
// returns true if address is of the family of sensors the lib supports.
5
bool validFamily(const uint8_t* deviceAddress);

> Die Verwaltung geschieht durch den nichtflüchtigen UserData Speicher in
> den Sensoren.
> In diesen Speicher wird der Index (genauer Index+1) des Messwertarrays
> abgespeichert.

Hmm. Man könnte auch mit der Seriennummer des ICs arbeiten, hat damit 
aber zugegebenermaßen mehr Aufwand, vor allem bei Serieneinsatz.

> Man braucht dadurch kein zusätzlicher Speicher im Flash oder EEProm für
> die Verwaltung der Sensoradressen.
> Zur Laufzeit wird (zusätzlich zur Bibliothek) im Ram für jeden Sensor
> nur ein float Wert für die Temperatur benötigt.

Naja, kann man machen, ist aber bei max. 12 Bit Auflösung eher Overkill. 
Old school Festkommaarithmetik mit 0.1 oder meinetwegen auch 0.01 °C 
Auflösung reicht hier, spart auch 2 Byte/Sensor ein. Ist aber eher 
nebensächlich.

> Die Zuordnung der Sensoren zu einem Messwert macht man mit der Funktion
> InitMultiDS18x20.
> Dies kann auch extern mit einem anderen System erfolgen.
> Dazu bringt man zuerst alle Sensoren auf etwa dieselbe Temperatur.

Wozu? Man kann einfach am Anfang die aktuelle Temperatur mehrfach messen 
und mitteln. Dann schaut man nur, ob sie sich deutlich > ? K ändert.

> Dann startet man die Funktion InitMultiDS18x20. Darin wird die höchste
> Sensortemperatur ermittelt.
> Nun erwärmt man den Sensor der ersten Messstelle auf höchste
> Sensortemperatur +1 Kelvin.

Warum +1K? Was passiert bei +10K? Was, wenn ich den Sensor nicht 
erwärmen kann? Was, wenn ich ihn nur abkühlen kann, z.B. mit Eisspray? 
Was, wenn die Sensoren aufbaubedingt überaus verschiedene Temperaturen 
messen müssen?

> Man kann sogar redundante Messstellen aufbauen. Hat man 2 Sensorem mit
> demselben Index im UserData am Bus, so werden beide gelesen.
> Beide Werte werden nacheinander in das Messwertarray gschrieben. Der
> letzte gewinnt.

Ob das so sinnvoll ist?

> Meldet sich ein Sensor nicht mehr, so hat man immer noch den Wert des
> anderen Sensors.

Nö, denn deine Supersoftware schreibt ggf. die unültige Temperatur ala 
nan in das Array! TOLL!! Du solltes keine Software für Flugzeuge 
schreiben!

Alles in allem ist das bestenfalls eine Idee, allerdings mit einer eher 
mangelhaften Umsetzung. Die Leute, welche das nutzen wollen, wird das 
freuen . . .

: Bearbeitet durch User
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

So könnte das aufgeräumt aussehen, siehe Anhang. Die zugehörigen Libs 
gibt es hier.

https://www.arduino.cc/reference/en/libraries/onewire/
https://www.arduino.cc/reference/en/libraries/dallastemperature/

In der onewire Lib ist ein dreckiger Hack drin, da wird beim Schreiben 
von Bits das IO-Pin hart auf HIGH geschaltet. Das macht man bei einem 
Open Drain Bus nicht! Die einzige Ausnahme ist die parasitäre 
Busversorgung in bestimmten Momenten!

von MaWin (Gast)


Lesenswert?

Falk B. schrieb:
> In der onewire Lib ist ein dreckiger Hack drin,

Rinder oder Schweine Hack? 🐷

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.