Anfängeranfrage: Temperatursensor von iteadstudio.com --> Grad C berechnen

Ich habe hier den Temperatursensor von iteadstudio zu liegen. Es gibt aber kein vernünftiges Beispiel um die AD-Werte in Grad Celsius umzurechnen. Hat sich jemand damit schon Versucht? Ich habe folgende Lösung , bin aber unsicher ob es so richtig ist.

/*
Temperatur sensor von iteadstudio.com

TTC3A103 34D 10kohm bei 25 C
Vcc*0,09= delta Uth

*/
int sensorPin = A0;

void setup()
{
  Serial.begin(19200);
}

void loop()
{
 //ließt den AD-Wert 0...1024
 int reading = analogRead(sensorPin);  

 // umrechnen des ADWertes in Volt
 float voltage = (1024-reading) * (5.0/1024);


 // Ausgabe der Meßwerte
 Serial.print(voltage); Serial.print(" Volt");Serial.print(" --> ");

 // Ausgabe der Meßwerte

float temperatureC = (voltage * 0.09 *100);         // Vcc*0,09= delta Uth
 Serial.print(temperatureC); Serial.println(" in C");

  
 delay(2000);
}

Die Raumtemperatur wird so richtig angezeigt. Aber... Gibt es bessere Lösungen?

http://forum.arduino.cc/index.php?topic=155733.msg1170722#msg1170722

Der Verlauf ist logarithmisch. Das muss man berücksichtigen! Die Konstante B erhält man aus dem Datenblatt (bin mal nach deinem Kommentar gegangen und habe nach TTC3A103 gesucht): http://cika.com/soporte/Information/Varios/Termistores%28NTC%29/TKS-TTC03.pdf

Danke für die ausführliche Antwort (Links).

Lang lang ist es her 8) . (30 J.)

Das hilft mir sehr weiter. Werde es noch ausprobieren, .....

Danke

Hier noch den Link zum Temperatursensor: http://imall.iteadstudio.com/prototyping/electronic-brick/sensor-brick/im120710010.html (2014)

Das ist dabei rausgekommen.

/*
Temperatur sensor von iteadstudio.com

TTC3A103 34D 10kohm bei 25 C
Vcc*0,09= delta Uth
VCC 5.0 V / 3.3 V
bei 5.0 V --> 5mA

float T0=25.0;    // Nenntemperatur des NTC-Widerstands in °C
float R0=10000.0; // Nennwiderstand des NTC-Sensors in Ohm
float T1=100.0;   // erhöhte Temperatur des NTC-Widerstands in °C
float R1=1000.0;  // Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
                    // T1 / R1 --> R-T Diagramm vom Hersteller
float Vorwiderstand=10000.0; // Vorwiderstand in Ohm aus Schaltplan vom Hersteller


*/


// NTC temperature calculation by "jurs" for German Arduino forum

#define ABSZERO 273.15
#define MAXANALOGREAD 1023.0
#define ANALOGPIN A0

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



void loop()
{
  float T0=25.0;    // Nenntemperatur des NTC-Widerstands in °C
  float R0=10000.0; // Nennwiderstand des NTC-Sensors in Ohm
  float T1=100.0;   // erhöhte Temperatur des NTC-Widerstands in °C
  float R1=1000.0;  // Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
                    // T1 / R1 --> R-T Diagramm vom Hersteller
  float Vorwiderstand=10000.0; // Vorwiderstand in Ohm aus Schaltplan vom Hersteller
  
  float temp;   
  int aValue=analogRead(ANALOGPIN);
  
  float voltage = aValue * (5.0/1023);
  Serial.print(voltage); Serial.print(" Volt");Serial.println(" --> ");
  
  // 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=3435 aus Typenblatt TTC03 Series;
  temp=temperature_NTCB(T0, R0, 3435, Vorwiderstand, aValue/MAXANALOGREAD);
  Serial.print("NTCB: ");
  Serial.print(temp);
  Serial.println(" C");
  Serial.println("------------------");
  delay(2000);
}

Ich hatte hier weniger als 2 Grad unterschied zu einem Hg-Thermometer

Du brauchst nur die erste Variante mit der Konstante B

Die zweite Methode ist wenn man B nicht kennt und die Kurve statt dessen durch zwei bekannte Punkte legt. Mit B braucht man nur einen Punkt, der ebenfalls im Datenblatt steht.

Ja das ist richtig. Ich habe beide Varianten ausprobiert. Es gibt da einen kleinen Unterschied von 0,01-0,02 Grad :D. Also nicht wichtig. Ich ziehe aber die Konstante B vor. Da fällt der "Messfehler" etwas geringer aus.

Die Erklärung war super.

Danke noch einmal

SDL-Amiga: Ich ziehe aber die Konstante B vor. Da fällt der "Messfehler" etwas geringer aus.

So ein Messfehler ist bei nicht kalibrierten, analogen Sensoren leider unvermeidbar, denn die Bauteile haben ja Toleranzen.

Wenn bei Deinem Spannungsteiler aus 10K vorwiderstand und 10K (@25°C) NTC-Widerstand beide Widerstände 1% Toleranz haben, und beide Toleranzen sind maximal und entgegengesetzt, dann kannst Du bei einer Messung bis zu maximal 2% Abweichung bei der gemessenen Temperatur bekommen.

Immer bezogen auf die absolute Temperatur. Also 20°C = (273,15+20) K = 293.15 K Wenn Du bei der Temperatur 2 Grad Abweichung hast, sind das prozentual nur 2/293.15 = 0,0068 = ca. 0,7%

Das ist verglichen zu theoretisch möglichen 2% Abweichung bei ungünstigen Toleranzen der Bauteile gar nicht mal schlecht.

Um noch genauere Werte errechnen zu können, müßtest Du die exakten Widerstände der Bauteile - einschließlich Toleranzen - genau ausmessen und statt des Nennwertes von 10000,0 Ohm dann vielleicht eher mit 9973 oder 10029 Ohm rechnen müssen oder was der Widerstand tatsächlich für einen Wert hat.

Ein geringer systematischer Fehler kommt außerdem noch drauf, den ich nicht berücksichtige. Und zwar mißt Du vom Prinzip her systematisch zu hohe Temperaturwerte, weil Du ständig Strom durch den Sensor schickst. Dieser Messstrom bewirkt, auch wenn er noch so klein ist, stets auch eine kleine Eigenerwärmung des Sensors. Bei einer 1:1 Spannungsteilung @25°C kannst Du das ja mal überschlagen, wieviel das ausmacht: Bei 1:1 Spannungsteilung fallen am Sensor 2,5V Spannung ab. Dies entspricht bei 10K Widerstand einem Stromfluss von: I = U/R = 2,5/10000 = 0,00025 Ampere. Dies entspricht einer "Heizleistung" des Sensors von P = U*I = 2,5V * 0,00025A = 0,000625 Watt = 0,625 mW (Milliwatt)

Und um wieviel wird der Sensor nun wärmer, wenn er mit 0,625 mW geheizt wird? Im Datenblatt http://www.electan.com/datasheets/TTC03.pdf Deines Sensors findest Du dort einen Hinweis in Form der "Thermal dissipation constant"?, die in "mW/°C" angegeben ist. Tabellenwert: ?2.5 mW/°C.

D.h. eine Verlustleistung von >2.5 mW führt zu einer Eigenerwärmung um 1°C.

Deinen konkreten Wert eingesetzt also: Eigenerwärmung = (0,625 mW) / ( 2.5 mW/°C) = 0,25°C

Diesen Betrag von 0,25°C müßtest Du bei einer Temperatur von 25°C von dem Messwert noch abziehen, den Du mit meiner Formel ermittelt hast, um die Eigenerwärmung des Sensors in Abzug zu bringen. Denn meine Formel berücksichtigt die Eigenerwärmung des Sensors durch den Messstrom nicht (für viele Sensoren liegen dafür auch gar keine Datenblattwerte vor).

Und gegenüber den möglichen Fehlern durch 1% Toleranz bei den Widerstandswerten ist das auch nur eine sehr kleine Fehlerkomponente. Aber immerhin: Ein Viertelgrad ist ein Viertelgrad.

Wenn man wollte, könnte man meine Formeln noch um die ? (Delta) Komponente erweitern, um auch mit der Rechenfunktion und Delta als übergebenem Parameter den Temperaturwert um die Eigenerwärmung zu korrigieren.

Daran habe ich noch nicht gedacht. Ich wollte 1 Grad abziehen wegen der Verlustleistung am Widerstand.

Der DeltaWert (Vcc*0,09= delta Uth) hat den welche Bedeutung? Ich hatte ihn als Korrekturfaktor einbezogen:

float temperatureC = (voltage * 0.09 *100); // Vcc*0,09= delta Uth

Das hatte ja auch bei Raumtemperatur funktioniert.

Das nimmt aber an dass Widerstand und Temperatur einen linearen Zusammenhang haben. Was falsch ist.

Ja, und darum hatte bedenken ob mein Ergebnis richtig ist. Nur habe ich Wissenslücken, bedingt durch nicht anwenden.

delta Uth müsste ja die Thermospannung sein?

Das ist hier genau genommen der falsche Ausdruck. Von Thermospannung redet man z.B. bei Thermoelementen, die wirklich von sich aus eine Spannung erzeugen: http://de.wikipedia.org/wiki/Thermoelektrizit%C3%A4t

Dein Sensor ist lediglich ein Temperatur-abhängiger Widerstand. Den betreibt man an einer festen Spannung (hier 5V), mit einem festen Widerstand als Spannungsteiler und misst die Spannung die an ihm abfällt.

Deine Rechnung war vielleicht in einem sehr begrenzten Bereich halbwegs richtig, aber wäre dann irgendwann falsch geworden.

Ich bedanke mich noch einmal für die Antworten.
War sehr Hilf- und Lehrreich.

Ich habe mal nachgerechnet. aValue=0 und aValue=1023 müssen als Fehlerwerte abgefangen werden. (0/n ?? und div/0) Das sind aber Temperaturen, für die der Sensor nicht vorgesehen ist (-40 .. 130 Grad C) ;) Mit dem abziehen von 0,25 Grad und voltage*0,09 passen die berechneten Werte recht gut. (Serial.print(temp-0.25-(voltage*0,09)); )