Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ)

uwefed:
Das Problem ist daß der PTC den Widerstand nicht linear mit der Temperatur ändert.

Das ist normalerweise kein Problem, wenn er ein Multimeter mit möglichst genauem Widerstandsmessbereich hat. Und es ist ein NTC Widerstand (siehe unten).

Dann braucht er nur bei zwei möglichst genau bestimmten Temperaturen den Widerstand seiner VDO-Messschraube auszumessen und kann sich leicht die Formel ermitteln, mit deren Hilfe er dann JEDE Temperatur aus den Messungen mit seinem Arduino ausrechnen kann.

Die Kennlinie eines NTC ist zwar nicht linear, aber praktisch trotzdem durch Messung an zwei Temperaturpunkten zu ermitteln, aufwändiger ist das gar nicht, denn es besteht ein logarithmischer Zusammenhang.

VDO-Schraube in 0° kaltes Wasser hängen ==> Widerstand bei 0° messen
VDO-Schraube in kochendes Wasser hängen ==> Widerstand bei 90° bis 100° messen (je nach Höhenlage über Meeresspiegel)

Damit ist dann alles klar. Wem nicht, dem rechne ich das mal vor, wie die Kalibrierwerte für die Formel ermittelt werden, und wie man aus dem Arduino mit Mess-Vorwiderstand und der Formel dann immer die passende Temperatur ausrechnet.

[Edit] Was rede ich eigentlich vom Messen, die Werte für den 150°-VDO-Öltemperaturgeber stehen im Internet, so dass man damit sofort losrechnen könnte:
http://www.temperaturgeber.de/vdo_temperaturgeber_daten.html

Und das mit dem Rechnen mache ich dann auch gleich mal.
Falls Du einen Standard-Sketch für Messungen mit NTCs verwendest, der die NTC Materialkonstante "B" erfordert, hier die Berechnung des Datenblattwerts "B" anhand der Öltemperatur-Sensordaten auf der Webseite (absolute Temperaturen in Kelvin von mir ergänzt):
60°C ==> 333,15K ==> 221,2 Ohm
120°C ==> 393,15K ==> 36,5 Ohm

Formel für die Konstante B
B= (T1 * T2)/ (T2-T1) * ln(R1/R2)

Einsetzen (mit absoluten Temperaturen in Kelvin):
B= (393,15333,15)/(393,15-333,15) ln(221,2/36,5) = 3933

Damit hast Du als Datenblattwerte für den VDO-Sensor zum Einsetzen in einschlägige Berechnungsformeln (wie sie z.B. in den Datenblättern beliebiger NTC-Widerstände genannt werden):
T1 = 333,15 K
R1 = 221,2 Ohm
B = 3933
Die Berechnungsformeln selbst können aus jedem beliebigen Datenblatt eines beliebigen Herstellers von NTC-Widerständen entnommen werden, den Formeln ist es nämlich egal, wenn man in den Formeln die Konstanten eines anderen NTC von einem Fremdhersteller einsetzt.

Wenn das Rechnen das Problem ist, kann ich natürlich noch weiterrechnen und ein paar Zeilen Code dazu schreiben.

1 Like

Hallo!
Ich verstehe nicht ganz wie man aus 2 Punkten eine Kurve berechnet, kannst du deine Rechnung in einem Diagramm oder einer Excel Tabelle zeigen?

Ich hab den Sensor seit zwei Jahren im Auto zur Öltemperatursensor, nutze ihn aber bisher nur als Grenzwertüberwachung. Hatte auch hin und her gerechnet und auch nur die Kurve durch den Spannungsteiler etwas strecken können. So hatte ich einen Messbereich von 70 - 130C° aber immer noch mit einer Toleranz von +/- 2,5C°.

Gruß

Heinz

Scherheinz:
Ich verstehe nicht ganz wie man aus 2 Punkten eine Kurve berechnet, kannst du deine Rechnung in einem Diagramm oder einer Excel Tabelle zeigen?

Tja, wo man doch aus der Mathematik weiß, dass zwei Punkte mal eben so eine Gerade exakt bestimmen können, ist das vielleicht schwer verständlich.

Vielleicht wird es verständlicher, wenn Du folgende Zusatzbedingung hinzumimmst:
Die Widerstandskurve eines NTC-Widerstands verläuft logarithmisch

Und wenn Du diese Zusatzbedingung als bekannt annimmst, kannst Du die Widerstandskurve eines NTC-Widerstands tatsächlich aus nur zwei Punkten der Kurve ermitteln.

Sobald Du zu jeder Temperatur den Widerstand des NTC ("Temperaturfühler") kennst, dann kannst Du aus den Daten der Schaltung für Vorwiderstand, Betriebsspannung und gemessene Spannung jederzeit den aktuellen Widerstand des NTC ermitteln und von diesem widerum mit hoher Genauigkeit auf die aktuelle Temperatur zurückschließen.

Scherheinz:
kannst du deine Rechnung in einem Diagramm oder einer Excel Tabelle zeigen?

Sorry, Diagramm oder Excel-Tabelle, sowas kann ich nicht.

Wenn es Dir reicht, kann ich Dir die noch zusätzlich notwendigen Formeln herleiten, so daß Du am Ende aus den Schaltungsdaten (NTC-Konstante B wie oben vorgerechnet, Vorwiderstand, Betriebsspannung) und dem Meßwert (analogRead am Pin) die Temperatur ausrechnen kannst, direkt in Arduino-Code.

Soll ich mal versuchen, das verständlich zusammenzuschreiben?

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 :wink:

Hab gerade noch was gefunden....

http://e30-talk.com/attachments/elektrik/141061d1352352184-zusatzinstrumente-durchmessen-vergleichen-vdo-temp-geber_kennlinien.pdf

Tach!

Ich mache zur Zeit genau das Gleiche wie Du.

Also die Temp.-Sensoren von Koso sind 10k NTC's.

Ich kann Dir gerne meinen Code zur Verfügung stellen, dann kannst Du mit dem NTC + Spannungsteileraufbau einfach Deine Temperatur errechnen.
Zum Spannungsteileraufbau:
http://www.nextit.de/2011/07/thermometer-mit-arduino/

Hier kannst Du mein Projekt sehen:
http://arduino.cc/forum/index.php/topic,148346.0.html
Am Ende gibts auch nen kleines Video zum Ist-Stand.

Also mein VDO ist ein 1K NTC. Bin gerade dabei mir die Widerstandstabelle anzuschauen

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 :wink:

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);
}

Ich mache das folgender maßen

5V--------2k7 1%----------KTY81/110---------GND

Zwischen dem 2k7 und dem KTY gehe ich zum Analogeingang
da das KFZ Bordnetz Störungen verursacht würde ich noch eine Schutzschaltung für den Analog eingang empfehlen

siehe anhang

KTY81-110.pdf (12.1 KB)

da das KFZ Bordnetz Störungen verursacht würde ich noch eine Schutzschaltung für den Analog eingang empfehlen

Mal abgesehen davon, dass Schutzschaltungen nie schaden,
verstehe ich das so, dass die Schaltung von den 5V des Arduino gespeist wird ( die auch als Aref verwendet werden kann / sollte ).

Zu meinem Versändnis:
Wie kommen da Störungen zustande, vor denen die Zusatz-Schaltung schützen soll ?
(Woher man saubere 5V her kriegt, ist eine andere Frage)

Störungen können zb über die masseleitung kommen
zb von der Zündanlage Zündspulen etc auch die Lichtmaschine kann Störungen im Bordnetz verursachen
wie du saubere 5V bekommst kannst du hier sehen

Spannungsversorgung.pdf (13.9 KB)

@ Jurs
Danke für die Arbeit die du dir gemacht hast! :slight_smile: Ich werde es hoffentlich die Tage testen können und meld mich wenn ich Ergebnisse hab!

Störeinstrahlung muss nichts mit der Versorgungsspannung zutun haben. Wenn z.b. das Sensorkabel neben dem Anlasserkabel liegt kann es zu starker Induktion kommen oder wenn die Zündanlage nicht gut abgeschirmt ist gibt es Einstrahlungen. Den Controller würde ich eh in ein abgeschirmtes Gehäuse bauen.

maeckes:
Tach!

Ich mache zur Zeit genau das Gleiche wie Du.

Also die Temp.-Sensoren von Koso sind 10k NTC's.

Ich kann Dir gerne meinen Code zur Verfügung stellen, dann kannst Du mit dem NTC + Spannungsteileraufbau einfach Deine Temperatur errechnen.
Zum Spannungsteileraufbau:
http://www.nextit.de/2011/07/thermometer-mit-arduino/

Hier kannst Du mein Projekt sehen:
http://arduino.cc/forum/index.php/topic,148346.0.html
Am Ende gibts auch nen kleines Video zum Ist-Stand.

hallo maeckes, da ich gerade auf der koso seite einen sensor gefunden habe (M12xP1.5) der bei mir passen würde, wäre ich dankbar wenn du mir deinen Code zur Verfügung stellen könntest, ich brauch nämlich nur noch den Teil und ich wäre quasi fertig =)

