Термистор и Arduino: схема подключения, делитель напряжения и формула Стейнхарта
Термистор — это резистор, сопротивление которого сильно зависит от температуры. У самого ходового типа NTC оно падает при нагреве: при двадцати пяти градусах ровно десять килоом, при ста — меньше килоома. Стоит он дешевле любого цифрового датчика, работает от минус пятидесяти до трёхсот градусов и не требует библиотек.
Расплата — нелинейность. Зависимость сопротивления от температуры описывается не прямой, а экспонентой, поэтому просто перевести показания функцией map не получится: нужна формула.
Схема подключения
Распиновка модуля
| Провод | Куда и зачем |
|---|---|
| VCC | Питание 5 В. |
| GND | Земля. |
| OUT (AO) | Аналоговый выход — средняя точка делителя. На любой вход A0–A5. |
Характеристики
- Сопротивление при 25 °C
- 10 кОм — самый ходовой номинал
- Коэффициент бета
- 3950 для большинства модулей
- Диапазон
- −50…+110 °C у обычных, до 300 °C у высокотемпературных
- Точность
- ±1 °C после калибровки
- Резистор делителя
- 10 кОм
- Библиотека
- не нужна
Почему нельзя обойтись функцией map
Функция map переводит одну шкалу в другую по прямой линии. У термистора зависимость экспоненциальная: возле комнатной температуры сопротивление меняется быстро, а при нагреве всё медленнее. Прямая линия совпадёт с реальностью только в одной точке, а в остальных даст ошибку в десятки градусов.
Практический путь — упрощённая формула с коэффициентом бета. Для дешёвых термисторов он равен 3950 и обычно указан в описании товара. Точность получается около градуса, чего хватает почти для всего.
Если нужна точность в десятые доли, применяют уравнение Стейнхарта-Харта с тремя коэффициентами, которые определяют, замерив сопротивление при трёх известных температурах — например, в тающем льду, при комнатной и в кипятке.
Библиотека
не нужна— Всё считается встроенными математическими функциями. Библиотеки вроде Thermistor лишь прячут ту же формулу за парой вызовов.
Готовый скетч
const int PIN_NTC = A0;
const float SERIES_RESISTOR = 10000.0; // постоянный резистор делителя
const float NOMINAL_RESISTANCE = 10000.0; // сопротивление при 25 °C
const float NOMINAL_TEMPERATURE = 25.0;
const float BETA = 3950.0; // указан в описании термистора
void setup() {
Serial.begin(9600);
}
void loop() {
// усредняем, чтобы убрать дрожание последнего разряда
long sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(PIN_NTC);
delay(5);
}
float raw = sum / 10.0;
// из показаний АЦП получаем сопротивление термистора
float resistance = SERIES_RESISTOR / (1023.0 / raw - 1.0);
// формула бета: логарифм отношения сопротивлений
float steinhart = resistance / NOMINAL_RESISTANCE;
steinhart = log(steinhart);
steinhart /= BETA;
steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15; // из кельвинов в цельсии
Serial.print(steinhart);
Serial.println(" C");
delay(1000);
}Скетч собирается arduino-cli под Arduino UNO
Формула выглядит громоздко, но делает одно: переводит сопротивление в температуру по кривой, а не по прямой. Все константы сверху — их и правят под свой термистор.
Частые ошибки
Температура отличается на десятки градусов
Показания переведены функцией map вместо формулы. У термистора нелинейная характеристика, и линейный перевод даёт правильное значение лишь в одной точке.
Значения дрожат на несколько градусов
Шум аналогового входа усиливается формулой. Усредняйте десяток замеров, как в скетче, и ставьте конденсатор на 100 нФ между входом и землёй.
Термистор и резистор перепутаны местами
Тогда температура пойдёт в обратную сторону: нагрев будет показывать похолодание. Меняются местами либо детали, либо формула.
Показания завышены на пару градусов
Термистор греется собственным током. Он мал, но при длительном измерении заметен: помогает опрашивать датчик реже или брать резистор делителя большего номинала.
Коэффициент бета взят наугад
У разных термисторов он отличается — 3435, 3950, 4050. Ошибка в бете даёт систематический сдвиг всей шкалы. Значение указывают в описании товара.
Что понадобится
- Термистор NTC 10 кОм или готовый модуль
- Резистор 10 кОм — если термистор без платы
- Arduino UNO
- Провода «папа-мама»