Calcul thermistance (Steinhart-Hart)

Bonjour,
nouveau dans la communauté Arduino avec ma Mega, n’étant pas doué en Math je galère avec une thermistance et la relation de Steinhart-Hart pour pouvoir afficher précisément(+-0.5°C) la T° ambiante.
J'ai déja effectué quelques mesures à diverses T° mais je ne sais pas comment calculer les inconnues A B et C pour les mettre dans le code de la carte:

float A = ?????????, B = ????????, C = ????????;
float logRt,Rt,T;
Vo = analogRead(ThermistorPin);
Rt = R*( 1023.0 / (float)Vo - 1.0 );
logRt = log(Rt);
T = ( 1.0 / (A + B*logRt + C*logRt*logRt*logRt ) -273.15);//-273.15 est la conversion de Kelvin en °C

seules données dont je dispose sur la Thermistance:
Couleurs: Marron, Noir, Jaune, Orange (100KOhm)
Mesures:
210Kohm à 1°C
125Kohm à 19.7°C
104Kohm à 25°C
72Kohm à 42°C

Merci pour votre aide!!!

Normalement les paramètres A, B, C sont dans les docs constructeur.

Bonjour,
Je ne sais rien de plus sur ce composant, je l'ai récupéré sur un programmateur de T° d’intérieur.
Il est de forme Tantale.

Sinon bon, excel courbe de tendance ... Et voila : y = 0.0572x2 - 5.8363x + 215.99
R² = 0.9994

Pris de vitesse j'allais proposer la même chose.
A signaler mieux qu'Excel qu'un tableur -> Qtiplot : des énormes possibilités pour approximer une courbe.
De plus gratuit, opensource et disponible multi-plateforme : Mac, Linux et Windows.

Remarques :

  • La relation de Steinhart-Hart n'est qu'une modélisation, elle à donc ses limites.
  • Pour ce genre d'approximation il est préférable de limiter la gamme de température au strict nécessaire, peut-être même il faudra approximer par zone de températures.
  • Plus il y a de points de mesure mieux cela vaut : 4 points c'est vraiment limite pour la précision que tu recherches.

Merci pour vos réponses mais je ne vous suis pas, si il me faut d'autres points c'est pas un problème, je vais faire d'autres mesures mais après comment calculer A B et C?
Quelles serait les meilleures mesures? combien en faut il?
Sachant que je vais mesurer une plage allant de -15 à +40.

B@tto:
courbe de tendance ... Et voila : y = 0.0572x2 - 5.8363x + 215.99
R² = 0.9994

C'est quoi? Comment l'utiliser?

:drooling_face:

Bonjour

je ne sais pas comment calculer les inconnues A B et C

la page Wikipedia sur la relation de Steinhart-Hart (Relation de Steinhart-Hart — Wikipédia ) détaille la méthode de calcul des trois coefficients A, B et C à partir de 3 points de mesure.

Les températures sont à mettre en °Kelvin
-calculer L1,L2 et L3
-calculer Y1,Y2 et Y3
-calculer gamma2 et gamma3
-calculer les coefficients C, B et A

Courbe de tendance :
Reprenons la courbe que B@tto t'as donné :
y = 0.0572x2 - 5.8363x + 215.99
Cela provient d'un tableur donc c'est des notations mathématiques.
il suffit de convertir en variables physiques :
y = valeur de la température en degrès -> T
x = valeur de la thermistance en Ohms -> Rth

Soit T=0.0572Rth2 - 5.8363Rth + 215.99

Le principe de la "courbe de tendance" :
On fait des mesures et on trace la courbe correspondante : ici c'est Valeur en ohms en fonction de la température
Avec la "courbe de tendance" on va chercher à être "au plus prés" de la courbe des mesures mais avec des fonctions mathématiques.
Ici B@tto a cherché à approximer avec le polynôme : y=a2x2 + a1x +a0
Le coefficient de R² = 0.9994 est très proche de 1 il n'est pas utile d'utiliser un polynôme de degrés supérieur.
D'autres fonctions mathématiques sont possibles, par exemple la relation Steinhart-Hart utilise des exponentielles.

