6 практических схем с термисторами NTC в Arduino — как измерять температуру без лишних трат

6 практических схем с термисторами NTC в Arduino — как измерять температуру без лишних трат

6 практических схем с термисторами NTC в Arduino — как измерять температуру без лишних трат

Ты хочешь измерять температуру в своём проекте — в теплице, в коробке с батареями, в системе охлаждения или даже в чайнике. Но датчики вроде DS18B20 или BMP280 кажутся дорогими, а термисторы NTC — слишком «старомодными». Нет, они не устарели. Они просто не рекламируются. И если ты знаешь, как их правильно подключить, они станут твоим лучшим другом: дешёвые, точные, надёжные. Я не разбирался в термисторах годами — пока не попробовал их в реальных проектах. Вот что сработало.

Что такое NTC-термистор и зачем он тебе

NTC — это термистор с отрицательным температурным коэффициентом. Проще: чем теплее, тем меньше сопротивление. При 25°C у типичного NTC — 10 кОм. При 50°C — уже 2–3 кОм. При 0°C — 30 кОм и выше. Это не датчик с цифровым выходом. Это просто резистор, поведение которого ты должен «перевести» в температуру. И это — твоя задача. Но она простая, если не пытаться всё делать «как в учебнике».

Почему именно NTC? Потому что:

  • Один термистор стоит 10–30 рублей;
  • Не требует дополнительной микросхемы;
  • Работает от -40°C до +150°C (в зависимости от модели);
  • Отвечает быстро — за 1–5 секунд, если не упакован в термоусадку.

Главный минус: нелинейность. Сопротивление меняется не по прямой, а по экспоненте. Но Arduino справляется — если не пытаться считать температуру вручную по формуле Стейнхарта-Харта без калибровки.

Схема 1: Простейший делитель напряжения — для теста и быстрого старта

Самый простой способ — подключить термистор последовательно с фиксированным резистором (например, 10 кОм) между 5 В и GND. Точку между ними подключаешь к аналоговому входу Arduino (A0). Это делитель напряжения. Напряжение на A0 будет меняться, когда сопротивление термистора меняется.

Схема:

  • 5 В → резистор 10 кОм → A0 → термистор NTC (10 кОм при 25°C) → GND

Код:

const int thermistorPin = A0;
const int fixedResistor = 10000; // 10 кОм

void setup() {
  Serial.begin(9600);
}

void loop() {
  int adcValue = analogRead(thermistorPin);
  float voltage = adcValue * (5.0 / 1023.0);
  float thermistorResistance = fixedResistor * (5.0 - voltage) / voltage;
  float temperature = 1.0 / (log(thermistorResistance / 10000.0) / 3950.0 + 1.0 / 298.15) - 273.15;
  Serial.print("Температура: ");
  Serial.print(temperature);
  Serial.println("°C");
  delay(1000);
}

Здесь я использовал формулу Стейнхарта-Харта с параметром B = 3950 — это стандарт для многих NTC 10 кОм. Но это не универсально. У твоего термистора B может быть 3380, 3435, 4050 — смотри в даташите. Если даташита нет — калибруй сам.

Эта схема — для теста. Она работает, но не идеальна: если ты подаёшь 5 В, а термистор сильно нагревается, ток через него растёт — и он может греться сам, искажая показания. Но для комнатной температуры — ок.

Схема 2: Делитель с пониженным напряжением — для точности и стабильности

Проблема схемы 1 — самонагрев термистора. Решение: уменьшить ток. Как? Подать не 5 В, а 3.3 В. Или использовать резистор побольше — например, 47 кОм.

Схема:

  • 3.3 В → резистор 47 кОм → A0 → термистор NTC (10 кОм) → GND

Почему 47 кОм? Потому что при 25°C сопротивление термистора 10 кОм — получается делитель 47:10. Напряжение на A0 будет около 0.6 В — это в пределах чувствительности ADC. Ток — около 60 мкА. Мало. Термистор не греется. Точность растёт.

Код тот же. Только теперь в формуле замени fixedResistor на 47000 и 5.0 на 3.3.

Это — лучший вариант для долгосрочных проектов: термистор не греется, показания стабильны, расход энергии минимален. Особенно актуально, если проект работает от батареи.

Схема 3: Два термистора — для измерения разницы температур

Нужно измерить, насколько холоднее вентилятор, чем воздух в коробке? Или насколько греется батарея при зарядке? Тогда используй два термистора.

