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
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.