farewell:
hallo maeckes, da ich gerade auf der koso seite einen sensor gefunden habe (M12xP1.5) der bei mir passen würde, wäre ich dankbar wenn du mir deinen Code zur Verfügung stellen könntest, ich brauch nämlich nur noch den Teil und ich wäre quasi fertig =)

Na hoffentlich basiert der Code dann nicht auf dem hier in diesem Thread bereits zum wiederholten male verlinkten Code von der Seite "thermometer-mit-arduino"! Der Arduino-Code zur Temperaturberechnung eines NTC auf der Seite sieht mir nämlich genau so nach Grütze aus wie die Rechtschreibung auch.

zum Beispiel Wieeederstand :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

:stuck_out_tongue: Ja das ist mir auch schon aufgefallen, aber ich kann Euch beruhigen - der Kot äh Code kommt nicht von mir :wink:

Ich wollte damit aber nur den Spannungsteileraufbau zeigen, den ich auch verwende, falls das nicht klar sein sollte.

Ich schicke Dir den Code mal als PN.
Ist noch in der Entwicklung, aber sollte Dir schon mal helfen.

Hab soeben den Code von JURS gestestet und bin mehr als zufrieden!
Die Ausgabe ist sehr genau und ich werde den Code so übernehmen.

Nochmal Dankeschön! :slight_smile:

Scherheinz:
Hab soeben den Code von JURS gestestet und bin mehr als zufrieden!
Die Ausgabe ist sehr genau und ich werde den Code so übernehmen.

Nochmal Dankeschön! :slight_smile:

Danke für's Testen!

Dann sind meine Schulkenntnisse aus dem Physik- und Matheunterricht ja doch noch nicht so ganz eingerostet.
:slight_smile:

Hallo Jurs,

kannst Du Deine Super Formel etwas für mich ändern.
In Exel ????????????

Ich möchte den Wiederstand vorgeben und dann die Temperatur sehen.
Genau wie auch die Temparatur und dann den Widerstand sehen

Hoffe das war ein wenig verständlich

Anlage 1 Exel Datei

Grüße
Ratlos

Ratlos:
kannst Du Deine Super Formel etwas für mich ändern.
In Exel ????????????

Ich möchte den Wiederstand vorgeben und dann die Temperatur sehen.
Genau wie auch die Temparatur und dann den Widerstand sehen

Die Formel ändern kann ich.
Ich hatte Mathe in der Schule bis zur 13. Klasse.

Excel-Formeln kann ich nicht.
Excel kam in der Schule nicht dran.
Und: Ich habe gar kein Excel. Höchstens vielleicht irgendwo ein Open Office.

Hier hatte ich meine Formel hergeleitet:
http://forum.arduino.cc/index.php?topic=155733.msg1170722#msg1170722

Da stehen die verwendeten Abkürzungen erklärt und auch die Formel aus dem NTC-Datenblatt irgendeines NTC-Herstellers:

T = T0 * B / (B + T0 * ln(RN / R0))

In diese Formel kannst Du den temperaturabhängigen Widerstand RN einsetzen und bekommst die Temperatur heraus.

Wenn Du es umgekehrt möchtest, kannst Du die Formel ein wenig umstellen und nach RN auflösen:

  1. Schritt:
    B + T0* ln(RN/R0) = T0 * B / T

  2. Schritt:
    ln(RN/R0) = (T0*B/T - B)/T0

  3. Schritt:
    RN = R0 * exp(B/T -B/T0)

Und nun hast Du eine Formel, wo Du rechts die Temperatur T einsetzen kannst und bekommst links den temperaturabhängigen Widerstand heraus. Die Formel in Excel zu verwenden, sollte nicht so schwierig sein.

Hallo,
bekomme ich nicht so einfach hin.
"Wollte das in EXEL haben"

Mit den Werten von VDO
150°C
Celsi Ohm
-10 5078,36
-5 3879,50
0 2991,26
5 2323,47
10 1819,64
15 1434,17
20 1138,30
25 908,81
30 731,94
35 591,25
40 480,71
45 393,35
50 323,63
55 267,45
60 222,54
65 186,47
70 157,09
75 133,22
80 113,22
85 96,84
90 83,25
95 71,93
100 62,43
105 54,43
110 47,62
115 41,79
120 36,81
125 32,54
130 28,86
135 25,66
140 22,87
145 20,40
150 18,25
155 16,38
160 14,73
165 13,28
170 11,99
175 10,85
180 9,84

Naja werde mal sehen was ich machen kann
Danke für Deine bemühungen
Grüße
Ratlos