Подключи оба как делители, но к разным аналоговым входам — A0 и A1. Используй один резистор на 10 кОм для обоих — если они одинаковые. Или по отдельному резистору.

Пример: контроль зарядки Li-Ion

  • Термистор 1 — на корпусе батареи;
  • Термистор 2 — в воздухе рядом;
  • Если разница больше 5°C — включи вентилятор.

Код:

int temp1 = analogRead(A0);
int temp2 = analogRead(A1);

float t1 = calcTemp(temp1, 10000);
float t2 = calcTemp(temp2, 10000);

if (t1 - t2 > 5.0) {
  digitalWrite(fanPin, HIGH);
} else {
  digitalWrite(fanPin, LOW);
}

Так ты не просто измеряешь температуру — ты отслеживаешь изменение. Это мощно. Например, в аккумуляторных боксах для электросамокатов — именно так делают защиту от перегрева.

Схема 4: Термистор + операционный усилитель — для высокой точности

Если тебе нужно измерять температуру с точностью ±0.1°C — делитель напряжения не справится. ADC Arduino — 10 бит, погрешность ±1–2 бита. Это 0.5–1°C. Для точной работы — мало.

Решение: усилить сигнал. Возьми операционный усилитель (например, LM358) и собери неинвертирующий усилитель с коэффициентом 5–10. Подключи делитель термистор-резистор к входу ОУ. На выходе — сигнал 0–5 В, который уже можно читать с высокой точностью.

Почему это работает? Допустим, при изменении температуры сопротивление термистора меняется на 100 Ом. В делителе это даёт изменение напряжения на 0.005 В — слишком мало для Arduino. А если усилить в 10 раз — получится 0.05 В. Это 10 шагов ADC. Теперь ты видишь разницу в 0.1°C.

Это — для профессиональных проектов: термостаты, лабораторные установки, контроль печей. Не для дачного теплицы. Но если ты хочешь точности — это путь.

Схема 5: Термистор в цепи с реле — для автоматического управления

Ты хочешь, чтобы вентилятор включался при 30°C, а выключался при 25°C? Или чтобы нагреватель включался при 15°C? Проще всего — термистор + реле.

Схема:

  • Термистор + резистор → A0 → Arduino;
  • Arduino → транзистор (2N2222) → реле → нагреватель/вентилятор.

Код:

const int thermistorPin = A0;
const int relayPin = 7;

