Arduino Lektion 84: NTC-Widerstand (Heißleiter)

Ein NTC-Widerstand (Negative Temperature Thermistor) ist ein temperaturabhängiger Widerstand. Durch eine Spannungsteilerschaltung kann man mit diesem Bauelement die Temperatur messen.

NTC-Widerstand (Thermistor)
NTC-Widerstand (Thermistor)

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.

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.

Arduino UNO - Thermistor (NTC-Widerstand) Schaltung
Arduino UNO – Thermistor (NTC-Widerstand) Schaltung

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,
Arduino UNO , Schaltung mit Thermistor
Arduino UNO , Schaltung mit Thermistor

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)

10 Kommentare

    1. 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

  1. 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?

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert