Die eigene Klasse LM75

Für den komfortablen Zugriff auf den Temperatursensor vom Typ LM75 wird als nächstes eine eigene Klasse mit dem Namen LM75 implementiert. Diese stellt einer Anwendung, die sie verwendet, alle Funktionen des realen Bausteins in Form von Java-Methoden zur Verfügung. Konkret bedeutet das, daß die gemessene Temperatur mit der Methode getTemp() ausgelesen werden kann. Die Klasse LM75 übernimmt damit auf sehr elegante Art und Weise die Funktion eines speziellen "Gerätetreibers" für den Baustein LM75.

Der nachfolgende Quelltext zeigt die Implementierung der Klasse LM75. Sie besteht aus zwei Teilen: Aus dem Konstruktor, der eine Instanz der Klasse anlegt und aus der Methode getTemp(), die den ausgelesenen Temperaturwert zurückliefert.

1    import java.io.IOException;
2    import jcontrol.comm.I2C;
3    
4    /**
5     * <p>LM75 is a class to access the I2C-compatible
6     * temperature sensor LM75 from National Semiconductor.</p>
7     *
8     * <p>(C) DOMOLOGIC Home Automation GmbH 2003-2005</p>
9     */
10    public class LM75 extends I2C{
11    
12      /**
13       *  Constructor of this class.
14       *
15       *  @param address slave address of the device
16       */
17        public LM75(int address){
18          super(address);
19        }
20    
21        /**
22         *  Returns an Integer value representing the
23         *  current die temperatur of the LM75.
24         *
25         *  @returns An integer representing the current
26         *           temperature in "Centigrades" (10*degree Celsius).
27         */
28        public int getTemp() throws IOException {
29            // allocate buffer for temperature
30            byte[] buf = new byte[2];
31            // read content of 16-bit register #0x00
32            read(new byte[] {0x00}, buf, 0, 2);
33            // return integer value
34            return (buf[0]*10) + (((buf[1] & 0x80) >> 7)*5);
35        }
36    }
Listing 1: LM75.java

Wie in Listing 1 zu sehen ist, kapselt die Methode getTemp() die Kommunikation mit dem Temperaturfühler über den I²C-Bus. Damit muß der Programmierer, der fortan die Klasse LM75 verwenden soll, lediglich die Slave-Adresse des Sensors wissen und kann schon den aktuellen Temperaturwert über die Methode getTemp() auslesen.

Zeile 32 zeigt den eigentlichen Funktionsaufruf, der den Temperaturwert aus dem Sensor ausliest. Dabei ist zu sehen, dass das Kommando-Byte 0x00 (für Details: s.u.) gesendet wird, um dem LM75 mitzuteilen, dass er nun seinen Temperaturwert über den I²C-Bus senden soll. Der Wert wird dann in das Byte-Array buf (Kurzform von "Buffer") eingetragen.

Der Temperaturwert besteht aus insgesamt 9 Bits und muß daher in zwei einzelnen Bytes ausgelesen werden. Im ersten Byte steht der ganzzahlige Anteil der aktuellen Temperatur (in °C). Dabei fungiert das oberste Bit 7 des ersten Bytes als Vorzeichen-Bit: Eine logische "1" bedeutet, daß es sich um einen negativen Temperaturwert handelt. Für die Umrechnungsformel, die den Temperaturwert zurückgibt, können wir das jedoch vernachlässigen, da das bei JControl genauso ist. Im zweiten Byte steht nun der (restliche) Bruchteil eines Grades. Hiervon wird beim LM75 jedoch nur das oberste Bit verwendet und mit 1/256°C auflöst. Das heißt: Ist das zweite Byte 0x00, so beträgt der Rest 0°C. Ist es 0x80, so beträgt der Rest 0,5°C. Hier noch einmal die Formel, die die beiden Bytes in einen Temperaturwert umwandeln:

    return (buf[0]*10) + (((buf[1] & 0x80) >> 7)*5);

Der Ganzzahlige Anteil wird hierbei mit 10 multipliziert, da die kleinen JControl-Varianten keine Fließkomma-Zahlen unterstützen. Auch der Bruchteil des Grades wird dabei gleich mit 5 multipliziert. Die Methode getTemp() liefert den Meßwert also in "Zentigraden": Bei einer Temperatur von 20,5°C wird ein Wert von 205 zurückgegeben.

Wenn die Anschlüsse des LM75 beschaltet wurden so wie es im Abschnitt "Der Versuchsaufbau" gezeigt ist, gilt für den LM75 die Sensor-Adresse 144 (Hexadezimal: 0x90). Diese Adresse wird daher im folgenden Abschnitt Ein kleines Testprogramm auch für die Ansteuerung des LM75-Temperatursensors verwendet.

Details zum Kommando-Byte: Das Kommando-Byte teilt dem Sensor mit, auf welches interne Register zugegriffen werden soll. Da der Temperaturwert im LM75 in Register 0 steht, ergibt sich das Kommando-Byte auch zu 0, bzw. zu 0x00 in hexadezimaler Darstellung. Alle hier aufgeführten Informationen bezüglich des LM75 sowie weitere Details sind in dessen Datenblatt aufgeführt.