BTS Mesure BTS Mesure
Présentation2014CapteursModulationTyponsArduinoDémodulationApp InventorCourbesVidéos
 
PrésentationSimulationGSMGPSSDCapteursFinal

La CTN

Une résistance CTN  permet  mesurer la température grâce à des propriétés semi-conductrices non linéaires.

 Celle ci possède un Coefficient de Température Négatif (CTN), c’est à dire que la résistance diminue quand la température augmente.

La loi de variation de la résistance d’une CTN en fonction de la température est donnée par la formule :

  • avec : R0 valeur de la résistance à T = 273+25 = 298 K (attention dans cette formule il faut exprimer T en K ! )
  • b : indice de sensibilité thermique en K
  • T0 = 298K

Nous disposons de cette CTN :

  • Stainless steel sheath and waterproof
  • Measurement range: -20 to 105 °C
  • Length of wire: 1 meter
  • Size of probe: 5 x 25 mm
  • Output: 2 wires
  • Type: NTC 10k±1% 3950
  • measure environmental temperatures using arduino ADC and this 10k NTC LINK
  • Resistance to temperature conversion table LINK
  •  B-constant : 3380K -/+ 1%

Nous allons l'utiliser dans un pont diviseur :

A l'aide du diviseur de tension nous exprimons la tension Vs en fonction de R(t) :

Nous allons placer cette CTN à l'intérieur de la nacelle.
La gamme de température sera comprise entre -20°C et 40°C.
La température de milieu de gamme est donc de 10°C.

L'étude que nous avons réalisée avec un tableur nous montre que la sensibilité est maximale
lorsque R1 = R(10°C) = 18 k.

Cette courbe T(Vs) a en ordonnée la température T en °C et en abcisse la tension Vs.

Pour R1 = 18 k et  E = 5 V :

  • gamme de température : -20°C à +40 °C
  • plage de tension : 1,05 V à  3,87 V (étendue : 2,82 V)
  • Sensibilité moyenne : 47 mV/°C

  Etendue   Min Max
Plage de tension en V 2,82   1,05 3,87
Sensibilité en mv/°C 47   30 55

Dans une plage de température restreinte un modèle du premier ordre peut-être utilisé.

Mais comme le montre notre étude théorique un modèle du 3ème ordre donne de bien meilleurs résultats
(coefficient de corrélation de 0,99995)

L'Arduino peut effectuer très facilement une équation du 3ème degré...

 

Etalonnage

Un étalonnage est indispensable car il y a une variation importante de R0 et b.

 

 

 

 

 

 

 

Etalonnage automatisé avec un Arduino :

/* Objectif 
Lire la tension de sortie du montage 1 Pile    A0  -> M0
Lire la tension de sortie du montage 2 PT1000   A1  -> M1
Lire la tension de sortie du montage 3 CTN 10k  A2  -> M2
Lire la température indiquée par le dht22 

*/

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>

#define DHTPIN 3     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)

LiquidCrystal_I2C lcd(0x27,20,4);
DHT dht(DHTPIN, DHTTYPE);

int mes,i,M0=0,M1,M2;
int chipSelect=10;
int indicatorLed = 13; 
boolean error=false;
char message[140];
float t,VPT1000,VCTN,Pile;



void setup()
{
  Serial.begin(9600);
  pinMode(indicatorLed, OUTPUT);
  lcd.init();                      // initialize the lcd  
  lcd.noBacklight();
  dht.begin();                    // Initialiser le capteur dht22 
  lcd.setCursor(15, 0);
  if (!SD.begin(chipSelect)) {error=true;lcd.print("SD Er");}  // Initialisation carte SD
    else {lcd.print("SD OK");iniSD();}
  lcd.setCursor(0, 0);
  lcd.print("M");
  lcd.setCursor(7, 0); 
  lcd.print("T=");
  lcd.setCursor(0, 1);
  lcd.print("Mes1 PT100  =");
  lcd.setCursor(0, 2);
  lcd.print("Mes2 PT1000 =");
  lcd.setCursor(0, 3);
  lcd.print("Mes3 CTN    =");
}

void loop()
{
    if(i%30==3) lcd.noBacklight();  
    t = dht.readTemperature();
    M0=analogRead(A0);
    M1=analogRead(A1);
    M2=analogRead(A2);
    VPT1000=5.0/1024.0*M1;
    VCTN=5.0/1024.0*M2;
    Pile=10.0/1024.0*M0;
    affiche();  
    if (i%30==0) ecrireSD();
    i++;
    delay(1000); // Show new results every second.
  }

  void affiche() {
    lcd.setCursor(9, 0);
    lcd.print(t,1);
    lcd.setCursor(14, 1);
    lcd.print(M0);
    lcd.print("  ");
    lcd.setCursor(14, 2);
    lcd.print(M1);
    lcd.print("  ");
    lcd.setCursor(14, 3);
    lcd.print(M2);
    lcd.print("  ");    
    Serial.print(t,1);Serial.print(" C\t Pile=");
    Serial.print(Pile,1);Serial.print(" V\t CTN="); 
    Serial.print(VCTN,3);Serial.print(" V\t PT1000=");
    Serial.print(VPT1000,3);Serial.println(" V");
    if (error) Serial.println ("Erreur SD");   
    }
    
  void iniSD() {
      File TEMPtab = SD.open("TEMPtab.csv", FILE_WRITE);
      if (TEMPtab) {
        error=false;
        TEMPtab.println("mes;t(dht);Pile;PT1000;CTN;VCTN;VPT1000");
        TEMPtab.close();
        }
      else  {
        error=true;
        lcd.setCursor(15,0);
        lcd.print("SD Er");}
  }  
    
    
  void ecrireSD(){
      mes++;
      lcd.backlight();
      lcd.setCursor(1, 0);
      lcd.print(mes);
      File TEMPtab = SD.open("TEMPtab.csv", FILE_WRITE);
      if (TEMPtab) {
        error=false;
        TEMPtab.print(mes);
        TEMPtab.print(";");
        TEMPtab.print(t,1);
        TEMPtab.print(";");
        TEMPtab.print(Pile,1); 
        TEMPtab.print(";");
        TEMPtab.print(M1); 
        TEMPtab.print(";");
        TEMPtab.print(M2);
        TEMPtab.print(";");
        TEMPtab.print(VCTN,3);
        TEMPtab.print(";");
        TEMPtab.println(VPT1000,3);
        TEMPtab.close();
        }
      else  {
        error=true;
        lcd.setCursor(15,0);
        lcd.print("SD Er");}

    }