void setup() {
  pinMode(relayPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int adc = analogRead(thermistorPin);
  float temp = calcTemp(adc, 10000);

  if (temp > 30.0) {
    digitalWrite(relayPin, HIGH); // включить вентилятор
  } else if (temp < 25.0) {
    digitalWrite(relayPin, LOW);  // выключить
  }

  Serial.println(temp);
  delay(1000);
}

Важно: добавь гистерезис. Без него реле будет дёргаться при 27°C — включилось, выключилось, снова включилось. Это сожрёт реле за неделю. Гистерезис — это разница между включением и выключением. У меня — 5°C. Достаточно.

Схема 6: Термистор в воде — для измерения температуры жидкости

Воду, масло, антифриз — всё это можно мерить термистором. Но не просто так. Термистор — это стеклянная или эпоксидная капсула. Если его просто бросить в воду — он пропитается, и через месяц перестанет работать.

Как сделать правильно:

  1. Возьми термистор в металлическом корпусе (например, 3 мм диаметром, 10 мм длиной) — такие есть в продаже как «водонепроницаемые NTC».
  2. Запаяй его в термоусадку, а потом в стеклотканевую трубку или медную трубку.
  3. Заполни трубку термопастой — это улучшает теплопередачу.
  4. Запечатай конец эпоксидкой или силиконом.

Подключай как схему 2 — через 47 кОм и 3.3 В. Проверь: если температура воды 20°C — термистор показывает 21–22°C? Значит, тепло плохо передаётся. Добавь термопасты или уменьши толщину изоляции.

Пример: контроль температуры воды в аквариуме. Термистор в трубке — в воде. Ардуино включает подогрев, если температура падает ниже 24°C. Надёжно. Работает два года без замены.

Таблица: Какой термистор и резистор выбрать?

Цель Термистор NTC Резистор (для делителя) Напряжение питания Почему так
Тест, быстрый старт 10 кОм при 25°C, B=3950 10 кОм 5 В Просто, всё есть под рукой
Долгосрочный проект 10 кОм при 25°C, B=3950 47 кОм 3.3 В Меньше ток — меньше самонагрев, точнее
Измерение разницы температур Два одинаковых 10 кОм 10 кОм на каждый 3.3 В Одинаковые датчики — одинаковые ошибки
Высокая точность (±0.1°C) 10 кОм, B=3950, в корпусе 10 кОм 5 В → через ОУ Усиление сигнала компенсирует шум ADC
Управление реле 10 кОм, B=3950 47 кОм 3.3 В Стабильность + гистерезис = долгая жизнь реле
Измерение в воде Водонепроницаемый, металлический корпус 47 кОм 3.3 В Изоляция + термопаста = точность и долговечность

Частые ошибки — и как их избежать

  1. Игнорируешь B-параметр. У всех термисторов он разный. Если ты используешь формулу с B=3950, а у тебя термистор с B=3435 — ошибка до 3–5°C. Смотри на маркировку или калибруй.
  2. Подключаешь термистор к 5 В без ограничения тока. Термистор нагревается сам — и показывает не температуру окружающей среды, а свою собственную. Используй резистор 47 кОм и 3.3 В.
  3. Используешь термистор без изоляции в воде. Через месяц — короткое замыкание. Никогда не бросай его в воду без герметизации.
  4. Забываешь про гистерезис. Реле дёргается — сгорает. Добавь 2–5°C разницы между включением и выключением.
  5. Доверяешь одному измерению. Считай среднее за 5–10 измерений. Шум ADC — реальность. Особенно если рядом — моторы или светодиоды.

Что выбрать — в зависимости от ситуации

  • Если ты просто тестируешь — возьми 10 кОм NTC, 10 кОм резистор, 5 В. Проверь, работает ли вообще. Это временно.
  • Если проект должен работать годами — 10 кОм NTC, 47 кОм резистор, 3.3 В. Герметизируй, если нужно. Добавь гистерезис, если управляешь реле.
  • Если нужно измерять разницу температур — два одинаковых термистора. Используй одинаковые резисторы и одинаковые схемы. Разница будет точной.
  • Если нужна точность до 0.1°C — усилитель. Без него не получится. Arduino — не лабораторный прибор.
  • Если измеряешь жидкость — только герметичный термистор. Потому что вода — враг электроники.

Как лучше сделать — практические рекомендации

  • Калибруй сам. Возьми термометр с погрешностью ±0.2°C (например, цифровой с датчиком типа LM35). Помести термистор и термометр в стакан с водой. Нагревай медленно. Запиши показания ADC при 20°C, 25°C, 30°C, 35°C. Построй таблицу. Напиши простую функцию в коде — float calcTemp(int adc) — и используй интерполяцию. Это точнее, чем формула Стейнхарта-Харта с «угаданным» B.
  • Используй конденсатор 100 нФ между A0 и GND — это сгладит шум. Особенно если рядом — моторы или светодиоды.
  • Если используешь несколько термисторов — не подключай их к одному резистору. У каждого — свой делитель. Иначе токи мешают друг другу.
  • Проверяй термистор мультиметром. При комнатной температуре сопротивление должно быть близко к заявленному. Если 10 кОм — а показывает 8 кОм — возможно, он уже повреждён.
  • Пиши код с отладочным выводом. Выводи не только температуру, но и ADC-значение и сопротивление. Это поможет понять, где проблема — в схеме или в коде.

Итог: что делать прямо сейчас

Если ты хочешь измерять температуру — не покупай DS18B20. Возьми термистор NTC 10 кОм. Стоит 15 рублей. Купи резистор 47 кОм — 5 рублей. Подключи по схеме 2: 3.3 В → 47 кОм → A0 → термистор → GND. Загрузи код с формулой Стейнхарта-Харта (B=3950). Проверь в комнате — показывает 22–24°C? Отлично. Добавь гистерезис, если управляешь вентилятором. Герметизируй, если в воде. И всё — у тебя точный, надёжный, дешёвый датчик температуры.

Ты не должен платить за «умные» датчики, если можешь сделать «глупый» — но рабочий — сам. Термисторы — не устаревшие. Они просто требуют чуть больше внимания. И это стоит того.

Информация в статье носит ознакомительный характер. При работе с электроникой, особенно при подключении к реле, нагревателям или воде, соблюдай меры безопасности. Для критически важных систем (медицина, промышленность, безопасность) используй сертифицированные датчики и консультируйся со специалистом.

radio-blog.ru — электроника и технологии