Le fait d'avoir une équivalence avec des fonctions mathématiques va permettre de pouvoir calculer la température pour n'importe qu'elle valeur de la thermistance.

Pour revenir à la modélisation Steinhart-Hart voici une feuille de calcul des coefficients A,B et C qui semble etre OK :
http://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCcQFjAA&url=http%3A%2F%2Fwww.unb.ca%2Fcivil%2Fhydro%2FS-H%2520coefficients.xls&ei=lNSgUI63JYyWhQfm14HYBw&usg=AFQjCNELZfbU8hJ-SJVITGUqpEmAuikk9g
ci dessous : coeffs obtenus à partir des relevés de mesure à 1°C, 25°C et 42°C

S-H coefficients.xls (48.5 KB)

Bon,
après 2 aspirines !! $) et de multiples essais, la T° affichée est toujours erronée :~
J'ai mis les valeurs A B et C résultat du calcul que vous m'avez posté, j'ai également pris une nouvelle mesure (16.3°C = 134KOms).
Je pense que mon code (trouvé sur la toile) doit avoir une erreur !?
Avec mon code j'ai une T° de 269.8° au lieu de 19.5°
Encore merci à tous pour votre aide, je n'en espérais pas tant pour un nouveau venu !!

int ThermistorPin = 1; // Entree analogique de la sonde
int Vo; // lecture de la tension délivré par la thermistance
float R = 5800.0; //Résistance du diviseur de Tension
float logRt,Rt,T;
float c1 = -8.1470e-3, c2 = 1.2598e-03,c3 =-1.9802e-06; //1° , 25° et 42°
Vo = analogRead(ThermistorPin);
Rt = R*( 1023.0 / (float)Vo - 1.0 );
logRt = log(Rt);
T = ( 1.0 / (c1 + c2*logRt + c3*logRt*logRt*logRt )-273.15 );//-273.15 est la conversion de Kelvin en °C
Serial.print(" "); Serial.print(Vo);
Serial.print(" "); Serial.print(Rt);
Serial.print(" "); Serial.println(T);

Pourquoi float R = 5800.0; ?
Le programme d'origine était conçu pour quelle valeur de thermistance et quelle valeur de résistance mise en série ?
Souvent dans les exemples c'est 10K et 10K. Si c'était le cas il faudrait, pour transposer, mettre une résistance de 100K, égale à celle de la thermistance et écrire float R = 100000.0;
Un lien vers le programme d'origine ?

Pour info : le programme 'élaboré et nettoyé' du Playground Arduino avec 'pad' = Résistance série mesurée et 'thermr'=résistance nominale de la thermistance utilisée. Arduino Playground - Thermistor2

Et puis il y a de fortes chances que ta formule retourne la température en degrés Kelvin.

Il faut introduire cette conversion :

°C = (°F - 32) / 1.8

Et voir si les résultats retournés sont correctes.

Jean-François:
Il faut introduire cette conversion :

°C = (°F - 32) / 1.8

Et voir si les résultats retournés sont correctes.

salut JF
ça c'est pour convertir du °C en °F
pour convertir du K en °C c'est ) °C=K-273.15

Arfff... un peu trop pressé de répondre :grin:

Bon alors voila ou j'en suis:
J'ai pris comme conseillé plus haut le code de Playground Arduino avec comme résistance un potar que j'ai réglé à 10K avec le code:

double Thermister(int RawADC) {
 double Temp;
 Temp = log(((10240000/RawADC) - 10000));
 Temp = 1 / (-8.1470e-3 + (1.2598e-03 + (-1.9802e-06 * Temp * Temp ))* Temp );
 Temp = Temp - 273.15;            // Convert Kelvin to Celcius
 return Temp;
}

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

