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
- 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");} }