Ein NTC-Widerstand (Negative Temperature Thermistor) ist ein temperaturabhängiger Widerstand. Durch eine Spannungsteilerschaltung kann man mit diesem Bauelement die Temperatur messen.
Ein NTC-Widerstand hat einen negativen Temperaturkoeffizienten, d.h. dieses Bauelement leitet bei hohen Temperaturen den elektrischen Strom besser als bei tiefen.
Bezug
Den mir vorliegenden NTC-Widerstand* habe ich über eBay.de für 3,45 € inkl. Versandkosten erstanden.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Technische Daten eines NTC-Widerstand
Die technischen Daten eines NTC-Widerstandes sind sehr übersichtlich, denn dieses Bauelement ist im übertragenen Sinn “nur” ein Widerstand, welcher bei einer Temperaturänderung seinen Widerstandswert ändert. Der Nennwiderstand von 10kOhm wird hier immer bei einer Temperatur von 25 °C angegeben.
Schaltung
Für die nachfolgende Schaltung verwende ich einen 10kOhm NTC-Widerstand und einen 10kOhm Kohleschichtwiderstand. Wenn du einen 100 Ohm NTC-Widerstand verwendest, so musst du auch einen 100 Ohm Kohleschichtwiderstand verwenden usw.
Wie bereits erwähnt ist die Schaltung eine Spannungsteilerschaltung wo man an 2 Punkten die Spannung misst und dann vergleicht.
Aufbau der Schaltung
Für den Aufbau der Schaltung benötigst du:
- 1x Arduino UNO,
- 1x Breadboard mit min 170 Pins, besser noch 400 Pins,
- 1x Kohleschicht / Metallschicht Widerstand mit 10 kOhm,
- 1x NTC-Widerstand mit 10 kOhm,
Programmieren
Ermitteln des Widerstandswertes am analogen Ausgang
Zunächst einmal müssen wir den Wert des NTC-Widerstandes ermitteln. Das Arduino Board hat kein Widerstandsmessgerät verbaut, sondern eher ein Spannungsmesser. Wir können an den analogen Pin Spannungen von max. 5V anlegen und dieses wird uns dann in Werten von 0 bis 1023 wiedergegeben.
Somit ergibt sich erstmal folgender einfacher Sketch zum Ermitteln des Widerstandswertes:
const int ntcWiderstand = 10000; // NTC-Widerstand mit 10 kOhm const int MAX_ANALOG_VALUE = 1023; //An welchem analogen Pin der NTC-Widerstand angeschlossen ist #define PIN A0 void printValue(String text, float value, String text2=""); void setup(void) { //beginnen der seriellen Kommunikation Serial.begin(9600); } void loop(void) { float value = analogRead(PIN); printValue("analog Wert: ", value); // Konvertieren des analogen Wertes in ein Widerstandswert value = (MAX_ANALOG_VALUE / value)- 1; value = ntcWiderstand / value; printValue("NTC-Widerstands Wert: ", value, " Ohm"); delay(1000); } void printValue(String text, float value, String text2=""){ Serial.print(text); Serial.print(value); Serial.println(text2); }
Video
Umrechnen des Widerstandwertes in ein Temperaturwert
Im ersten Schritt haben wir den Widerstandswert des NTC-Widerstandes ermittelt, nun wollen wir diesen Wert in einen Temperaturwert umwandeln. In dem Buch “Sensoren im Einsatz mit Arduino” ist eine relativ einfache Formel abgebildet (leider ohne Erläuterung) in dem Tutorial von Adafruit ist ein Beispiel wie dieses mit der Steinhart-Hart Formel berechnet wird. Ich persönlich finde die Lösung vom Buch deutlich schlanker und lesbarer.
#include <math.h> const int ntcWiderstand = 10000; // NTC-Widerstand mit 10 kOhm const int MAX_ANALOG_VALUE = 1023; //An welchem analogen Pin der NTC-Widerstand angeschlossen ist #define PIN A0 void printValue(String text, float value, String text2=""); void setup(void) { //beginnen der seriellen Kommunikation Serial.begin(9600); Serial.println("Zeit\t\t|Kelvin\t\t|Celsius\t|Ohm"); Serial.println("-------------------------------------------------------------------------"); } void loop(void) { float analogValue = analogRead(PIN); // Konvertieren des analogen Wertes in ein Widerstandswert float resistorValue = (MAX_ANALOG_VALUE / analogValue)- 1; resistorValue = ntcWiderstand / resistorValue; double kelvin = convert2TempKelvin(analogValue); double celsius = convertKelvin2TempCelsius(kelvin); printValue(kelvin, celsius, resistorValue); delay(1000); } double convert2TempKelvin(float value){ double temp = log(((10240000/value) - ntcWiderstand)); temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp)); return temp; } double convertKelvin2TempCelsius(double kelvin){ return kelvin - 273.15; } void printValue(double kelvin, double celsius, float ohm){ Serial.print(millis()); Serial.print("\t\t|"); Serial.print(kelvin); Serial.print(" K \t|"); Serial.print(celsius); Serial.print(" °C\t|"); Serial.print(ohm); Serial.println(" Ohm"); }
Video
Quellen
Für dieses Tutorial habe ich folgenden Artikel aus Wikipedia verwendet. (Die Grundlagen zum NTC-Widerstand werden dort sehr gut erläutert.)
Seite „Heißleiter“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 6. April 2019, 09:33 UTC. URL: https://de.wikipedia.org/w/index.php?title=Hei%C3%9Fleiter&oldid=187287370 (Abgerufen: 26. April 2019, 09:23 UTC)
Des Weiteren habe ich das Tutorial zum Heißleiter von Adafruit verwendet, dort werden die Formeln für das Umrechnen eines Widerstandswertes in einen Temperaturwert gezeigt.
Hier nun der Wikipedia Artikel zur Steinhart-Hart Formel:
Seite „Steinhart-Hart-Gleichung“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 24. April 2018, 05:15 UTC. URL: https://de.wikipedia.org/w/index.php?title=Steinhart-Hart-Gleichung&oldid=176817890 (Abgerufen: 26. April 2019, 18:06 UTC)
Ist dies auch mit 9-12 Temperatur Sensoren machbar?
Hi,
klaro kannst du das, da die NTCs über einen analogen Pin angeschlossen werden sind dir nur die Grenzen deines Microcontroller gesetzt.
Gruß,
Stefan Draeger
Ist die Formel nicht falsch?
Der NTC Widerstand wird bei steigender Temperatur doch niederohmiger, und nicht hochomiger, oder?
LG
Ja ein NTC wird Niederohmiger
const int ntcWiderstand = 10000; // NTC-Widerstand mit 10 kOhm
Diese Zeile impliziert, dass bei einem 100KOhm NTC dort 100000 stehen müsste.
Das habe ich angenommen und bin sehr lange nahezu verzweifelt, weil die Auswertung nur absurde Ergebnisse brachte. Ich habe die Schaltung immer wieder ausgemessen, nach Fehlern in den Lötstellen gesucht, den Vorwiderstand immer wieder durchgemessen… immer nur Murks.
Schließlich habe ich die Thermistor-Schaltung auf einem Breadborad zusammen geschustert, den Arduino Uno an den PC angeschlossen und ausschließlich den hier publizierten Scetch auf den MC hochgeladen. Und natürlich habe ich vergessen aus der 10000 eine 100000 zu machen.
Und was soll ich sagen?
Mit der 10000 als Konstante liefert mir die Schaltung mit einem 100kOhm NTC perfekte Ergebnisse, welche wenn überhaupt nur minimal von Referenzthermometern abweichen.
Da stellt sich mir die Frage, was da los ist.
Irgendeine Idee?
Ich vermute, du hast ein 10kOhm NTC…