void loop() {
   Serial.println(int(Thermister(analogRead(1))));  // display Fahrenheit
  delay(100);
}

La température ambiante (19.7°) est affiché 273° dans le moniteur.
J'ai refait la même chose mais en réglant la Résistance à 90K (Max du potar) et modifier Temp = log(((10240000/RawADC) - 100000));
Là la T° est de 0 même si je supprime la ligne de conversion K to C°.

=( =( =( =(

Testé vite fait à l'instant => résultat OK, valeur température ambiante en °C OK

-thermistance 47K sans doc technique + résistance 100K
-3 mesures de résistance à 7°C, 21°C et 40°C
-Report des mesures dans le tableau Excel indiqué au Reply#8 -> valeurs des coefficients A, B et C (cf copie écran)
La feuille de calcul à été récupérée içi : www.unb.ca/civil/hydro/S-H%20coefficients.xls
Lien maintenant invalide : feuille de calcul jointe ci-dessous
-cablage : Thermistance entre Vcc et A0, résistance de 100K entre A0 et la masse
-3ème programme du playground (Arduino Playground - Thermistor2)
(valeur 100K en ligne 34, 3 coefficients en ligne 44, voir programme "thermistance.ino" joint)

thermistance.ino (2.35 KB)

S-H coefficients.zip (301 KB)

code fonctionnel avec coefficients issus de la feuille de calcul proposée au message précédent.

Modifier Rserie ainsi que A,B et C selon composants

/*

 Mesure de température par thermistance
 
 Playground : http://www.arduino.cc/playground/ComponentLib/Thermistor2
 Programme n°3
  
 Thermistance modélisée par la "relation de Steinhart-Hart"
 Coefficients A,B et C obtenus par calcul à partir de 3 mesures de résistance
 Feuille de calcul Excel : http://www.unb.ca/civil/hydro/S-H%20coefficients.xls

  Câblage : Vcc ----- [Therm] ------ A0 ------[Rserie] ------ GND
 
 */

#include <math.h>

#define ThermistorPIN 0                // Thermistance entre Vcc et A0

float Rserie = 100000;                 // valeur Résistance entre A0 et GND

// caractérisation de la thermistance de 47k
float A = -0.0032265;                  // coefficients Steinhart-Hart de la thermistance de 47k
float B =  0.0007698;                  // doc technique ou calcul à partir de 3 mesures
float C = -0.0000013808;


float Thermistor(int RawADC) {
  long Resistance;  
  float Temp;  // Dual-Purpose variable to save space.

  Resistance=((1024 * Rserie / RawADC) - Rserie); 
  Temp = log(Resistance); // sauver le log de la résistance mesurée
  Temp = 1 / (A + (B * Temp) + (C * Temp * Temp * Temp));
  Temp = Temp - 273.15;  // Kelvin -> Celsius                      

  return Temp;                                      
}

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

void loop() {
  float temp;
  temp=Thermistor(analogRead(ThermistorPIN));       // read ADC and  convert it to Celsius
  Serial.print("Celsius: "); 
  Serial.print(temp,1);                             // display Celsius
  Serial.println("");                                   
  delay(2000);                                      // Delay a bit... 
}

Ayant tous re-contrôlé plusieurs fois j'en suis venue à incriminer mon entrée, ce que je ne vous ai pas dis c'est qu'il y a une carte réseau sur ma mega.
Je l'ai déposé pour laisser la Mega seule et là ça fonction impec!!
J'en déduit que si la 1307 est connectée les ports Analogiques de 1à 5 sont Ko, normal?
Je me console en me disant que j'ai acquis pas de chose sur le coup!!
Désolé pour ceux qui se sont creusé la tête pour me dépanner !!
Merci à tous !!

Personne n'a eu le cas après connexion de l’ethernet shield que les port analogique de 0 à 5 soit erronés?
Es-ce mon ethernet shield qui est KO?
Sur une Uno où il y à moins de port il ne reste que la 6 et 7 de dispo? :roll_eyes: