Mesurer la température avec précision avec Arduino

10

J'essaie de construire un thermostat avec Arduino. Je veux l'alimenter à l'aide de la batterie / du chargeur de téléphone portable, ce qui rend la tension du système assez variable. Pour le moment, j'utilise Arduino Uno, mais une fois terminé, je le porterai sur Lilypad.

J'ai d'abord essayé d'utiliser le capteur de température TMP36 . Jusqu'à présent, ce fut un échec complet. Bien que le capteur lui-même semble être très stable, je ne peux pas trouver un moyen de mesurer avec précision sa tension.

L'utilisation de la référence 5v intégrée pour les capteurs analogiques ne fonctionne pas du tout - même alimenté par USB Arduino + 5V sont en fait + 4,8V (ce qui décale la température mesurée de quelques degrés). Lorsque la carte est alimentée par la batterie, la tension chute à environ 4 V et la température mesurée des fusées célestes. J'ai également essayé d'utiliser + 3,3 V de la carte comme référence. Il semble être plus stable lorsque la carte est alimentée par USB, mais sa tension diminue lors de l'utilisation de la batterie.

Existe-t-il un autre moyen de mesurer de manière fiable la tension de sortie du capteur?

Pour la deuxième étape, je prévois d'utiliser des thermistances. Je viens de commander deux de ces thermistances 20K .

D'après ce que je comprends, ceux-ci devraient être plus faciles à mesurer avec précision si je construis un diviseur de tension et utilise V_in comme tension de référence pour l'ADC.

Quelques questions à leur sujet:

  • Est-il judicieux d'utiliser quelques diviseurs de tension avec différentes résistances fixes pour augmenter la précision?
  • Je peux utiliser une broche programmable comme V_in et mesurer la température en utilisant quelques niveaux de tension différents. Bien que ce ne soit pas clair pour moi si cela augmentera réellement la précision.
Usov
la source
Veuillez poster votre code de conversion de température.
geometrikal
Veuillez définir ce que vous entendez par "avec précision". Quel type de résolution de température et de précision absolue essayez-vous d'atteindre?
Joe Hass
J'espère obtenir une résolution d'environ 1-2 degrés. Une erreur d'étalonnage absolue de 1 à 2 degrés devrait également convenir. D'après ce que je comprends, il est relativement facile d'obtenir un point de référence à 0 ° C, et je suppose que je peux obtenir un deuxième point (beaucoup plus approximatif) à la température ambiante en étalonnant les capteurs.
Usov
1-2 degrés pour des températures dans la gamme 5-25C.
Usov
@geometrikal Je ne l'ai pas sous la main en ce moment, mais c'est fondamentalement la même chose que tout le monde: laisser tomber le premier échantillon, attendre quelques millis, échantillonner quelques fois de plus et des échantillons moyens. Redimensionnez ensuite ce que vous pensez être votre tension de référence.
Usov

Réponses:

2

Il semble que vous soyez conscient du problème avec le changement de tension de référence et si vous utilisez un appareil comme le TMP36 (fixe 10mV / degC), vous ne pouvez rien faire d'autre que d'utiliser une référence de tension à partir d'une puce pour stabiliser les choses.

Cependant, si vous utilisez un RTD ou une thermistance, le problème ne se posera pas. Votre ADC effectue une mesure ratiométrique - il compare l'entrée ADC à sa tension de référence MAIS, si vous alimentez le RTD ou la thermistance (via une résistance appropriée) à partir de la même tension de référence, cela n'affectera pas les lectures. Si la référence augmente de 10%, la tension dans l'ADC augmente également.

Andy aka
la source
4

Je pense que vous devriez envisager d'utiliser un capteur de température numérique comme DS18B20 / DS18S20 car cela ne dépend pas de la précision de votre ATmega ADC pour mesurer un signal anaolg, il utilise un protocole numérique à 1 fil pour signaler la température.

