Projekt Multi_DS18x20

OP #6508785
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
Angehängte Dateien:
#6510132
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 . . .
#6510536
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!
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren