# Thermistance¶

La termistance est un capteur de température dont la résistance électrique varie avec la température ambiante. Le modèle utilisé dans ce TP est une CTN (Coefficient de Température Négatif) pour lequel la résistance électrique $R$ et la température $T$ varient en sens inverse. La relation entre $R$ et $T$ est fournie par le constructeur. Elle suit généralement une relation de la forme : $$ \frac{1}{T} = a + b \ln R + c \left(\ln R \right)^{3} $$ $a$, $b$, $c$ étant des données constructeur qui peuvent également être obtenues avec trois mesures de référence.

Dans le cas où la température varie dans un domaine de température limité, cette relation est approchée par la relation suivante. $$\frac{1}{T} = \dfrac{\ln\left(R / R_0\right)}{\beta}+\dfrac{1}{T_0}$$ $\beta$ est une constante de température (kelvin), $R_0$ est une résistance de référence (ohms) et $T_0$ est la température à laquelle s’applique la résistance de référence (kevlin). Ces constantes sont caracteristiques de la thermistance utilisée. La température en degrés Celsius s'en déduit : $\theta = T - 273{,}15$.

Il est possible d'acheter des thermistances CTN (10K) étanches pour un prix très raisonnable (< 1 € ref : NTC https://fr.aliexpress.com/item/NTC-Thermistor-accuracy-temperature-sensor-10K-1-3950-Waterproof-Probe-1m-New/32216081544.html précision capteur de température 10 K 1% 3950 Sonde Étanche 1 m)

- $\beta = 3380\,\text{K}\pm1\%$
- $R_0 = 10\,\text{k}\Omega\pm1\%$
- plage de mesure:-20 à 105 $^o$C avec $T_0 \simeq 298\,\text{K}$

## Les informations liées à la carte Arduino¶

### Le montage électrique¶

## Le code arduino à compléter pour le premier groupe¶

    void setup() {
      Serial.begin(9600);           //Initialisation de la liaison série à la vitesse de 9600 bauds
    }

    void loop() {
      float UTherm = analogRead(0);  //Lecture de l'information sur l'entrée analogique A0
      // ...
      // À compléter
      // ...
      delay(1000);
    }

## Le code Python¶

Les modules nécessaires à l'ensemble des objectifs fixés

In [ ]:

    import os                        # operating system
    import serial                    # pour la connexion au port série (USB)
    import pandas as pd              # pour faire de l'analyse de données
    import matplotlib.pyplot as plt  # pour tracer des graphiques

Dans cette fonction il s'agit d'écrire l'expression littérale Python qui permet la conversion de la valeur numérique envoyée par le CAN de l'Arduino vers la valeur tension donnée par le capteur.

In [ ]:

    def num_to_dec(val, uref, bits):
        '''
        val  -> int   : valeur numérique envoyée par le CAN
        uref -> float : valeur tension de réference de la carte Arduino, par défaut 5 V
        bits -> int   : précision du CAN de l'Arduino (Arduino Uno 10 bits)
        '''
        return # À compléter

Déclaration des constantes physiques de la thermistance données par le constructeur

In [ ]:

    beta  = 3380
    Rzero = 10000
    Tzero = 298

Valeur de la résistance du pont diviseur, à choisir pour obtenir la pleine échelle

In [ ]:

    R     = 10000
    U_ref = 5.0

### Récupération des données¶

On force la réinitialisation juste avant la lecture des données envoyées par l'Arduino.

Une des broches matérielles de contrôle du flux (DTR) du circuit intégré ATmega8U2 est connecté à la ligne de réinitialisation de l'ATmega328 via un condensateur de 100 nanofarads. Lorsque cette broche est mise au niveau BAS, la broche de réinitialisation s'abaisse suffisamment longtemps pour réinitialiser le microcontrôleur.

In [ ]:

    def synchro_arduino(port_name, vitesse):
        """
        Cette fonction initialise et renvoie une référence sur la connexion
        avec la carte arduino à travers le port série (USB).
        Elle permet également de synchroniser le lancement de l'acquisition
        coté Arduino avec la récupération des données coté Python.
        """
        serial_port = serial.Serial( port = port_name, baudrate =vitesse)
        serial_port.setDTR(False)
        time.sleep(0.1)
        serial_port.setDTR(True)
        serial_port.flushInput()
        return serial_port

Le code principal à compléter permettant de récupérer les données, on peut très fortement s'inspirer du Notebook arduino-python

In [ ]:

    # ouverture du port série
    serial_port = synchro_arduino("numero_port_serie", 9600)

    # les mesures
    temps = []
    UTher = []

    duree       = 20000    # en milliseconde
    end         = False

    # on récupère les données
    while (not end) or (temps[-1] - temps[0] < duree):

        # À compléter

        except:
            pass
    # fermeture du port série
    serial_port.close()

### Traitement des données avec le module pandas¶

Dans un premier temps, il convient de créer un dataframe qui contient toutes les donneés tabulaires que l'on souhaite enregistrer. Dans notre cas, il s'agit des listes (tableaux) `temps` et `UTher`. La méthode DataFrame (http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe) assure cette opération. Elle reçoit en arguments les différentes listes précédées d'une intitulé de colonne. Dans notre exemple, nous intitulons Temps, et UTher les deux colonnes. Attention les guillemets sont obligatoires pour indiquer que nous utilisons des chaines de caractères pour les noms de colonnes. Ne pas confondre avec les listes de valeurs numériques de mêmes noms.

In [ ]:

    data = pd.DataFrame({
      "Temps" : temps,
      "UTher" : UTher
    })

In [ ]:

    data.iloc[:5]

Transformation des valeurs numériques en valeurs analogiques, comme dans un tableur nous pouvons affecter l'ensemble des valeurs d'une même colonne par des opérations mathématiques.

In [ ]:

    data['UTher_a'] = num_to_dec(data['UTher'], 5, 10)

Calcul de $R$ thermistance

In [ ]:

    data['RTher']   = (data['UTher_a'] * R) / (U_ref - data['UTher_a'])

Calcul de la valeur de la température

In [ ]:

    # À compléter
    data['Temp']    =

In [ ]:

    data.iloc[:5]

## Représentation graphique avec le module `matplotlib.pyplot`¶

Afficher le graphe de la température en fonction du temps