Temperaturmessung per OneWire-Sensoren
von Bernhard Kaiser
Es
können bis zu 10 OneWire-Temperatursensoren des Typs DS1820 des
Herstellers Maxim angeschlossen werden. Der Messbereich dieser Sensoren
liegt im Bereich von -55 ... +125°C, die Auflösung beträgt 0,5°C.
Auf
der LED-Anzeige wird die Temperatur des per Poti angewählten Sensors
angezeigt. Dabei kann eingestellt werden, ob der minmale, der aktuelle
oder der maximale Messwert des ausgewählten Sensors angezeigt werden
soll. Zusätzlich ist ein Scanbetrieb möglich, bei dem die Sensoren
automatisch der Reihe nach durchgeschaltet werden und für jeweils ca. 3
Sekunden angezeigt werden.
OneWire-Temperatursensoren des Typs
DS1820. Diese haben 3 Pins: VCC, GND, sowie Data. Data wird an PORTC.4
(also Pad C4) angeschlossen. Es können bis zu 10 Sensoren angeschlossen
werden, diese werden einfach alle parallel geschaltet.
An PORTC.4 muss zusätzlich ein Pull-Up-Widerstand von 4K7 gegen VCC geschaltet werden.
Optional, damit ein Reset des Min-/Maxspeichers erfolgen kann:
ein
zusätzlicher Taster (1-poliger Schließer), der zwischen PortD.3 (also
Lötpad D3) und GND angeschlossen wird. Der benötigte Pullup-Widerstand
wird im Controller intern hinzugeschaltet.
In der obersten
LED-Zeile wird angezeigt, wieviele Sensoren angeschlossen sind sowie
welcher Sensor aktuell angewählt ist. Die maximal 10 möglichen Sensoren
werden durch die entsprechende Anzahl leuchtender LEDs beginnend von
links her angezeigt. Die LED des angewählten Sensors blinkt hierbei.
Der Scanbetrieb wird durch eine zusätzliche blinkende LED ganz rechts
angezeigt.
Mit dem rechten Poti wird der anzuzeigende Sensor
ausgewählt. Der Einstellbereich wird hierzu in (Anzahl Sensoren + 1)
Teile aufgeteilt. Der Bereich am linken Anschlag entspricht Sensor 1,
bei Drehung nach rechts im Uhrzeigersinn werden die weiteren Sensoren
der Reihe nach ausgewählt. Der Bereich am rechten Anschlag wählt den
Scanbetrieb aus.
Mit dem linken Poti oberhalb des Münzschlitzes
kann ausgewählt werden, ob der Minimalwert, der aktuelle Wert oder der
Maximalwert der Temperatur des ausgewählten Sensors angezeigt werden
soll. Der Einstellbereich des Potis ist hierzu in 3 Teile unterteilt:
-
Bereich am linken Anschlag: minimaler Temperaturwert, symbolisiert
durch einen 4 Pixel breiten LED-Balken links in der untersten LED-Zeile
-
Mittelstellung: aktueller Temperaturwert, symbolisiert durch einen 4
Pixel breiten LED-Balken mittig in der untersten LED-Zeile
- Bereich
am rechten Anschlag: maximaler Temperaturwert, symbolisiert durch einen
4 Pixel breiten LED-Balken rechts in der untersten LED-Zeile
Durch kurzen Druck auf den optionalen Taster kann der Min- / Maxwert-Speicher zurückgesetzt werden.
Die Anzeige des Temperaturwerts erfolgt in folgendem Format:
-55 ... -10°C: -xx
-9,9 ... -0,1°C: -x.x
0 ... 99,9°C: xx.x
100 ... 125°C: xxx
Der
Code wurde mit dem C-Compiler CodeVision AVR (Version 2.04.6
Evaluation) erstellt. Diese Evaluation-Version kann für den privaten
nicht-kommerziellen Gebrauch kostenlos verwendet werden und ist auf
eine Codegröße von 3 kB beschränkt, was für diese Anwendung ausreicht.
Das komplette Projekt ist in der ZIP-Datei enthalten (Projektdatei für
CodeVison AVR hat die Endung prj).
Im Array leds[] wird für jede
LED der gerade aktive Zustand "ein" oder "aus" gespeichert. Zusätzlich
gibt es noch das Array ledsBlink, in dem für jede LED gespeichert wird,
ob diese blinken soll oder nicht. In der Interruptroutine des Timers2,
die ca. alle 1 ms aufgerufen wird, werden diese Arrays ausgewertet und
die LEDs entsprechend angesteuert. In jedem Durchlauf wird die Variable
cBlinkcnt erhöht und bei Erreichen des Wertes 250 werden die blinkenden
LEDs umgeschaltet, die Blinkfrequenz beträgt also ca. 2 Hz.
Die
Kommunikation mit den OneWire-Sensoren ist sehr timing-kritisch und
darf nicht durch Interrupts unterbrochen werden. Aus diesem Grund
werden die Interrupts während der OneWire Übertragung gesperrt. Damit
dies jedoch nicht zu einem störenden kurzen Flackern der LED-Anzeige
führt, wurde die Kommunikation zu den OneWire-Sensoren mit dem Timer2,
der für das LED-Multiplexing zuständig ist, synchronisiert. Hierzu wird
in jeder der 3 OneWire-Funktionen oneWire_write, oneWire_read und
oneWire_init zunächst das Bit bTimerInt gelöscht und anschließend
gewartet, bis dieses Bit auf 1 gesetzt wurde. Das Setzen auf 1 erfolgt
nach jedem Durchlauf von Timer2, d.h. zu einem Zeitpunkt, wenn gerade
eine der 12 LED-Spalten aktualisiert wurde. Ab diesem Zeitpunkt können
nun die Interrupts bis zu max. 1 ms (abzüglich ca. 40 Mikrosekunden,
die von der Timer2-Interruptserviceroutine bereits benötigt wurden)
gesperrt werden, ohne dass das regelmäßige Multiplexing der Anzeige
dadurch beeinträchtigt wird. Da keine der 3 OneWire-Funktionen diese
Zeit überschreitet, kommt es zu keinem Flackern.
Download: Pingpong_1wire.zip