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).
Elles sont définies par plusieurs caractéristiques, parmis lesquelles :
- une constante de température, en kelvins (K)
- une résistance de référence, en ohms ()
- 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 :
Température en fonction de la résistance
On cherche à extraire de cette formule pour avoir la température :
D’où la relation suivante :
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 de la thermistance, soit pour les miennes) pour former le pont schématisé ci-dessous :
Avec la tension aux bornes de la thermistance, la tension aux bornes de la résistance et la tension entre le haut et le bas du diviseur (typiquement VCC).
En appliquant la formule du pont diviseur de tension au niveau de , on obtient la relation suivante entre les différentes tensions du circuit :
Nous allons devoir manipuler la formule pour pouvoir retrouver en fonction des tensions présentes dans le circuit, ce qui va nous permettre par la suite de réinjecter cette formulation de dans la formule de calcul de la température pour directement obtenir la température à partir de la tension !
Voici le développement :
Et voilà, on peut maintenant retrouver la résistance en fonction de la tension que l’on va mesurer. En réinjectant cette définition de dans la formule de calcul de température, on obtient la (grosse) relation suivante :
Voici des exemples d’applications numériques en considérant pour l’exemple une tension de référence avec les caractéristiques de mes thermistances :
- (soit 48 °C)
- (soit 25 °C)
- (soit 5 °C)
Avis
Courrier des lecteurs — 2019-09-24
Le développement ci-dessus est bien compliqué, car je suis parti bille en tête sur la formule du pont diviseur de tension. On peut cependant utiliser la loi d'Ohm, qui va nous donner une formule plus simple.
Prenons les deux applications suivantes de la loi d'Ohm à notre circuit :
On peut donc arriver à l'égalité suivante :
Cependant, cette formule n'est pas pratique car notre montage ne mesure pas mais seulement . On peut néanmoins déduire :
Et donc on obtient :
Ce qui nous donne la formule finale suivante pour retouver la température :
Qui est plus simple que celle avec le pont diviseur de tension.
Merci à P. Loos pour cette astuce.
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.
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.
Avis
Courrier des lecteurs — 2019-09-24
Il est conseillé de mesurer la résistance R choisie (de préférence une résistance de précision), ainsi que le paramètre de la thermistance NTC à 25 °C — puis à 85 °C — plutôt que de se fier aux données du constructeur. Ces valeurs sont données à 10 % de précision pour les composants premier prix tel que ceux que j'utilise ici. Il est donc important de les mesurer.
Merci à P. Loos pour cette précision.
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.