Temperaturmessung per OneWire-Sensoren

von Bernhard Kaiser

Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller

 
 
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


Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller