Scherheinz:
Das wäre super! Ich versuche mir halt immer über Excel was herzuleiten, aber selbst wenn das klappt ist es noch schwierig das Ganze in den Arduino zu bekommen
So hier zunächst mal die Herleitung der Formeln. Um weitgehend konform mit den Datenblättern der NTC-Hersteller zu sein, bezeichne ich im folgenden die Nenntemperatur des NTC als T0, den Nennwiderstand als R0 (also etwas abweichend wie oben bei der Herleitung der Materialkonstanten B).
Die Schaltung: Temperatur-Messschaltung mit NTC/Thermistor
VB --------------- Ground 0V
5V RV | RN
|
|
VA
Analogeingang
am Arduino
mit
VB = Betriebsspannung des Arduino (irgendwo bei ca. 5V)
RV = Vorwiderstand
RN = Widerstand des NTC (temperaturabhängig!)
VA = Spannung am Arduino-Messeingang
Es gelte die vereinfachte Annahme, dass der Analogeingang des Arduino so hochohmig sei,
dass dort kein Strom hindurchfließt, sondern der Strom rein von VB über den Vorwiderstand,
und den NTC-Widerstand nach Ground fließe.
Dann gilt jeweils das Ohmsche Gesetz (U=R*I):
VA = RN*I
VB = (RV+RN)*I |Gleichungen dividieren
VA/VB= (RN*I)/((RV+RN)*I) |I kürzen
VA/VB= RN/(RV+RN) |*(RV+RN)
VA/VB*(RV+RN)= RN |weiter umformen
RVVA/VB + RN VA/VB = RN
RVVA/VB = RN - RNVA/VB
RV*VA/VB = RN(1-VA/VB)
RN= RV*VA/VB / (1-VA/VB) ==> Formel für den Widerstand des NTC-Widerstands!
Weiter geht's mit einer Formel aus dem NTC-Datenblatt eines beliebigen Herstellers von NTC-Widerständen
T = T0 * B / (B + T0 * ln(RN / R0))
Falls die Materialkonstante B aus einem Datenblatt bekannt ist, kann man diese zur Berechnung verwenden. Und falls man nur zwei Wertepaare aus Temperatur und Widerstand hat, kann die Konstante selbst berechnet werden. Ich habe deshalb mal zwei Funktionen gemacht, und zwar zur Verwendung bei bekannter Materialkonstante B aus einem Datenblatt:
float temperature_NTCB(float T0, float R0, float B, float RV, float VA_VB)
Und falls man die Materialkonstante B nicht hat, aber dafür zwei Wertepaare für Temperatur und Widerstand:
float temperature_NTC(float T0, float R0, float T1, float R1, float RV, float VA_VB)
Die einzelnen Parameter sind im Code nochmal erklärt. Die Variable "VA_VB" bezeichnet das Verhältnis aus Spannung am NTC geteilt durch die Betriebsspannung. Praktischerweise ermittelt der Aruino genau dieses Verhältnis in 1024 Schritten, so daß man an der Stelle einfach den Messwert des Analogpins geteilt durch den Maximalwert 1023.0 (das .0 damit es eine Float-Variable wird) übergeben kann.
Vielleicht mag mal jemand den Code testen. Ich habe gar keinen NTC hier.
// NTC temperature calculation by "jurs" for German Arduino forum
#define ABSZERO 273.15
#define MAXANALOGREAD 1023.0
float temperature_NTCB(float T0, float R0, float B, float RV, float VA_VB)
// Ermittlung der Temperatur mittels NTC-Widerstand
// Version der Funktion bei gegebener Materialkonstante B
// Erklärung der Parameter:
// T0 : Nenntemperatur des NTC-Widerstands in °C
// R0 : Nennwiderstand des NTC-Sensors in Ohm
// B : Materialkonstante B
// Vorwiderstand: Vorwiderstand in Ohm
// VA_VB : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Temperatur
{
T0+=ABSZERO; // umwandeln Celsius in absolute Temperatur
float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
return T0 * B / (B + T0 * log(RN / R0))-ABSZERO;
}
float temperature_NTC(float T0, float R0, float T1, float R1, float RV, float VA_VB)
// Ermittlung der Temperatur mittels NTC-Widerstand
// Version der Funktion bei unbekannter Materialkonstante B
// Erklärung der Parameter:
// T0 : Nenntemperatur des NTC-Widerstands in °C
// R0 : Nennwiderstand des NTC-Sensors in Ohm
// T1 : erhöhte Temperatur des NTC-Widerstands in °C
// R1 : Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
// Vorwiderstand: Vorwiderstand in Ohm
// VA_VB : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Temperatur
{
T0+=ABSZERO; // umwandeln Celsius in absolute Temperatur
T1+=ABSZERO; // umwandeln Celsius in absolute Temperatur
float B= (T0 * T1)/ (T1-T0) * log(R0/R1); // Materialkonstante B
float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
return T0 * B / (B + T0 * log(RN / R0))-ABSZERO;
}
void setup()
{
Serial.begin(9600);
}
#define ANALOGPIN A2
void loop()
{
float T0=60; // Nenntemperatur des NTC-Widerstands in °C
float R0=221.2; // Nennwiderstand des NTC-Sensors in Ohm
float T1=120; // erhöhte Temperatur des NTC-Widerstands in °C
float R1=36.5; // Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
float Vorwiderstand=100; // Vorwiderstand in Ohm
float temp;
int aValue=analogRead(ANALOGPIN);
// Berechnen bei unbekannter Materialkonstante
temp=temperature_NTC(T0, R0, T1, R1, Vorwiderstand, aValue/MAXANALOGREAD);
Serial.print("NTC : ");Serial.print(temp);Serial.println(" C");
// Berechnen bei bekannter Materialkonstante B=3933;
temp=temperature_NTCB(T0, R0, 3933, Vorwiderstand, aValue/MAXANALOGREAD);
Serial.print("NTCB: ");Serial.print(temp);Serial.println(" C");
delay(1000);
}