Терморезистор (или термистор) — это такой резистор, который меняет свое электрическое сопротивление в зависимости от температуры.
Существует два вида термисторов: PTC — с положительным температурным коэффициентом, и NTC — с отрицательным. Положительный коэффициент означает, что с повышением температуры сопротивление термистора растёт. NTC-термистор ведет себя противоположным способом.
Также термисторы отличаются номинальным сопротивлением, которое соответствует комнатной температуре — 25 C°. Например, популярными являются термисторы с номиналом 100 кОм и 10 кОм. Такие термисторы часто используют в 3D-принтерах.
В этом уроке мы будет использовать термистор NTC 100K в стеклянном корпусе. Вот такой:
Чтобы измерить сопротивление термистора, подключим его в качестве нижнего плеча делителя напряжения. Среднюю же точку делителя подключим к аналоговому входу Ардуино — A0.
Подключение термистора к Ардуино
Чтобы измерить сопротивление термистора, подключим его в качестве нижнего плеча делителя напряжения. Среднюю же точку делителя подключим к аналоговому входу Ардуино — A0.
Чтобы измерить сопротивление термистора, подключим его в качестве нижнего плеча делителя напряжения. Среднюю же точку делителя подключим к аналоговому входу Ардуино — A0.
Принципиальная схема
Внешний вид макета
Какое сопротивление должен иметь резистор в верхнем плече делителя? Как правило, используют резистор с сопротивлением, совпадающим по порядку с номиналом термистора. В нашем уроке мы используем резистор на R1 = 102 кОм, его легко получить последовательным соединением двух резисторов на 51 кОм.
Программа для вычисления сопротивления термистора
Первая программа, которую мы напишем, будет вычислять сопротивление термистора в Омах.
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
const byte tempPin = A0;
void setup() {
Serial.begin( 9600 );
pinMode( tempPin, INPUT );
}
void loop() {
int t = analogRead( tempPin );
float tr = 1023.0 / t - 1;
tr = SERIAL_R / tr;
Serial.println(tr);
delay(100);
}
Результат работы программы:
Можно заметить, что измеренное сопротивление термистора меньше 100 кОм, значит температура окружающей среды ниже 25 C°. Следующий шаг — вычисление температуры в градусах Цельсия.
Программа для вычисления температуры на термисторе
Чтобы вычислить значение температуры используют формулу Стейнхарта — Харта:
Уравнение имеет параметры A,B и C, которые нужно брать из спецификации к датчику. Так как нам не требуется большой точности, можно воспользоваться модифицированным уравнением (B-уравнение):
В этом уравнении неизвестным остается только параметр B, который для NTC термистора равен 3950. Остальные параметры нам уже известны:
- T0 — комнатная температура в Кельвинах, для которой указывается номинал термистора; T0 = 25 + 273.15;
- T — искомая температура, в Кельвинах;
- R — измеренное сопротивление термистора в Омах;
- R0 — номинальное сопротивление термистора в Омах.
Модифицируем программу для Ардуино, добавив расчет температуры:
#define B 3950 // B-коэффициент
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)
const byte tempPin = A0;
void setup() {
Serial.begin( 9600 );
pinMode( tempPin, INPUT );
}
void loop() {
int t = analogRead( tempPin );
float tr = 1023.0 / t - 1;
tr = SERIAL_R / tr;
Serial.print("R=");
Serial.print(tr);
Serial.print(", t=");
float steinhart;
steinhart = tr / THERMISTOR_R; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= B; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
Serial.println(steinhart);
delay(100);
}
Результат:
Уже лучше! Программа показывает нам температуру в градусах Цельсия. Как и ожидалось, она немного ниже 25 C°.