.. note::

    Bonjour, bienvenue dans la communauté Facebook des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 ! Plongez au cœur de Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.

    **Pourquoi nous rejoindre ?**

    - **Support d'experts** : Résolvez vos problèmes après-vente et vos défis techniques grâce à l'aide de notre communauté et de notre équipe.
    - **Apprenez et partagez** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux avant-goûts.
    - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
    - **Promotions festives et concours** : Participez à des concours et promotions à l'occasion des fêtes.

    👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !

2.2.2 Thermistor
===================

Introduction
---------------

Tout comme une photorésistance peut détecter la lumière, une thermistance est 
un dispositif électronique sensible à la température qui permet de réaliser des 
fonctions de contrôle de température, comme la création d'une alarme de surchauffe.

Composants
-------------

.. image:: img/list_2.2.2_thermistor.png


Principe
------------

Une thermistance est une résistance thermosensible qui présente un changement précis 
et prévisible de sa résistance proportionnel à de petites variations de température. 
L'ampleur de ce changement dépend de sa composition spécifique. Les thermistances font 
partie d'un groupe plus large de composants passifs. Contrairement aux composants actifs, 
les dispositifs passifs ne peuvent pas fournir de gain de puissance ou d'amplification 
dans un circuit.

La thermistance est un élément sensible, et elle existe sous deux formes : Coefficient de 
Température Négatif (CTN) et Coefficient de Température Positif (CTP), aussi connus sous 
les abréviations CTN et CTP. Sa résistance varie de manière significative avec la température. 
La résistance de la thermistance CTP augmente avec la température, tandis que celle de la 
CTN fait l'inverse. Dans cette expérience, nous utilisons une CTN.

.. image:: img/image325.png


Le principe est que la résistance de la thermistance CTN varie en fonction de la 
température de l'environnement extérieur. Elle détecte la température en temps réel 
de l'environnement. Lorsque la température augmente, la résistance de la thermistance 
diminue. Ensuite, les données de tension sont converties en quantités numériques via 
l'adaptateur A/D. La température, en degrés Celsius ou Fahrenheit, est ensuite affichée 
grâce à la programmation.

Dans cette expérience, une thermistance et une résistance de rappel de 10k sont utilisées. 
Chaque thermistance a une résistance nominale. Ici, elle est de 10k ohms, mesurée à 25 
degrés Celsius.

Voici la relation entre la résistance et la température :

R\ :sub:`T` =R\ :sub:`N` exp\ :sup:`B(1/TK – 1/TN)`

**R\ T** est la résistance de la thermistance CTN à la température **T\ K**.

**R\ N** est la résistance de la thermistance CTN à la température nominale 
**T\ N**. Ici, la valeur de **R\ N** est de 10k.

**T\ K** est la température en Kelvin, avec une unité en K. Ici, la valeur de 
**T\ K** est 273,15 + degrés Celsius.

**T\ N** est une température nominale en Kelvin ; l'unité est également K. Ici, 
la valeur de **T\ N** est 273,15 + 25.

Et **B**\ (bêta), la constante matérielle de la thermistance CTN, est également 
appelée indice de sensibilité thermique, avec une valeur numérique de 3950.

**exp** est l'abréviation d'exponentielle, et le nombre de base **e** est un 
nombre naturel qui vaut environ 2,7.

Convertissez cette formule
T\ :sub:`K`\ =1/(ln(R\ :sub:`T`/R\ :sub:`N`)/B+1/T\ :sub:`N`) pour obtenir la 
température en Kelvin, à laquelle il faut soustraire 273,15 pour obtenir les degrés Celsius.

Cette relation est une formule empirique. Elle est précise uniquement lorsque la 
température et la résistance se situent dans une plage effective.

Schéma de câblage
---------------------

.. image:: img/image323.png


.. image:: img/image324.png


Procédures expérimentales
----------------------------

**Étape 1 :** Montez le circuit.

.. image:: img/image202.png
    :width: 800


**Étape 2 :** Accédez au dossier du code.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/c/2.2.2/

**Étape 3 :** Compilez le code.

.. raw:: html

   <run></run>

.. code-block::

    gcc 2.2.2_Thermistor.c -lwiringPi -lm

.. note::
    -lm permet de charger la bibliothèque mathématique. Ne l'omettez pas, sinon vous obtiendrez une erreur.

**Étape 4 :** Exécutez le fichier exécutable.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Une fois le programme exécuté, la thermistance détecte la température ambiante, qui 
sera affichée à l'écran à la fin du calcul du programme.

.. note::

    Si cela ne fonctionne pas après l'exécution, ou s'il y a un message d'erreur indiquant : "wiringPi.h: Aucun fichier ou répertoire de ce type", veuillez vous référer à :ref:`C code is not working?`.

**Code**

.. code-block:: c

    #include <wiringPi.h>
    #include <stdio.h>
    #include <math.h>

    typedef unsigned char uchar;
    typedef unsigned int uint;

    #define     ADC_CS    0
    #define     ADC_CLK   1
    #define     ADC_DIO   2

    uchar get_ADC_Result(uint channel)
    {
        uchar i;
        uchar dat1=0, dat2=0;
        int sel = channel > 1 & 1;
        int odd = channel & 1;

        digitalWrite(ADC_CLK, 1);
        delayMicroseconds(2);
        digitalWrite(ADC_CLK, 0);
        delayMicroseconds(2);

        pinMode(ADC_DIO, OUTPUT);
        digitalWrite(ADC_CS, 0);
        // Bit de démarrage
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Mode entrée unique
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Impair
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // Sélectionner
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);

        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

        for(i=0;i<8;i++)
        {
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

            pinMode(ADC_DIO, INPUT);
            dat1=dat1<<1 | digitalRead(ADC_DIO);
        }

        for(i=0;i<8;i++)
        {
            dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
        }

        digitalWrite(ADC_CS,1);
        pinMode(ADC_DIO, OUTPUT);
        return(dat1==dat2) ? dat1 : 0;
    }

    int main(void)
    {
        unsigned char analogVal;
        double Vr, Rt, temp, cel, Fah;
        if(wiringPiSetup() == -1){ // En cas d'échec d'initialisation de wiringPi, affichez un message à l'écran
            printf("setup wiringPi failed !");
            return 1;
        }
        pinMode(ADC_CS,  OUTPUT);
        pinMode(ADC_CLK, OUTPUT);

        while(1){
            analogVal = get_ADC_Result(0);
            Vr = 5 * (double)(analogVal) / 255;
            Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
            temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
            cel = temp - 273.15;
            Fah = cel * 1.8 +32;
            printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);
            delay(100);
        }
        return 0;
    }

**Explication du Code**

.. code-block:: c

    #include <math.h>

Il s'agit d'une bibliothèque mathématique en C qui déclare un ensemble de fonctions permettant de réaliser des opérations et des transformations mathématiques courantes.

.. code-block:: c

    analogVal = get_ADC_Result(0);

Cette fonction est utilisée pour lire la valeur de la thermistance.

.. code-block:: c

    Vr = 5 * (double)(analogVal) / 255;
    Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
    temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
    cel = temp - 273.15;
    Fah = cel * 1.8 +32;
    printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

Ces calculs convertissent les valeurs de la thermistance en degrés Celsius.

.. code-block:: c

    Vr = 5 * (double)(analogVal) / 255;
    Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));

Ces deux lignes de code calculent la répartition de la tension avec la valeur 
analogique lue afin d'obtenir Rt (résistance de la thermistance).

.. code-block:: c

    temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));

Ce code se réfère à l'intégration de Rt dans la formule
**T\ K\ =1/(ln(R\ T/R\ N)/B+1/T\ N)** pour obtenir la température en Kelvin.

.. code-block:: c

    temp = temp - 273.15;

Conversion de la température en Kelvin en degrés Celsius.

.. code-block:: c

    Fah = cel * 1.8 +32;

Conversion des degrés Celsius en Fahrenheit.

.. code-block:: c

    printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

Affiche les degrés Celsius, Fahrenheit et leurs unités à l'écran.
