Où sommes nous ?

Retour

Mesure de température par 1-wire

C'est la mesure la plus simple à réaliser par un bus 1-wire : un seul composant est nécessaire, le fameux DS18B20. Il offre une précision de 12 bits sur une plage de -55°C à +125°C et prend la forme d'un boitier TO-92 (comme un transistor classique) dont les pattes sont :

  1. La masse
  2. Les données
  3. Vdd qui sera connecté sur l'alimentation du bus : 3.3v ou 5v ... Cette patte peut être aussi branchée à la masse, dans ce cas, la puce sera alimentée en mode "parasite".

Comme tout composant 1-wire, chaque puce est identifiée par un identifiant unique, gravé à sa fabrication et évidemment non modifiable.

Attention, si vous utilisez un driver I2C ainsi que je l'ai décrit pour mon BananaPI, il ne faut pas mettre de résistance de pull-up comme on peut le voir sur tous les schémas pour Raspberry et autres Arduino où le bus 1-wire est géré directement par les GPIOs : cette fonction est remplie par le driver lui-même.

Positionner les sondes de température

Avoir un bus, c'est bien ; y placer des sondes et surtout qu'elles effectuent des mesures utiles, c'est mieux : L'emplacement d'une sonde de température peut avoir un impact non négligeable sur la qualité des données produites.
Tout le monde ne goûtera pas forcement à charme néo-post-modernisme d'un fil et de « ce truc ignoble » qui pendent au milieu du salon : Les sondes, les câbles qui les connectent, doivent savoir se faire le plus discrètes possibles.
Ne pas oublier non plus leur sécurité physique :

