dimanche 10 février 2013

Réaliser un thermomètre électronique avec Arduino

Internet, je te salut et je te remercie pour l'accueil !

Bien, aujourd'hui je vais vous expliquer comment réaliser un thermomètre électronique sans trop de difficulté. Il vous faudra :
  • Une carte Arduino (celle utilisée est une Uno)
  • Un breadbord
  • Un résistance 2,2k
  • Une sonde de température deux broches
    • J'utilise une KTY 10-5 (référence exacte: Q62705-K110), je vous invite à consulter la fiche technique.
Ce genre de sonde est en faite une résistance variable. Lorsque la température augmente, la résistance augmente. Pas proportionnellement malheureusement.

Etape 1 : Ohmmetre

Une Arduino ne peut mesurer directement la valeur d'une résistance sur ses ports analogiques, il faut réaliser un pont diviseur de tension. En cherchant un peu, on peut trouver facilement un montage dans le genre, par exemple celui de wiki.t-o-f.info.

Voici mon montage :


Pour trouver la valeur de la résistance R1, on utilise le calcul suivant:
Or, à 25°C, la sonde résiste à une valeur de 1950 à 1990Ω. Donc la résistance minimal doit être au alentours de 100Ω et la maximale de 50k environs... 2,2K convient.
Cependant, pour plus de précision, j'ai vérifier la valeur de R1 avec un ohmmètre du commerce pour être plus précis car une résistance n'est jamais à la valeur exacte indiquée. J'ai donc trouvé R1=2178Ω.

On branche les fils, on programme l'Arduino et c'est fini !
La résistance de droite corresponds à R2 (pour cette mesure, elle vaut 220Ω)


Le programme (à copier-coller dans le logiciel) :
int Vcc = 5; //V
int R1 = 2178; //omh (résistance fixe = racine carrée(valeur minimale de la résistance variable * valeur maximale de la résistance variable)   )
float U1;
float R2;

void setup() {
  Serial.begin(9600);
}

void loop() {
    // tension U1 en mv
    U1 = analogRead(A0)*5.0/1023.0;

    // valeur de la résistance R | Pont diviseur de tension
    R2 = ((Vcc - U1)*R1)/U1;

    // envoi de la valeur de la résistance sur le port serie
    Serial.println(R2);
}

 Etape 2: conversion de la résistance en température

Maintenant que l'on est capable de mesurer une résistance, c'est un jeu d'enfant. On consulte la fiche technique du composant (rappel: KTY 10-5) et on récupère la fonction qui donne la température en fonction de la résistance. Soit:
On code ça en language Arduino:

// tension U1 en mv
U1 = analogRead(A0)*5.0/1023.0;

// valeur de la résistance R | Pont diviseur de tension
R2 = ((Vcc - U1)*R1)/U1;

Kt = R2 / R25;
    
temperature = 25 + ( sqrt ( pow(alpha,2) - 4 * beta + 4 * beta * Kt) - alpha ) / ( 2 * beta );
 Avec (définit plus haut dans le programme):
//Conversion resistance => température
int R25 = 1970;
float alpha = 7.88*pow(10,-3);
float beta = 1.937*pow(10,-5);
float Kt;
float temperature;

On peut à présent afficher la température sur le port série en remplacement  Serial.println(R2); par Serial.println(temperature);.

Etape 3:

Un afficheur LCD c'est mieux qu'un écran d'ordinateur, n'est-ce pas ? Le but de cet article n'étant pas d'apprendre à utiliser un LCD, je ne détaillerai pas. Cependant voilà comment brancher :
Le code complet:

// inclure la librairie pour le LCD
#include <LiquidCrystal.h>

// preparer les broches du lcd
LiquidCrystal lcd(11,10,5,4,3,2);

int Vcc = 5; //V
int R1 = 2178; //omh (résistance fixe = racine carrée(valeur minimale de la résistance variable * valeur maximale de la résistance variable)   )
float U1;
float R2;

//Conversion resistance => température
int R25 = 1970;
float alpha = 7.88*pow(10,-3);
float beta = 1.937*pow(10,-5);
float Kt;
float temperature;

void setup() {
  lcd.begin(16, 2);
  lcd.print("Temperature :");
}

void loop() {
    // tension U1 en mv
    U1 = analogRead(A0)*5.0/1023.0;

    // valeur de la résistance R | Pont diviseur de tension
    R2 = ((Vcc - U1)*R1)/U1;
    
    Kt = R2 / R25;
    
    temperature = 25 + ( sqrt ( pow(alpha,2) - 4 * beta + 4 * beta * Kt) - alpha ) / ( 2 * beta );
    
    // envoi de la valeur de la température
    lcd.setCursor(0, 1);
    lcd.print(temperature);
    lcd.print("  ");
    lcd.write(11011111);
    lcd.print("C");
    delay(500);
}
Petit photo preuve !

3 commentaires:

  1. Bonjour
    Je suis débutant en électronique et votre exemple m'a été très utile pour commencer.
    Auriez-vous l'amabilité de me montrer comment, sur la même carte Arduino, vous pourriez mettre deux sondes de température. Parce que là, avec le pont diviseur de tension ... je m'embrouille un petit peu.
    Le but est de créer un circuit qui mesure la température dans un panneau solaire et dans un vase de stockage d'eau chaude. En fonction des deux températures, on démarre ou non la pompe de circulation.
    Merci d'avance
    Mon adresse mail : edwin.torisaen@voo.be

    RépondreSupprimer
  2. Article très sympa et clair. Cela donne envie de tenter l'expérience.

    La KTY 10-6 semblerait être quasi linéaire avec une tolérance +-1%

    Une précision peut-être à ajouter : La longueur et type de câble entre la sonde et Arduino. Si par exemple la sonde est à 30m de la carte Arduino plutôt que 30 cm, on ne peut plus considérer comme négligeable la résistance du fil non ?

    RépondreSupprimer
  3. Veuillez excuser mon temps de réponse considérable. Je suis en école d'ingénieur cette année et je n'ai plus le temps de poursuivre ce blog, mais je reviendrai ! Je vous remercie pour vos interventions.

    Pour brancher deux cartes Arduino sur un même circuit, je vous conseille de commencer sans l'afficheur, En utilisant la connexion série et la console avec la fonction "Serial.print". Ensuite, il faut bien comprendre que ce genre de sonde n'est qu'une résistance, donc on la branche avec un pont diviseur. Dessinez d'abord le schéma sur papier puis branchez le tout. Si vous n'y arrivez vraiment pas, je vous enverrai le schéma.

    J'avais remarqué cette quasi linéarité effective. Cependant je pense qu'avec des températures négatives, l'on assiste a un changement brutal de température. A vérifier !

    Concernant la longueur du fil, c'est exact. Plus le fil sera long, plus sa résistance au courant sera importante. Vous avez raison de le préciser.

    RépondreSupprimer