Einen Thermistor über einen AD-Wandler am I2C-Bus auslesen

Thermistor ist kurz für "THERMally-sensitive resISTOR", also einen wärmeemfindlichen Widerstand, auf deutsch kurz: Wärmewiderstand. Das Bauteil ändert seinen Widerstand mit der Umgebungstemperatur. Bei NTC-Thermistoren (auch Heißleiter), wobei das NTC für "Negative Temperature Coefficient" steht, wird der Widerstand kleiner, je höher die Temperatur wird. Sie bestehen im Üblichen aus gepressten und gebundenen Metalloxiden von Mangan, Nickel, Kobalt, Eisen, Kupfer oder Titan. Aus dem verwendeten Material ergibt sich die Materialkonstante, die dem Datenblatt entnommen werden kann.


Leider ist das Verhältnis von Widerstand und Temperatur nicht linear, so dass ein wenig gerechnet werden muss, um aus dem Widerstandswert an die reale Temperatur zu kommen.

Der PCF8591 ist ein 8-Bit-Analog/Digital-Wandler und liefert uns einen Wert zwischen 0 und 255 (wobei 0 für sehr heiß und 255 für sehr kalt steht) für einen NTC-Thermistor.

Praktischerweise hat mein PCF8591-Modul gleich einen NTC-Thermistor aufgelötet, den ich auf Kanal 2 auslesen kann, so er denn gejumpert ist. Dabei liefert er einen Wert von 127 bei 25°C. 25°C ist bei den meisten Thermistoren die Nenntemperatur, sozusagen die Temperatur, auf den der Thermistor geeicht ist. Er sollte ungefähr im Mittelpunkt des Wertebereichs liegen.






Um aus dem auf Kanal 2 zurückgelieferten Wert eine Temperatur zu machen, ist folgende Formel notwendig: t = 1/ (1/tn + 1/b*log(rt/rn)) gradC = t-273.15 wobei gilt:
Mit rn=127, tn=298.15 und b=1100 liege ich bei meinem Sensor auf meinem PCF8591-Modul ziemlich gut. Da hat allerdings wegen des fehlenden Datenblattes nur Werte anpassen probieren geholfen. Ist alles richtig abgestimmt, liefert der Sensor zuverlässige Temperturen und reagiert innerhalb von Sekunden auf Temperaturschwankungen.





Der Python-Code zum Auslesen eines NTC-Thermistors sieht so aus: def getLocalTemp(): wert=readI2c (i2cAdda, addaWaerme) rt=wert rn=127. # Nennwiderstand bei 25°C tn=298.15 # Nenntemperatur (meist 25 °C, das heißt 298.15 K) b=1100. # Materialkonstante aus Datenblatt. Sie liegt etwa zwischen 1000 und 5000 K t=1/(1/tn+1/b*math.log(rt/rn)) gradC=t-273.15 return round(gradC,1) def readI2c(i2cDeviceAddr, channel): wert=i2c.read_byte_data (i2cDeviceAddr, channel) # erster Zugriff weist Bauteil an, neu zu lesen sleep (0.01) wert=i2c.read_byte_data (i2cDeviceAddr, channel) # erst zweiter Zugriff liefert aktuellen Wert return wert
Damit kann ich auch gleich mein Monitoring-Programm erweitern und die Temperatur im Display anzeigen, indem ich den Code mit folgenden Zeilen ergänze: localTemp=getLocalTemp() lcdMsg(1,0,str(localTemp)+"°C ") Und schon habe ich die Raumtemperatur immer im Blick.