Reportez-vous aux didacticiels suivants
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
la source
2
Cette réponse n'est pas très utile, sauf si vous expliquez pourquoi l'OP devrait passer à un autre capteur, et vous n'avez donné aucune justification à cela. Le simple fait de fournir des liens dans une réponse n'est pas une bonne idée car ils disparaissent souvent et le contenu de la réponse est perdu.
Joe Hass
Plutôt que d'écrire ma propre réponse dans le même sens, j'ai édité ce A pour répondre à la préoccupation soulevée par Joe.
RedGrittyBrick
@JoeHass La seule alternative au lien vers des articles externes est de joindre le code dans la réponse, mais je n'ai pas mon propre code à joindre et il ne serait pas juste de joindre du code elses à quelqu'un sans son consentement. Même si les liens disparaissent, une bibliothèque pour Arduino peut être facilement trouvée en utilisant Google et DS18B20 comme mot clé. Concernant l'explication, c'était mon erreur, je pensais que mentionner que le capteur était numérique aurait expliqué mon propos.
alexan_e
Merci pour le commentaire. Pour une raison quelconque, les capteurs numériques sont assez difficiles à trouver. Ni les fournisseurs locaux (Maplin) ni les gars en ligne bon marché (euh) (j'ai utilisé Spiraltronics) n'en vendent. £ 3 une livraison pop + en fait toujours une option relativement coûteuse.
Usov
@Usov À en juger par les liens que vous avez fournis, je suppose que vous vivez au Royaume-Uni. J'achète généralement ces composants à bas prix en Chine, mais je les ai également trouvés sur ebay.uk pour 1,49 £, peut-être qu'ils vous conviennent
alexan_e
3

Votre mesure sera aussi bonne que la tension de référence pour l'ADC est bonne. Arduino utilise par défaut la tension d'alimentation comme tension de référence, mais dans votre cas, la bonne façon de le faire serait d'utiliser la broche Aref d'arduino. Vous devez obtenir une puce spéciale appelée "référence de tension" et la connecter à la broche Aref, puis définir ADC pour utiliser la référence externe dans le code Arduino ( analogReference(EXTERNAL))

La tension de référence doit être sélectionnée pour que le swing complet de votre capteur de température s'adapte à la tension de référence. Le TMP36 produira ~ 1,5 V à 100 ° C, vous devrez donc utiliser une référence supérieure à 1,5 V pour mesurer la température jusqu'à 100 ° C. Vous souhaitez que votre référence se rapproche le plus possible de la tension maximale mesurée pour obtenir autant de résolution que possible.

Atmega328p possède deux références internes qui peuvent être utilisées sans aucun composant externe. L'un est 1,1V, un autre 2,56V. Leur précision est généralement un peu moins bonne que ce que vous obtiendriez en utilisant un composant dédié externe. Consultez la documentation Arduino pour la fiche de référence analogique et Atmega328p pour la précision de référence interne.

Si vous voulez vraiment obtenir des écrous avec différentes gammes, vous pouvez utiliser plusieurs références externes et les changer en utilisant un commutateur analogique comme 74hc4051. Ou vous pouvez basculer entre deux références internes.

Avec les thermistances, vous obtiendrez de meilleurs résultats si vous configurez une source de courant constant à la place en utilisant une résistance muette. D'un autre côté - une résistance muette alimentée par une référence de tension stable fonctionnerait bien.

Lors du choix d'une référence externe, assurez-vous que vous avez suffisamment de tension pour s'adapter à sa tension de chute lors de l'alimentation à partir des batteries et que les batteries sont déchargées. Vref + Vdropout <Vbat-min.

miceuz
la source
Merci pour votre commentaire. C'est essentiellement le même commentaire que j'ai reçu aujourd'hui - construire ma propre tension de référence sur la diode zener ou obtenir un régulateur basse tension dédié pour AREF.
Usov
Pourquoi de meilleurs résultats avec un courant constant et une thermistance?
geometrikal
2

Ne pas avoir une référence ADC stable est en fait le symptôme d'un autre problème dans votre circuit: vous ne fournissez pas une tension suffisamment élevée à la carte. Ceci est indiqué par la baisse de l'alimentation de 5 V à 4 V et la baisse de 3,3 V également.

Le régulateur de tension (MC33269D-5.0 IIRC) sur la carte Arduino a une tension de décrochage de ~ 1.0V, vous devez donc l'alimenter avec au moins 6V pour obtenir une sortie stable de 5V. Les piles AA commencent à 1,5-1,6 V et sont presque mortes à 1,1 V, vous devez donc alimenter la carte avec au moins 6 piles AA pour une sortie stable sur toute la durée de vie des piles.

Alimenté correctement, vous pouvez utiliser la référence ADC interne ou les lignes 5V ou 3,3V. Étant donné que le capteur de température varie d'environ 10 mV par degré Celcius, vous pouvez utiliser un diviseur de tension pour définir la tension de référence équivalente à la tension de sortie maximale attendue du capteur (par exemple pour 50 degrés C). Cela donnera une mesure plus précise.

Si vous souhaitez utiliser moins de 6 piles AA, essayez un convertisseur boost DC-DC, par exemple https://www.sparkfun.com/products/10968 . L'exemple lié prend 1V - 4V et fait 5V. La sortie serait alimentée directement dans la broche 5V de l'Arduino, contournant son régulateur.

Pour que la carte fonctionne plus longtemps sur piles, mettez le MCU en veille entre les lectures du capteur. La bibliothèque basse puissance rocketscream est idéale à cet effet. Mais il n'est vraiment utile que lorsque vous utilisez un régulateur / convertisseur DC-DC efficace car le régulateur Arduino standard utilise 10mA tout seul!

geometrikal
la source
1

Réponse à la question Existe-t-il un autre moyen de mesurer de manière fiable la tension de sortie du capteur?

L'ADC utilise la tension de référence pour la conversion de l'analogique au numérique. Donc, s'il y a un changement dans la tension de référence, les valeurs converties (c'est-à-dire la valeur numérique) changeront. La valeur numérique sera différente pour la même entrée analogique si la tension de référence change.

Une option simple consiste à utiliser la tension de référence interne à l'intérieur de l'Arduino (c'est-à-dire le contrôleur Atmega).

Voir le lien ci-dessous où un exemple de code est fourni pour utiliser l'ADC interne (nom de la fonction Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Je pense que cela résoudra votre problème et il n'est pas nécessaire de passer aux thermistances.

robomon
la source
Je ne sais pas en quoi le "Hacking Wifi finder" est pertinent - je ne trouve rien de pertinent. En ce qui concerne la référence ADC interne - j'ai écrit à ce sujet. Cela ne fonctionne pas même lorsque Arduino est alimenté par USB. Et lorsque la carte est alimentée par une batterie de téléphone portable (3,7 - 4,5 V), c'est encore pire.
Usov
Désolé, c'est une erreur de copier / coller. Corrigera bientôt le lien!
robomon
Lien @Usov corrigé!
robomon
La prise interne de 1,1 V peut flotter de plus de 10% selon la spécification atmega328. Cela ne semble pas non plus être une référence très fiable.
Usov