Avertissement : Cet article n'est pas un tutoriel Arduino. Vous devriez avoir quelques notions de base pour bien appréhender cette activité, vous devriez en particulier être à l'aise avec les variables et l'utilisation basique de l'écran LCD avec Arduino.
Je vous invite à consulter le site officiel d' Arduino pour vous familiariser avec le matériel.
N'hésitez pas à poster des commentaires.
Bonne activité !
SECONDAIRE | DIFFICULTÉ MOYENNE | 2 À 4 HEURES
Résumé de l'activité
- Étape 1 : Concevoir et construire la partie électronique
- Étape 2 : Lire le signal analogique de la thermo-résistance dans différentes conditions de température
- Étape 3 : Tracer la fonction f(signal)=température
- Étape 4 : Afficher la température en degrés Celsius dans le moniteur série
- Étape 5 : Afficher la température en degrés Celsius sur un écran LCD
Matériel
- Arduino
- Thermo resistance (modèle Keyes KY-013 dans ce TP)
- Écran LCD
- Resistance 220 Ohm
- Potentiomètre 10 kOhm
- Breadboard
- Fils
- Thermomètre 0-100˚C
- Bouilloire
- Glace
- Un verre
L’utilisation du module Keyes KY-013 vous dispense de monter un pont diviseur de tension avec une résistance de 10kOhm. Celle-ci est déjà montée sur le PCB et le module est prêt à l’emploi. Pour plus d’information voir ici
Mise en place du protocole expérimental
Montage electronique
Vous remarquerez que la thermo-résistance est ici branchée à l’envers (- sur +5V et + sur GND). En effet, selon la fiche de donnée de Keyes, une élévation de la température provoque une chute de tension à la sortie signal. Intuitivement nous préférons que le signal augmente proportionnellement avec la température et avons donc branché intentionnellement le capteur à l’envers.
Mis-à-part cette particularité le câblage est très simple. Il s'agit de brancher la pin "signal" de la thermo resistance sur la pin analogique A0 de l'Arduino.
Un peu de code...
C'est le moment de rendre les choses un peu plus concrètes ! Démarrez le logiciel Aduino et tapez le code suivant. Nous nous attarderons par la suite à comprendre chaque ligne !
//Déclaration des variables int thermo=A0; //Thermo-résistance branchée sur la pin A0 int valTemp=0; //Variable dans laquelle sera stockée la valeur du signal //analogique de la thermo-résistance //Initialisation du programme void setup() { pinMode(thermo, INPUT); //Initialisation de la pin A0 en ENTRÉE Serial.begin (9600); //Initialisation de la communication série à 9600 bauds } //Boucle principale void loop() { valTemp=analogRead(thermo); //lecture de la valeur du signal analogique de la //thermo-résistance et stockage dans valTemp Serial.println(valTemp); //Affichage de la valeur de valTemp delay(200); //Pause de 0,2 seconde }
Dans un premier temps nous déclarons les variables.
- la valeur A0 est associée à la variable thermo et représente la thermo-résistance branchée sur la pin A0.
- la variable valTemp dans laquelle sera stockée la valeur du signal analogique lu aux bornes de la thermo-resistance.
Puis vient la partie d'initialiation : le void setup.
Très simple, il ne comporte que 2 lignes :
- Déclaration de la pin thermo [A0] en entrée.
- Initialisation de la communication série qui nous permettra de lire la valeur du signal analogique de la thermo-resistance.
Et pour finir, la boucle principale : le void loop.
Trois étapes :
- lecture du signal analogique de la pin thermo et stockage dans la variable valTemp.
- Affichage à la ligne ("println") de valTemp dans le moniteur série.
- Pause de 200ms.
Vous pouvez maintenant brancher votre arduino et téléverser le programme.
Cliquez sur la loupe en faut à droite de la fenêre Arduino pour faire apparaître le moniteur série. Par défaut il sera réglé sur le débit de 9600 bauds. Vous verrez alors dans la nouvelle fenêtre un signal analogique compris entre 450 et 500 (température ambiante) (voir images ci dessous).
Si vous mettez votre doigt sur la sonde, la température, ainsi que le signal, augmente.
Dans la suite de cette activité nous allons relever le signal obtenu lorsque la sonde est à différentes températures de référence.
Mise en place de l'expérience
Versez un peu d'eau bouillante dans un récipient (verre ou becher). Pas trop car nous allons prendre des mesures au fur et à mesure que la température redescend, et on veut qu'elle descende tout de même assez vite ! Plongez le thermomètre dans l'eau ainsi que la thermo-résistance.
Pas besoin de plonger tout le PCB, juste le petit composant qui dépasse !
Vous devriez observer une élévation du signal dans le moniteur série. Notez le signal obtenu à différentes température.
Pour les besoins de cette activité, j'ai relevé le signal à 80˚C, 60˚C, 40˚C, 30˚C, la température ambiante (24˚C) et la température d'un glaçon dans l'eau (0˚C).
Passons maintenant au traitement des données !
Analyse des résultats
Les valeurs de signal analogique relevées à différentes températures figurent dans le tableau suivant.
Température (Celsius) | 0 | 24 | 30 | 40 | 50 | 60 | 80 |
---|---|---|---|---|---|---|---|
Signal | 325 | 520 | 593 | 642 | 713 | 757 | 867 |
Vous pouvez maintenant ouvrir votre tableur favori et saisir les données. Représentez les données graphiquement sous forme de nuage de point. Tous les tableurs vous permettent d'ajouter une courbe de tendance et obtenir l'équation de la fonction.
Ici nous voulons obtenir le fonction f(signal) = température, fonction qui nous permettra de trouver la température quelque soit le signal analogique lu. La température devra donc figurer en ordonnées et le signal analogique en abcisses.
Nous obtenons donc la fonction température = 0,1463 x signal - 51,713, avec un coefficient de corrélation sommes toutes acceptable (0,98046).
Retournons maintenant au code pour programmer dans un premier temps un thermomètre avec affichage dans le moniteur (nous n'aurons alors pas à toucher au montage électronique), puis dans un deuxième temps avec un affichage LCD (après avoir fait bien sur un petit peu d'electronique pour câbler l'écran).
Affichage de la température dans le moniteur série
int thermo=A0; int valTemp=0; /*varible dans laquelle sera stocké le résultat de la fonction f(signal)=temperature */ int temp=0; void setup() { pinMode(thermo, INPUT); Serial.begin(9600); } void loop() { valTemp=analogRead(thermo); /*Fonction f(signal)=température et stockage du résultat dans la variable temp*/ temp = 0.1463 * valTemp - 51.713; /*Affiche à cette position la valeur de 'temp'*/ Serial.println(temp); /*Attend 5 secondes avant de relever une nouvelle température */ delay(5000); }
Ce programme est identique au précedent à quelques exceptions près :
- Nous déclarons une nouvele variable temp: c'est la température que nous allons calculer grâce à la fonction que nous avons trouvé expérimentalement
- Nous appliquons dans le void loop la fonction f(signal)=température, soit temp = 0,1463 x valTemp - 51,713.
- Nous affichons la valeur de temp, c'est à dire la température, dans le moniteur série
Montage et programmation du thermomètre électronique à affichage digital
Montage électronique
Quelques précisions au sujet de ce montage :
- Le potentiomètre est monté sur la pin V0 du LCD : il sert à régler le contraste de l'affichage.
- Une résistance de 220 Ohm permet de protéger le rétro-élairage à LED de l'éctran LCD.
- Si vous suivez attentivement tous les fils, ceci devrait se monter comme un Lego !
Encore un peu de code...
//Importation de la bibliothèque 'LCD' #include <LiquidCrystal.h> //Déclaration des pins du LCD LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Thermo-résistance branchée sur la pin A0 int thermo=A0; //Variable dans laquelle sera stockée la valeur du signal analogique de la thermo-résistance int valTemp=0; //varible dans laquelle sera stocké le résultat de la fonction f(signal)=temperature int temp=0; void setup() { //Initialisation de la pin A0 en ENTRÉE pinMode(thermo, INPUT); //Initialisation de l'écran LCD : 16 colonnes et 2 lignes lcd.begin(16, 2); //Affiche 'température' sur l'écran LCD lcd.print("temperature :"); } void loop() { //Lecture de la valeur du signal analogique de la thermo-résistance et stockage dans valTemp valTemp=analogRead(thermo); //Fonction f(signal)=température et stockage du résultat dans la variable temp temp = 0.1463 * valTemp - 51.713; //Positionne le curseur de l'écran LCD sur la colonne 0, ligne 1 lcd.setCursor(0, 1); //Affiche à cette position la valeur de 'temp' lcd.print(temp); //Affiche 'degres C' à la suite de 'temp' lcd.print(" degres C"); //Attend 5 secondes avant de relever une nouvelle température delay(5000); }
Voilà vous avez presque fini, félicitations !
Je ne prétend pas vous faire ici un cours de programmation de l'écran LCD, le site d'Arduino est riche en ressources, mais voici tout de même quelques petites précisions au sujet de ce code :
- Nous importaons tout d'abord la bibliothèque LCD, puis déclarons ses pins
- le LCD est initialisé dans le void setup, puis on demande à afficher le mot "Temperature" (nous nous attarderons pas ici sur l'affichage des accents et des caractères spéciaux)
- les commandes "lcd.print" dans le void loop permettent d'afficher le résultat de la fonction f(signal)=température en temps réel. La prise de mesure et l'affichage sont mis à jour toutes les 5000 ms ("delay" que vous pouvez ajuster à votre guise).
Résultat final
BRAVO, VOUS AVEZ FINI ! ;)
C'est quand même un projet sympa, facile et qui marche bien !
Et il fait tout de même frais à Montréal l'hiver !
Laissez un commentaire ci-dessous si vous avez aimé / pas aimé / compris / rien compris !
Dans cette activité la démarche scientifique est mise en avant. Pas besoin de savoir bien programmer ou de connaître l'électronique sur le bout des doigts pour mener à bien ce travail pratique.
Ici on se familiarise avec la prise de mesures expérimentales, leur traitement mathématique et leur application concrète. À la fin, nous aurons construit et programmé notre thermomètre numérique à affichage digital !