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:
- t = errechnete Temperatur in Kelvin
- GradC = errechnete Temperatur in Grad Celcius
- tn = Nenntemperatur (meist 25 °C, das heißt 298.15 K)
- rn = ausgelesener Wert bei tn (also bei 25 °C)
- rt = aktuell ausgelesener Wert (um die 128 / 0x80)
- b = Materialkonstante aus Datenblatt. Sie liegt etwa zwischen 1000 und 5000 K
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.
- Stimmt die errechnete Zimmertemperatur mit einem danbenstehenden Thermometer überein?
- Ergibt sich ein Wert von ca. 35°C, wenn ich den Sensor mit den Fingern umschließe
- Ergibt sich ein Wert von 1-2 °C, wenn ich den Sensor an einen Eisbeutel presse?
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.