Commande des tubes nixie
Mesure de la température
TechTalk
Root » Serveurs » ElectroNique » Arduino » Nixie » Mesure de la température

Notre Arduino uno a encore des entrées analogiques que nous pouvons utiliser, par exemple pour mesurer la température ambiante (et éventuellement aussi la température extérieure).
-

-

Articles similaires:
Soit nous réalisons un thermomètre indépendant (qui mesure par exemple la température intérieure et extérieure), soit nous adaptons notre horloge pour indiquer alternativement l'heure et la température. Réaliser deux appareils indépendant n'est généralement pas trop cher (un arduino coûte quelques €), mais ce sont les circuits de commande des tubes et les tubes eux-même qui coutent cher. Pour permettre les deux possibilités, nous donnons un code assez générique.

La résolution du convertisseur AD est de 10 bits, donc 1024 niveaux. Si nous voulons mesurer la température de 0 à 50°, cela nous donne une précision de 0.05°C. Il nous faut donc 3 positions pour afficher la température.

Si nous avons réalisé une horloge, nous avons des chiffres qui ne vont pas s'allumer.
29 59 59 <-- valeur maximale qui peut être affichée
54 32 10 <-- positions de l'horloge utilisées
Nous avons indiqué en bleu les positions que nous pouvons utiliser pour la température. L'extinction des autres positions indique clairement que l'arduino affiche la température.

En théorie nous pouvons indiquer une température qui monte à 59.9°, mais nous limitons la température maximale à 49.9° pour des raisons pratiques. On peut tout simplement remplacer l'arduino par un voltmètre (numérique ou analogique) et on a une indication de la température.

Partie électronique

La partie électronique a été réalisée en moins d'une heure et est toute simple. Il nous faut un convertisseur qui fournisse une tension qui va de 0 à 5V pour une température qui va de 0 à 50°C. On utilise ici un Pt100 dans une configuration minimaliste. Une dixaine de composants standards suffisent.

L'alimentation est double et chaque ligne est filtrée par une petite résistance et un condensateur pour éviter que les bruits de commutation n'arrivent au circuit. Si vous réalisez un tel circuit, controlez que les tensions n'exèdent pas les 12V. Il vaut mieux rester dans les normes avec une différence de potentiel de maximum 30V. J'utilise les tensions que fournit ma petite alimentation à découpage, mais si vous utilisez un système indépendant, un petit transfo de 2×8V 4VA suffit amplement: la consommation de cette partie est de 125mW.

Nous utilisons un ampli opérationnel LM10 qui est spécialement conçu pour ce travail, avec une source de courant programmable qui peut être réalisée avec quelques composants. La tension sur le drain est de -5.5V indépendamment de la tension d'alimentation (la source de courant produit exactement -2mA).

Nous utilisons un ampli opérationnel commandé sur son entrée négative. La tension sur la résistance Pt100 est amplifiée -150×. Quand la température augmente, la tension devient plus négative (elle passe de -0.200V pour une température de 0° à -0.239V pour une température de 50°). L'offset de -0.2V est éliminé par le réglage (potentiomètre multitours). Le gain est ajusté par le logiciel.

Si vous voulez une réponse plus rapide, remplacez la résistance de 150kΩ par deux résistances de 75kΩ et mettez la branche médiane à la masse via un condensateur de 100µF et une résistance de 1kΩ. La composante alternative est ainsi en grande partie bloquée par le condensateur, le gain de l'ampli est donc plus élevé (fonction différentiatrice). Il y a un bruit de fond important en sortie, que vous devez éliminer par un lissage numérique plus poussé.

L'avantage de ce système, en plus qu'il procure une réponse plus rapide aux changements de température, c'est que le bruit de fond va produire une "erreur" dans le convertisseur qui va être gommée au lissage. Avec ce petit truc, nous pouvons augmenter la précision du convertisseur. La réponse plus rapide et la précision accrue sont interessantes dans les systèmes où la température est utilisée pour d'autres fonctions. Elle permet d'éliminer l'overshoot.

Programmation