S'il parait assez évident de ne pas placer une sonde juste à côté d'un chauffage, d'une clim ou d'une fenêtre, les appareils électriques produisent aussi de la chaleur : évitez la proximité des TV par exemple … mais aussi et surtout des ordinateurs dont les ventilos expulsent un air chaud relativement loin.
De plus, on ne fait pas assez attention au fait qu'il peut y avoir … 1 ou 2°C de différence entre le sol et le plafond d'une pièce (sisi, j'ai fait les tests). Idéalement, une sonde devrait être placée à 1,20m du sol.
Enfin, les murs eux-mêmes peuvent faire des ponts thermiques avec les pièces d'à côté … ce qui devrait être réduit par une bonne isolation.

Bref l'un dans l'autre, la sonde idéale serait placée … au centre de la pièce à 1,20 mètre du sol : évidemment, totalement irréaliste, franchement pas WAF compliant !

Alors …

Asservissement du chauffage

L'idée peut vous venir d'asservir votre chauffage en fonction de la température mesurée. Dans ce cas, il faut placer les sondes non loin du « centre de vie », aussi appelé « le canapé sur lequel on s'avachie pour déguster les passionnants programmes télévisuels ».

Attention

Pour une pièce relativement grande qui plus est chauffée par une source ponctuelle, la température peut évoluer de plusieurs degrés d'un point à un autre. C'est typiquement le cas de mon salon de 40m2 chauffée par une cheminée placée à une extrémité. Dans ce cas, il sera peut-être utile d'avoir … plusieurs sondes.

Et dehors ?

On prend les mêmes règles que pour une station météo : la sonde de température doit être protégée de l'exposition directe au soleil et à l'abri du vent. J'ajouterai aussi qu'elle ne doit pas être trop près du sol pour éviter l'humidité et l'intérêt des animaux.
La mienne est placée sous mon balcon, loin de toute projection d'eau et à environ 1 metre du sol.

La réalité

J'utilise les coques des cadeaux kinder pour protéger mes sondes DIY : inutile de dire que leur jaune criard à un effet esthétique indéniable ...

Dans les lieux de services comme mes combles ou un des greniers … on s'assoie sur l'esthétique et les sondes pendent (lamentablement) d'un endroit où elles ne gênent pas et surtout où elles peuvent donner une température à peu près correcte.

Dans les pièces de vie, on ne peut évidemment pas le faire : elles doivent rester cachées. Une derrière un meuble loin de toute source de chaleur (en évitant quand même de la laisser au sol lorsque c'est possible), une autre derrière une porte. Ou simplement … dans une armoire.

Pondération

Dans le cas où une sonde est mal placée, je conseillerais de pondérer son résultat: on place un thermomètre à l'endroit cible et on mesure la différence ce que donne la sonde et le thermomètre. En post-traitement on appliquera la pondération calculée pour obtenir la température réelle.

Comme je l'ai dit précédemment, il faut que la sonde soit au maximum protégée des influences extérieures (et en particulier des sources de chaleurs) ... mais même dans ce cas-là, la valeur obtenue ne sera qu'informative : j'ai fait des tests avec une référence placée sur mon bureau et la sonde placée à 1,20m de hauteur mais dans un angle et on arrive facilement à une plage de différences de plus d'un degré (voir l'explication sur cette plage ci-dessous).

Bref, le résultat ne sera qu'informatif et plus la plage et/ou la variance est importante, plus la valeur obtenue sera fausse ... et ça sera encore pire l'hiver avec le chauffage.

Tarage

Comme l'a dit ce brave Albert, tout est relatif et j'ajouterai que personne et aucun appareil (à notre disposition du moins), n'a la vérité absolue. C'est pourquoi, chaque sonde fournit une valeur sensiblement différente de ses consoeurs : c'est ce que l'on appelle la marge d'erreur et elle est indiquée dans la notice fournie par le constructeur. Dans le cas des ds18b20, elle peut aller jusqu'à 0,5°C.

Comme je l'indiquais précédemment, les sondes peuvent fournir différentes précisions de mesures, de 9 à 12 bits. Mais pourquoi aller jusqu'à 4 digits après la virgule alors que la marge d'erreur est largement au-delà ? Parce qu'un autre facteur influant sur la qualité d'une sonde est sa stabilité. Face à une même température réelle, une sonde doit fournir la même valeur. Mais comme nous ne sommes pas dans un monde parfait, ça ne sera jamais le cas : c'est ce que l'on appelle la dispersion ou la variance en langage statistique.

Enfin, dernier facteur à prendre en compte : la dérive. L'électronique, c'est comme tout, elle s'use et une sonde de qualité délivrera la même valeur (dans sa zone de dispersion) durant toute sa vie garantie. Je n'irai pas plus loin sur ce domain car je n'ai pas encore assez de recule sur les sondes Maxim pour m'en faire une idée.

J'ai passé sous silence un autre facteur de qualité : la linéarité. 0°C -> 0, 50°C -> 50 et 100°C -> 100. Mais nous comptons sur Maxim pour avoir fait le nécessaire.

En conclusion : si nous n'arriverons jamais à obtenir la vraie température absolue, mais nous nous en approcherons dans la marge d'erreur des sondes ... et si leur dispersion est réduite, nous pourrons nous en approcher et corriger les erreurs des autres sondes : c'est ce que nous appelons le tarage.

Bref, empiriquement, je me suis aperçu que les 18b20 avaient une dispersion réduite et que différents composants affichaient des valeurs très proches (< 0.1°C). Sur ma platine d'essai, j'ai donc mis 3 ds18b20 côte à côte, je calcule la moyenne des valeurs qu'elles affichent et j'ai décidé arbitrairement que ça allait devenir ma référence.

Pour tarer une sonde, je mesure pendant une longue période la différence entre ma température de référence et celle mesurée par la dite sonde ... puis je fais une étude statistique sur ces valeurs et j'obtiens :

18B20 28EA00-1 28EA00-2
Moyenne -0,0409496583143509 0,107683599088838 0,181003644646924
Erreur standard 0,00074 0,00162 0,00153
Mode -0,0416 0,0834 0,2084
Médiane -0,0416 0,0834 0,1875
Variance 0,000241313281846455 0,00115985863450557 0,00103902094559033
Ecart type 0,015534261548154 0,0340566973517041 0,0322338478247685
Plage 0,0833 0,2083 0,2083
Nombre 439 439 439

Comme on peut le voir, les 18b20 sont plus précises que leurs cousines 28ea00 : leur Variance et Écart type sont plus faibles et la Plage des valeurs est plus petite ( < 0,1°C contre 0,2°C ).
Grace à la Moyenne, on peut réduire l'erreur de la sonde (par rapport à notre référence donc) en soustrayant la dite moyenne à la valeur lue. Ceci ce fait dans Marcel par la directive Offset introduite dans la version 5.02.

Voici le script qui me permet de faire ces mesures :

#/bin/bash

OWFS_MNT='/var/lib/owfs/mnt/'

# Sondes de références
sondesR=( '28.94D972070000' '28.A7A073070000' '28.CD9572070000' )

while true
do
total='scale=4; ( 0 '
for s in ${sondesR[@]}
do
total+="+ $( cat $OWFS_MNT/$s/temperature ) "
done
total+=") / ${#sondesR[@]}.0"
# echo $total
moy=$( echo $total | bc )
printf "$moy " | sed -e 's/./,/g'

for s in $*
do
val=$( cat $OWFS_MNT/$s/temperature )
diff=$( echo "scale=4; $val - $moy" | bc )
printf "$s "
printf "$val $diff " | sed -e 's/./,/g'
done
printf ' '

sleep 120
done

A l'intérieur, on trouve les adresses des sondes de références (j'en ai mis 3, mais rien ne vous empêche d'en mettre plus).

bin/QualibreSondes 28.94D972070000 42.9E5247000000 42.886847000000 28.FFC5D8001502

En argument, on doit passer les sondes à étalonner.

Il ne vous reste plus qu'à copier le résultat dans LibreOffice et de lui demander de générer les statistiques.

Et finalement ...

Il n'est évidemment pas judicieux de monopoliser plusieurs sondes seulement pour avoir une référence : comme je l'ai dit précédemment, toutes mes ds18b20 se tiennent dans un mouchoir de poche et parmi elles, j'en ai identifié une qui semble encore plus stable que ses consoeurs (variance et plage la plus faible) : après l'avoir tarée, elle est maintenant ma référence unique.
Ce qui me permet par la même de l'installer facilement n'importe où sur mon réseau pour tarer ou pondérer celles déjà installées.

Situations plus complexes

On peut se retrouver dans des situations plus complexes où plusieurs sources de chaleurs peuvent interférées, ce qui entraine une compensation plus ardues :

Correction des interférences venant du grenier

Mesure de la température (par owfs)

Comme je l'indiquais lors de ma présentation du bus 1-wire, ces sondes apparaissent comme des répertoires de la famille 28.

bPI ~ # ls -l /var/lib/owfs/mnt/
total 0
drwxrwxrwx 1 root root  8 23 mai   23:30 28.FF4B30021503
drwxrwxrwx 1 root root  8 23 mai   23:30 28.FF5EEF001502
drwxrwxrwx 1 root root  8 23 mai   23:30 28.FF7BF0001502
drwxr-xr-x 1 root root  8 19 mai   10:42 bus.0
drwxr-xr-x 1 root root  8 19 mai   10:42 settings
drwxr-xr-x 1 root root  8 19 mai   10:42 statistics
drwxr-xr-x 1 root root 30 19 mai   10:42 structure
drwxr-xr-x 1 root root  8 19 mai   10:42 system
drwxr-xr-x 1 root root  8 19 mai   10:42 uncached

et la température peut être lue par le fichier ... temperature

bPI ~ # cat /var/lib/owfs/mnt/28.FF4B30021503/temperature
      17.625

La valeur de ce champ est codée sur 12 bits, c'est-à-dire la précision maximum du circuit. Hors comme plus on demande une précision importante, plus la conversion prend du temps, il est possible de demander une précision moindre par les fichiers temperature9, temperature10, temperature11 et temperature12

Par commodité, temperature équivaut donc à temperature12 et fasttemp à temperature9.

Fonctions avancées

Alarmes

Les DS18B20 dispose d'un mode alarme qui se paramètre par les fichiers suivants que l'on trouvent dans le pseudo répertoire de chacune des sondes :

Par exemple, pour la sonde qui surveille mon congélateur, cela donne :

torchwood 28.FF83ED001502 # echo '-20' > templow
torchwood 28.FF83ED001502 # echo '0' > temphigh

Lorsque la sonde se trouve en alarme, elle apparaît dans le sous-repertoire alarme.
Exemple :

torchwood mnt # echo -15 > 28.FF83ED001502/templow
torchwood mnt # ls alarm/
12.16CCCC000000  28.FF83ED001502
torchwood mnt # cat 28.FF83ED001502/temperature
-17.5

Notes

Du fait d'un bug dans owfs, une température négative ne peut être assignée qu'à partir de la version 3.1

La recherche des alarmes s'apparente à un scan du bus 1-wire comme lors de la découverte des sondes. En conséquence de quoi, il peut être relativement long et donc pénalisant si de nombreuses sondes sont en alarme.

Conversions simultanées

La conversion de température peut prendre un certain temps, voir même un temps certain. Il est donc possible de demander à toutes les sondes de lancer simultanément une conversion de température par un simple

torchwood mnt # echo 1 > simultaneous/temperature

Elles seront lues classiquement par leur répertoire respectif.

Cette fonction n'est à l'heure actuelle pas documentée et je n'ai pu trouver des informations que dans la mailing list. Il semblerait que le bus soit bloqué au niveau bas jusqu'à ce que toutes les sondes aient finies leur conversion ... ce qui peut créer des problèmes aux sondes alimentées en mode parasite.

En cas de problème

Le syndrome de la température à 85°C

85°C est la valeur d'initialisation des sondes avant quelles aient faites la moindre mesure ... ce qui ne devrait jamais arriver avec Owfs qui automatise entièrement les conversions et tient compte des timings. Si cependant, vous obtenez aléatoirement 85°C, ça signifie que la sonde n'est pas correctement alimentée.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.