Utilisation d’une thermistance NTC en capteur de température

Des calcules théoriques… aux résultats !

Je m’étais promis de commencer à rédiger sur mes bricoles électroniques, c’est donc chose faite avec ce premier article qui a pour but de vous expliquer comment réaliser simplement un capteur de température. Étant donné que je fait beaucoup plus d’électronique que d’informatique sur mon temps libre en cette période, ça ne sera que positif pour ajouter du contenu par ici.

Cet article est le premier contenant quelques formules et développements, mais ne fuyez pas, le tout reste à la portée de tout élève ayant un niveau de terminale générale en maths (logarithmes, factorisation, …).

La thermistance NTC

Définition

Une thermistance (ou thermistor, version anglaise dérivée de resistor) est un composant passif qui a pour caractéristique de voir sa résistance varier en fonction de la température à laquelle elle est exposée.

On rencontre différents types de thermistances avec différentes courbes de variation température/résistance ; nous allons ici uniquement nous intéresser aux thermistances de type NTC (Negative Temperature Coefficient).

Les thermistances chinoises que j’ai trouvé sur eBay

Les thermistances chinoises que j’ai trouvé sur eBay

Elles sont définies par plusieurs caractéristiques, parmis lesquelles :

  • \(\beta\) une constante de température, en kelvins (K)
  • \(R_0\) une résistance de référence, en ohms (\(\Omega\))
  • \(T_0\) la température à laquelle s’applique la résistance de référence, en kevlins (K)

La relation entre sa résistance et la température est donnée par par la relation de Steinhart-Hart (merci Wikipédia) restreinte dans un domaine de température :

\begin{equation*} \frac{R_t}{R_0} = \exp\left(\beta(\frac{1}{T}-\frac{1}{T_0})\right) \end{equation*}

Température en fonction de la résistance

On cherche à extraire \(T\) de cette formule pour avoir la température :

\begin{equation*} \frac{\ln\left(\frac{R_T}{R_0}\right)}{\beta}=\frac{1}{T}-\frac{1}{T_0} \end{equation*}
\begin{equation*} \frac{\ln\left(\frac{R_T}{R_0}\right)}{\beta}+\frac{1}{T_0}=\frac{1}{T} \end{equation*}

D’où la relation suivante :

\begin{equation*} T(R_T)=\frac{1}{\frac{\ln\left(\frac{R_T}{R_0}\right)}{\beta}+\frac{1}{T_0}} \end{equation*}

Utilisation avec un pont diviseur de tension

Une méthode simple en électronique pour mesurer facilement une variation de résistance d’un composant est de construire un pont diviseur de tension. Nous utiliserons donc notre thermistance ainsi qu’une autre résistance (de valeur égale à celle du \(R_0\) de la thermistance, soit \(10 k\Omega\) pour les miennes) pour former le pont schématisé ci-dessous :

Schéma de notre pont diviseur de tension

Schéma de notre pont diviseur de tension

Avec \(U_T\) la tension aux bornes de la thermistance, \(U_R\) la tension aux bornes de la résistance et \(U\) la tension entre le haut et le bas du diviseur (typiquement VCC).

En appliquant la formule du pont diviseur de tension au niveau de \(U_T\), on obtient la relation suivante entre les différentes tensions du circuit :

\begin{equation*} U_T = U\frac{R_T}{R_T + R} \end{equation*}

Nous allons devoir manipuler la formule pour pouvoir retrouver \(R_T\) en fonction des tensions présentes dans le circuit, ce qui va nous permettre par la suite de réinjecter cette formulation de \(R_T\) dans la formule de calcul de la température pour directement obtenir la température à partir de la tension !

Voici le développement :

\begin{equation*} U_T = U\frac{R_T}{R_T + R} \end{equation*}
\begin{equation*} \frac{U_T}{U} = \frac{R_T}{R_T + R} \end{equation*}
\begin{equation*} \frac{U_T}{U}(R_T+R) = R_T \end{equation*}
\begin{equation*} \frac{U_T}{U}R_T+\frac{U_T}{U}R = R_T \end{equation*}
\begin{equation*} \frac{U_T}{U}R = R_T-\frac{U_T}{U}R_T \end{equation*}
\begin{equation*} \frac{U_T}{U}R = R_T(1-\frac{U_T}{U}) \end{equation*}
\begin{equation*} \frac{\frac{U_T}{U}R}{1-\frac{U_T}{U}} = R_T \end{equation*}

Et voilà, on peut maintenant retrouver la résistance en fonction de la tension \(U_T\) que l’on va mesurer. En réinjectant cette définition de \(R_T\) dans la formule de calcul de température, on obtient la (grosse) relation suivante :

\begin{equation*} T(U_T)=\frac{1}{\frac{\ln\frac{\left(\frac{\frac{U_T}{U}R}{1-\frac{U_T}{U}}\right)}{R_0}}{\beta}+\frac{1}{T_0}} \end{equation*}

