Temperaturmessung mit Thermistoren am Multi Function Shield
Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.In meiner 37-in-one-Sensoren-Bulk-Sammlung finden sich auch zwei Module mit kleinen schwarzen "Popeln" an Anschlussleitungen. Natürlich fehlten wieder die Modulbezeichnungen, aber die konnte ich noch ausmachen, da ich gleich erkannte, dass es sich bei den "Popeln" um Thermistoren handelt.
Hardware: Thermistoren-Module
Die im Foto abgebildeten Thermistor-Module sind links das KY-013 und das zweite von links das KY-028. Rechts daneben ein einzelner Thermistor, wie er auch auf den Modulen verbaut ist und ganz rechts ein Thermistor anderer Bauart, ein grüner TTC 123, zu dem es auch Datenblätter zu finden gibt, der aber teurer und schwieriger zu beschaffen ist.
Auf den Modulen befindet sich außer dem Thermistor auch noch ein Widerstand, um so ein Spannungsteilungsschaltung mit zwei Widerständen (hier am Beispiel eines Fotowiderstands erläutert) zu realisieren. Der verlötete Widerstand ist dabei der feste und der Thermistor der (je nach Temperatur) variable, was eine temperaturabhängige Spannung am Analogeingang des Arduino ergibt, die wir messen und auswerten können.
Das große Modul verfügt, wie so viele Module dieses Sets, wieder über einen LM393-Komparator und ein Poti (blau). Mit dem Poti kann der Vergleichswiderstand eingestellt werden, den der analoge Ausgang an A0 erreichen muss, um den Digitalausgang D0 durchzuschalten. Der LM393 vergleicht dabei ständig die Widerstände von Poti und Thermistor und schaltet entsprechend. So kann man z. B. ab einer bestimmten Temperatur einen Lüfter einschalten, größere natürlich über ein nachgeschaltetes Relais mit eigener Versorgungsspannung.
Für unsere Temperaturmessung mit Anzeige auf dem 7-Segment-Display des Multi Function Shields reicht allerdings das kleine Modul oder auch ein einzelner Thermistor und ein Widerstand auf deinem Breadboard.
Thermistoren und wie man die ausgelesenen Werte zu einer Temperatur umrechnet, habe ich schon im Zusammenhang mit dem Raspberry Pi vorgestellt.
Die dort beschriebene Formel für Heißleiter gilt auch für den Einsatz am Arduino
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
- b = Materialkonstante aus Datenblatt. Sie liegt etwa zwischen 1000 und 5000 K
Leider gibt es kein Datenblatt zu den Thermistoren Marke "schwarzer Popel", der wir die Materialkonstante b entnehmen könnten und so müssen wir b selbst ermitteln. Am besten geht das, indem wir
- rn ermitteln, indem wir den Thermistor auf genau 25 °C erwärmen
- das unterstehende Programm auf den Arduino hochladen und dann mit der Materialkonstande so lange spielen, bis die angezeigte Temperatur für bekannte Werte passt. Dies können sein:
- Zimmertemperatur, gemessen mit einem anderen, genauen Thermometer
- ca. 35-36 °C, wenn man den Thermistor zwischen den Fingern hält
- ca. 0-1 °C für ein schmelzenden Eiswürfel
Die drei Anschlüsse des KY-013-Moduls (von oben nach unten, Vorderseite oben, Pins rechts) sind :
- S = Signal (Data)
- = +5V
- - = GND
Dann noch das unterstehenden Programm auf den Arduino laden und wir können schon mit dem Temperaturmessen loslegen:
Source-Code
////////////////////////////////////////////////////////
// (C) 2019 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
////////////////////////////////////////////////////////
#include <TimerOne.h> // für Timings und Interrupts
#include <MultiFuncShield.h> // API für das Multi Function Shield
#define PinData A5 // wo ist Analog Out angeschlossen?
void setup() {
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multi-function shield library
pinMode (PinData, INPUT);
//Serial.begin (115200);
}
void loop() {
MFS.beep(1, 5, 2); // bereit
float rt;
float rn = 511.; // Nennwiderstand bei 25°C
float tn = 298.15; // Nenntemperatur (meist 25 °C, das heißt 298.15 K)
float b=1700.; // Materialkonstante aus Datenblatt. Sie liegt etwa zwischen 1000 und 5000 K
// für die kleinen schwarzen Popel auf dem KY-013 ca. 1700
float t; // Temperatur in Kelvin
float gradC; // Temperatur in Grad Celsius
while (1) {
rt=analogRead(PinData);
t=1/(1/tn+1/b*log(rt/rn));
gradC=t-273.15;
MFS.write (gradC);
delay(500);
}
}