ELECTRONICS

Термистор и 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. Ошибка в бете даёт систематический сдвиг всей шкалы. Значение указывают в описании товара.

Что понадобится