Voici des exemples d’applications numériques en considérant pour l’exemple une tension de référence \(U=5V\) avec les caractéristiques de mes thermistances :

  • \(T(1.5V)=321K\) (soit 48 °C)
  • \(T(2.5V)=298K\) (soit 25 °C)
  • \(T(3.5V)=278K\) (soit 5 °C)

Plus qu’à tester en vrai

Pfiou, après les formules, on va enfin pouvoir passer au test grandeur nature !

Pour cela, nous allons devoir utiliser un ADC pour convertir la tension analogique que l’on mesure au milieu du diviseur de tension en une valeur numérique sur laquelle faire des calculs pour trouver la température.

Meet the BeagleBone Black

N’importe quel microcontrôleur pourrait faire l’affaire mais il faudrait gérer l’affichage derrière ou utiliser le port série avec une Arduino. C’est pour ça que j’ai sorti ma toute nouvelle BeagleBone Black, qui dispose également de plusieurs ADCs (à 1,8 V et non pas 5 V) dont on va pouvoir se servir.

Le montage de pont diviseur de tension relié à une entrée analogique de la carte

Le montage de pont diviseur de tension relié à une entrée analogique de la carte

L’avantage est que je vais pouvoir directement effectuer les calculs sur la carte et les lire sur l’écran de mon PC en utilisant une connexion SSH par le câble USB (qui sert d’interface réseau ici). De plus, on a à notre disposition un système Linux complet, ce qui veut dire que l’on peut même programmer en Python dessus pour réaliser un prototype au lieu de se casser la tête avec du C (qui serait par contre obligatoire si on voudrait faire de l’acquisition haute fréquence).

Code d’acquisition et de conversion

J’ai donc réalisé un petit script Python qui va venir lire à une certaine fréquence la valeur lue par l’ADC de 2048 bits mise à disposition dans un fichier système par les pilotes de la carte.

Voici le code en question (en Python 2 car il était déjà installé avec la carte) :

# encoding: utf-8

from time import sleep
from math import log


# Calcule la température en degrés kevlin
def temp_kelvin(val):
        u = 1.8                  # Tension d’alimentation du pont diviseur
        r = 10000.0              # Résistance en haut du pont
        ut = val * u / 2048.0    # Tension mesurée avec l’entrée analogique
        beta = 3435.0            # Constante de la thermistance
        r0 = 10000.0             # Résistance de référence de la thermistance
        t0 = 298.0               # Température de référence
        return 1/((log(((ut*r/u)/(1-(ut/u)))/r0)/beta)+(1/t0)) - 5 # yolo calibration


# Calcule la température en degrés celcius
def temp(val):
        return temp_kelvin(val) - 273


# Boucle principale
while 1:
        # On réouvrre le fichier à chaque fois pour être sûr de lancer
        # l’acquisition
        with open('/sys/devices/ocp.3/helper.15/AIN0') as f:
                val = int(f.read())
                print "Temperature (°C)  {}:".format(temp(val))
        # On fait une petite pause pour ne pas spammer le terminal et le
        # processeur
        sleep(0.1)

Vous pouvez voir que j’ai rajouté un offset à la formule que nous avions trouvée car en effet j’avais une différence de 5 °C entre la température lue et celle des thermomètres numériques et à alcool que j’ai utilisé pour vérifier le résultat. Une fois cet offset ajouté, la valeur lue concorde avec les thermomètres à 1 °C près, ce qui n’est pas trop mal étant donné que le calcul d’erreur théorique − que je ne détaillerai pas ici − donnait une précision de 3 °C.

Cependant, je n’ai pas eu l’occasion de tester ce capteur de température dans des gammes éloignées des 20 °C de l’air ambiant ; je retesterai la formule cet hiver pour vérifier qu’elle n’est pas faussée, mais je suis plutôt confiant.

Et après ?

Je valide personnellement ce capteur de température à pas cher à base de thermistances chinoises et de pont diviseur de tension.

On peut donc envisager des applications plus avancées telles qu’un réseau de capteurs pour vérifier la température dans différentes pièces d’une maison, ou bien un petit traqueur de température autonome à base de microcontrôleur qui réalise des mesures à intervalle régulier dans une EEPROM que l’on peut ensuite lire pour voir les variations pendant une journée complète par exemple.

Pour les plus motivés pourquoi pas réaliser une interface web HTML5 qui permettrai de consulter cette température et son évolution à distance en routant correctement sa box.

Conclusion

Ce montage a été amusant à réaliser et j’ai enfin un capteur intéressant à exploiter avec ma BeagleBone ou les microcontrôleurs qui trainent dans mes tiroirs.

Vous pouvez vous aussi réaliser vos propres capteurs en suivant ce principe, par contre je ne garantie pas la fiabilité par rapport à des sondes de températures un peu plus chères mais sans doute beaucoup plus précises.

Une question ou remarque ? N'hésitez pas à me contacter en envoyant un mail à microjoe, suivi d'un arobase, puis encore microjoe et enfin un « point org ».