Ардуино и термистор. NTC MF52AT. Схема подключения. Скетч. 4

Продолжим тему об измерении температуры с помощью Ардуино
В предыдущей статье мы рассмотрели примеры использования датчиков температуры и

Рассмотрим теперь измерение температуры с помощью терморезистора .

Терморезистор(термистор) — полупроводниковый резистор, в котором используется зависимость электрического сопротивления полупроводникового материала от температуры

Для измерения температуры с помощью терморезистора необходимо подключить его в схему делителя напряжения. И по полученному значению напряжения в средней точке мы сможем определить температуру.

Схема подключения термистора к
NTC-MF52AT

Далее, используя таблицу соответствий сопротивления от температуры, напишем :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
float addr[151][2] = {
{0,28.0170},
{1,26.8255},
{2,25.6972},
{3,24.6290},
{4,23.6176},
{5,22.6597},
{6,21.7522},
{7,20.8916},
{8,20.0749},
{9,19.2988},
{10,18.5600},
{11,18.4818},
{12,18.1489},
{13,17.6316},
{14,16.9917},
{15,16.2797},
{16,15.5350},
{17,14.7867},
{18,14.0551},
{19,13.3536},
{20,12.6900},
{21,12.0684},
{22,11.4900},
{23,10.9539},
{24,10.4582},
{25,10.0000},
{26,9.5762},
{27,9.1835},
{28,8.8186},
{29,8.4784},
{30,8.1600},
{31,7.8608},
{32,7.5785},
{33,7.3109},
{34,7.0564},
{35,6.8133},
{36,6.5806},
{37,6.3570},
{38,6.1418},
{39,5.9343},
};
 
void setup() {
.begin(9600);
pinMode(A0,INPUT) ;
}
 
void loop() {
Serial.println(analogRead(A0));
Serial.println(getTemp(analogRead(A0)));
delay(2000);
}
 
float getR(float V)
{
float result;
result=-10*V/(V-1024);
return result;
}
 
float getTemp(float V)
{
float R;
R=getR(V);
int i=0;
while (addr[i][1] >R)
{
i++;
}
float result;
result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
return result;
}
float addr[151][2] = {
{0,28.0170},
{1,26.8255},
{2,25.6972},
{3,24.6290},
{4,23.6176},
{5,22.6597},
{6,21.7522},
{7,20.8916},
{8,20.0749},
{9,19.2988},
{10,18.5600},
{11,18.4818},
{12,18.1489},
{13,17.6316},
{14,16.9917},
{15,16.2797},
{16,15.5350},
{17,14.7867},
{18,14.0551},
{19,13.3536},
{20,12.6900},
{21,12.0684},
{22,11.4900},
{23,10.9539},
{24,10.4582},
{25,10.0000},
{26,9.5762},
{27,9.1835},
{28,8.8186},
{29,8.4784},
{30,8.1600},
{31,7.8608},
{32,7.5785},
{33,7.3109},
{34,7.0564},
{35,6.8133},
{36,6.5806},
{37,6.3570},
{38,6.1418},
{39,5.9343},
};

void setup() {
Serial.begin(9600);
pinMode(A0,INPUT) ;
}

void loop() {
Serial.println(analogRead(A0));
Serial.println(getTemp(analogRead(A0)));
delay(2000);
}

float getR(float V)
{
float result;
result=-10*V/(V-1024);
return result;
}

float getTemp(float V)
{
float R;
R=getR(V);
int i=0;
while (addr[i][1] >R)
{
i++;
}
float result;
result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
return result;
}

https://github.com/bigbarrelru/NTC_MF52AT_10K

Алгоритм программы:

  1.  Считываем значение на аналоговом входе
  2. Вычисляем сопротивление терморезистора относительно 5v и 10к
  3. Вычисляем по таблице температуру в зависимости от полученного сопротивления

Если у Вас нет таблицы зависимостей, тогда можно воспользоваться зависимостью выведенной Джоном Стейнхарт и Стэнли Харт в 1968 году

1/T=A+Bln(R)+C(ln(R))^3
где T — температура в Кельвинах, R -сопротивление, A B C — коэффициенты зависящие от типа термистора(из даташита или выводятся эмпирически)

Напишем скетч для определения температуры по формуле Стейнхарта-Харта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
double A=, B=, C=;//коэффициенты зависящие от типа термистора(из даташита или выводятся эмпирически)
void setup(){
pinMode(A0, INPUT);
}
 
void loop() {
double term=term1(analogRead(A0));
Serial.println(term);
delay(2000);
}
 
float getR(float V) //функция преобразования значения полученного с аналогового входа в сопротивление терморезистора
{
float result;
result=-10*V/(V-1024);
return result;
}
 
float term1(int AnalogDC)
{
double tempertura;
tempertura = 1 / (A + B * (log(getR(AnalogDC))) + C * (log(getR(AnalogDC)))*(log(getR(AnalogDC)))*(log(getR(AnalogDC))) );
tempertura = tempertura - 273.15;
return tempertura;
}
double A=, B=, C=;//коэффициенты зависящие от типа термистора(из даташита или выводятся эмпирически)
void setup(){
pinMode(A0, INPUT);
}

void loop() {
double term=term1(analogRead(A0));
Serial.println(term);
delay(2000);
}

float getR(float V) //функция преобразования значения полученного с аналогового входа в сопротивление терморезистора
{
float result;
result=-10*V/(V-1024);
return result;
}

float term1(int AnalogDC)
{
double tempertura;
tempertura = 1 / (A + B * (log(getR(AnalogDC))) + C * (log(getR(AnalogDC)))*(log(getR(AnalogDC)))*(log(getR(AnalogDC))) );
tempertura = tempertura - 273.15;
return tempertura;
}

 

4 комментс для “Ардуино и термистор. NTC MF52AT. Схема подключения. Скетч.

  1. Ответить Airat_K Июн 28, 2015 22:36

    Доброго времени суток) Есть один вопрос почему использовали резистор на 10 кОМ? Заранее Благодарю за ответ) Спасибо)

    • Ответить Slava Июн 29, 2015 15:16

      При измерении в диапазоне от 0 до 50 градусов необходимо подобрать сопротивление так, чтобы крайние точки измерений были измеримыми нашим аналоговым входом.

      Можем столкнуться с тем, что нам не хватит дискретности входа для точного измерения. Ведь аналоговый вход имеет разрядность всего 10бит

      т.е. в идеале, берем среднюю температуру и подбираем сопротивление так, чтобы результат был равен половине разрядности. И тогда у нас будет диапазон +-5бит от средней измеряемой температуры, причем дискретность(точность) будет одинаковой.

      Для данного термистора средняя точка 25 градусов это номинал 10кОм

  2. Ответить Святослав Окт 24, 2015 10:10

    Здравствуйте!
    При попытке компиляции скетча по формуле Стейнхарта-Харта появляется такая ошибка:

    error: expected primary-expression before ‘,’ token

    Видимо проблкма в строке
    double A=, B=, C=;

    • Ответить Slava Окт 24, 2015 16:35

      A B C — коэффициенты зависящие от типа термистора(из даташита или выводятся эмпирически)

Добавить комментарий