Das Set enthält zwei solcher Module. Beide Module benutzen den gleichen Heißleiter. Eines davon hat aber zusätzlich einen Komparator der abhängig von der Potentiometer-Einstellung bei einer bestimmten Temperatur den Digital Ausgang auf Null legt. Amm Analog Ausgang steht praktisch das gleiche Signal wie beim einfachen Sensor zur Verfügung.
Einfacher Sensor
Sensor mit Komparator
Kennlinie
Der NTC ist ein Widerstand der bei Erwärmung den Widerstandswert senkt. Um mit dem NTC Temperaturen zu messen und nicht nur bei einer bestimmten Temperatur zu schalten, braucht man die Kennlinie. Das Diagramm zeigt den Widerstandswert in kOhm (blau) und den (1024 – Ausgangswert) gelesen mit analogRead (rot);
Man sieht durch den verwendeten Spannungsteiler ist die Ausgangsspannung stückweise Linear.
Ermittlung einer Korrekturkurve:
Mit einer einfachen Schaltung können wir versuchen eine Korrekturkurve zu ermitteln. Dazu verwenden wir den einfachen Heißleiter-Sensor und den DS18B20 als Referenz. Wir verbinden die mittleren Pins beider Module mit +5V am Arduino und die – Pins beider Module mit GND. Den S-Pin des NTC-Moduls verbinden wir mit A0 und den S-Pin des DS18B20 Moduls mit D2. Damit wir eine möglichst gleiche Temperatur für beide Sensoren bekommen verbinden wir diese wie das folgende Bild zeigt.
Nun laden wir das folgende Programm auf den Arduino. Und verbinden den Pin 8 am Arduino mit Ground um die Ausgabe zu unterbinden.
* Heißleiter und testet sie anschließend
* Als Referenz wird ein Sensor vom Typ DS18B20 benutzt
*/
#include <OneWire.h>
#include <DallasTemperature.h>
//Anschlüsse
const byte ds18b20 = 2; //referenz sensor
const byte sensor = 0; //zu eichender Sensor
const byte ausgabe = 8; // Eingang um die Ausgabe zu unterdrücken.
const byte led = 13; //messled
//instanzen für Referenz sensor DS18B20
OneWire oneWire(ds18b20);
DallasTemperature sensoren(&oneWire);
DeviceAddress adr;
//zum Speichern der korrekturdaten erzeugen wir eine eigene Klasse
class Korr {
public:
int minval; //Anfangswert der Gültigkeit
int maxval; //Endwert der Gültigkeit
float faktor; //Korrekturfaktor
float delta; //relativer Offset
float temperatur(int val) {
float temp = float(val) * faktor + delta;
return temp;
}
};
//globale Variablen
Korr kurve [20]; //Array mit Korrekturwerten
byte anzahl = 0; //Anzahl der vorhandenen Korrekturwerte
byte messung = 1;
float soll = 0; //aktueller Sollwert
int sens = 0; //aktueller Sensorwert
float soll_alt = 0; //letzter Sollwert
float sens_alt = 0; //letzter Sensorwert
void setup() {
//seielle schnittstelle starten
Serial.begin(115200);
//Referenzsensor vorbereiten
sensoren.begin();
sensoren.getAddress(adr, 0);
// Auflöung auf 10 bit;
sensoren.setResolution(adr, 10);
//output für led
pinMode(led, OUTPUT);
pinMode(ausgabe, INPUT_PULLUP);
messung = 1; //wir sind im mess modus
//einmal Messung für die Startwerte
Serial.println("Starte Analyse");
messwerte();
soll_alt = soll;
sens_alt = sens;
}
//funktion zum Lesen der Messwerte
void messwerte(){
//Referenzwert anfordern
sensoren.requestTemperatures();
//und vom Prüfling lesen
//da die Spannung mit zunehmender Temperatur abnimmt
//kehren wir den Wert um indem wir ihn vom Maximalwert abziehen
sens = 1024-analogRead(sensor);
//Referenzwert lesen
soll = sensoren.getTempC(adr);
}
void loop() {
//zustand anzeigen
digitalWrite(led,messung);
//werte ermitteln
messwerte();
if (messung) {
//wir prüfen ob wir einen bestimmten Unterschied erreicht haben
//Teilabschnitt alle 5 °C
if ((soll-soll_alt) >= 5) {
Serial.print("Berechnung für ");
Serial.print(soll);
Serial.println(" °C");
kurve[anzahl].minval = sens_alt;
kurve[anzahl].maxval = sens;
float faktor = (soll-soll_alt)/float(sens-sens_alt);
kurve[anzahl].faktor = faktor;
kurve[anzahl].delta = soll - (sens * faktor);
soll_alt = soll;
sens_alt = sens;
anzahl++;
}
if (soll > 50) {
messung = 0;
Serial.println("Analyse abgeschlossen");
for (byte i = 0; i<anzahl; i++) {
Serial.print(kurve[i].minval);
Serial.print(" - ");
Serial.print(kurve[i].maxval);
Serial.print(" - ");
Serial.print(kurve[i].faktor);
Serial.print(" - ");
Serial.println(kurve[i].delta);
}
delay(5000);
}
} else {
byte i = 0;
if (sens > kurve[0].minval) {
while ((sens > kurve[i].maxval) && (i<anzahl)) i++;
}
if (digitalRead(ausgabe)==1)
{
/* Zur Überprüfung der Funktion hilfreich
Serial.print("Gefunden: Min = ");
Serial.print(kurve[i].minval);
Serial.print(" Max= ");
Serial.print(kurve[i].maxval);
Serial.print(" Fakt= ");
Serial.print(kurve[i].faktor);
Serial.print(" Delta= ");
Serial.print(kurve[i].delta);
Serial.print(" Fühler= ");
Serial.println(sens);
*/
float ist = kurve[i].temperatur(sens);
Serial.print("Messwerte: Soll = ");
Serial.print(soll);
Serial.print(" Ist= ");
Serial.print(ist);
Serial.print(" Abweichung= ");
Serial.println(soll-ist);
}
delay(1000);
}
Nach dem Start ist das Programm im Analyse Modus, das heißt immer wenn die Temperatur um 5 °C angestiegen ist wird die Steigung und der Offset berechnet und in einer Tabelle gespeichert. Dies geschieht solange bis die Temperatur 50 °C übersteigt.
Die Temperaturänderung erreicht man am einfachsten mit einem Föhn. Man muss aber darauf achten, dass die Erwärmung nicht zu rasch erfolgt, da die beiden Sensoren eine unterschiedliche Trägheit haben.
Wenn eine Temperatur von 50 °C erreicht wurde, erhält man am seriellen Monitor den Inhalt der Korrekturkurve angezeigt. Ab jetzt können Sollwert, Istwert und Abweichung angezeigt werden. Da die Anzeige unterdrückt wurde (Pin 8) damit man die Ergebnisse der Analyse betrachten kann, ist es notwendig den Pin 8 von GND zu trennen.
Bei meinen Versuchen war ich mit dem Ergebnis nicht zufrieden. Eventuell war die Temperaturänderung während der Analyse zu rasch.
Viel Spaß beim experimentieren.