L'entrée analogique est lue très simplement:
ftemp = (analogRead(1) + ftemp * 9) /10.0;
ftemp est une variable float. Elle reçoit la valeur (integer de 0 à 1023) et la transforme en valeur float. Pourquoi? Pour effectuer un léger lissage par le logiciel. Cela évite d'avoir des chiffres qui changent continuellement quand la valeur analogique se trouve entre deux valeurs numériques. Le lissage est effectué sur 10 valeurs consécutives. Ce lissage n'est pas obligatoire, c'est un petit plus. Il est recommandé si vous lisez continuellement la température (boucle sans pause).

Le lissage est obligatoire avec un facteur 99/100 si vous utilisez la fonction différentiation électronique pour absorber le bruit de fond (et le transformer en précision accrue). Le fonctionnement d'un tel système est décrit ici: augmentation de la précision d'un convertisseur AD (deuxième partie de l'article).

L'affichage est super-simple, il se base sur la routine décrite dans le programme principal de l'horloge. Commençons par éteindre les positions que nous n'utilisons pas:
SndCh(5, 15); SndCh(4, 15); SndCh(1, 15);

Nous transformons maintenant notre valeur 0..1023 en température 0..499 avec la formule
itemp = ftemp/2.05 + 0.05;
itemp est une valeur integer qui stocke la température en dixièmes de degrés.

Nous allons maintenant écrire les différentes positions:
SndCh(0, itemp % 10); itemp = itemp / 10;
SndCh(2, itemp % 10); SndCh(0, itemp / 10);
L'opération "%" produit le reste de la division (modulo).

Dans mon cas, la programmation a été rendue plus ardue, car il s'agit d'intégrer l'indication de la température avec celle de l'heure. Il est possible de choisir 3 modes d'affichage:

  • température uniquement
  • heure uniquement
  • 3 secondes la température et 3 secondes l'heure ("mode pharmacie")

Controlez le fonctionnement correct du convertisseur (il doit fonctionner comme voltmètre): avec une tension de 3.21V l'affichage doit être dans le cas idéal de 32 1. La valeur correcte est réglée plus tard.

Calibrage

Le calibrage se fait avec un calibrateur gradué en degrés celcius (exemple à droite) ou un banc de résistances de précision.
  1. Offset (niveau zéro)
    Réglez la température sur 0° ou utilisez une résistance de 100.0Ω
    Si vous n'avez pas de calibrateur et pas de résistances de précision, vour pouvez également mettre le Pt100 dans un verre rempli de glace fondante.
  2. Ajustez la résistance variable pour avoir une tension de 0.0V en sortie du module Pt100 (entrée du convertisseur analogique-digital).
  3. Controlez que l'indication des tubes soit de 00 0 et augmente avec la tension.

  4. Gain
    Réglez la température sur 49° ou utilisez une résistance de 119.0Ω
    Si vous n'avez toujours pas de calibrateur ou de banc de résistances, sautez ces étapes. L'erreur de l'affichage sera de 5%, tolérance des résistances usuelles (erreur d'un degré pour un affichage de 20°). L'affichage du zéro est par contre correct, puisque nous l'avons corrigé.
  5. La tension doit être d'environ 4.9V, la valeur exacte n'est pas tellement importante. Si elle excède 5.0V, réduisez la température ou la valeur de la résistance. Supposons que vous devez régler la température sur 47.5° pour avoir une tension de sortie de 4.9V
  6. Modifiez la valeur de la constante 2.05 dans le logiciel pour avoir une indication de 49 0 (ou 47 5 si vous avez dû modifier la température dans l'étape précédente). Vous devez augmenter la valeur de la constante si la valeur affichée est trop élevée et la réduire si elle est trop basse.
Voila, votre indicateur de température est terminé. Si vous n'utilisez pas l'indication de l'heure, vous pouvez simplifier le programme. Mais pourquoi ne pas alors intégrer le réglage du gain dans le logiciel (appuyer sur un bouton + pour augmenter l'indication (réduire la valeur de la constante de 0.01 à chaque itération) et sur un bouton - pour réduire l'indication.

Vous devez stocker la constante (le diviseur) en mémoire EEPROM (dix secondes après la dernière modification) pour éviter qu'elle ne soit perdue en cas de coupure de courant ou de reset. Ces opérations nécessitent l'utilisation de la librairie <EEPROM.h> car il ne s'agit pas d'instructions C. Le diviseur doit être transformé en integer (×100) et stocké dans trois bytes EEPROM (le même système utilisé modulo-division pour envoyer un chiffre à la fois au tubes nixie)

Publicités - Reklame

-