Компоненты · 15 мин чтения

NTC-термистор и Arduino: подключение, B-коэффициент и уравнение Стейнхарта — Харта

Как подключить NTC-термистор к Arduino: делитель напряжения, формулы с B-коэффициентом (B3950) и Стейнхарта — Харта, калибровка, термометр на LCD, код для ESP32 и Pico.

NTC-термистор — дешёвый датчик температуры с двумя ножками, сопротивление которого падает при нагреве. Чтобы использовать NTC-термистор с Arduino, его включают вместе с постоянным резистором на 10 kΩ как делитель напряжения, считывают напряжение в средней точке аналоговым пином (A0), по этому значению находят сопротивление термистора и переводят его в градусы Цельсия по уравнению с B-коэффициентом. Библиотека не нужна, хватает одного аналогового пина, а при правильной схеме разрешение при комнатной температуре достигает 0,1 °C. Стол и хотэнд 3D-принтеров, аккумуляторы телефонов и ноутбуков, кондиционеры, холодильники и цифровые медицинские термометры тоже чаще всего измеряют температуру NTC-термисторами.

В этой статье ты пошагово разберёшься, как сопротивление NTC-термистора на 10 kΩ меняется с температурой, как собрать делитель напряжения и подобрать постоянный резистор, как работает уравнение с B-коэффициентом при B = 3950, более точное уравнение Стейнхарта — Харта и калибровка по трём точкам. Потом соберём термометр с I2C LCD, повторим измерение на АЦП ESP32 и Raspberry Pi Pico, а также посмотрим на разницу между NTC и PTC, применение в 3D-принтерах и аккумуляторах и самые частые ошибки.

Дисковый NTC-термистор
Дисковый NTC-термистор: полярности у него нет, поэтому ножки можно подключать в любом порядке. Такие крупные модели чаще всего ограничивают пусковой ток в блоках питания; для измерения температуры берут маленькие NTC на 10 kΩ в виде эпоксидной капли или в водонепроницаемом зонде.

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

Слово «термистор» составлено из «термо» и «резистор»: это резистор, номинал которого заметно меняется с температурой. NTC означает Negative Temperature Coefficient, то есть отрицательный температурный коэффициент. Его делают из полупроводниковой керамики, которую получают спеканием оксидов металлов (марганца, никеля, кобальта) при высокой температуре. При нагреве в проводимости участвует больше носителей заряда, поэтому сопротивление падает. Изменение большое: NTC с B = 3950 около 25 °C теряет примерно 4,4% сопротивления на каждый градус. Для сравнения: обычный металлоплёночный резистор меняется всего на 50–100 ppm на градус, то есть на 0,005–0,01%. Благодаря такой чувствительности NTC — дешёвый, но очень отзывчивый датчик; плата за это — нелинейная зависимость.

ПараметрТипичный NTC на 10 kΩ (B3950)
Номинальное сопротивление (R25)10 kΩ при 25 °C; допуск обычно ±1%, ±3% или ±5%
B-коэффициентB25/50 = 3950 K (±1%); также распространены модели на 3435 K и 3380 K
ЧувствительностьОколо −4,4%/°C при 25 °C, около −2,8%/°C при 100 °C
Рабочий диапазонЭпоксидная капля примерно −40 … +125 °C; в стеклянном корпусе до 250–300 °C
Самонагрев (коэффициент рассеяния)Обычно 1,5–2 mW/°C в неподвижном воздухе
Тепловая постоянная времениОколо 10–20 с у эпоксидной капли в неподвижном воздухе
ПолярностьНет; ножки можно менять местами
Типы корпусовЭпоксидная капля, стекло (DO-35), водонепроницаемый зонд из нержавеющей стали, SMD (0402, 0603), диск

Сопротивление и температура: почему зависимость нелинейная?

Сопротивление NTC меняется с температурой по экспоненте: на холоде оно падает очень быстро, а в тепле медленнее. В таблице ниже — сопротивление NTC на 10 kΩ с B = 3950, рассчитанное по уравнению с B-коэффициентом, а также напряжение и значение analogRead на пине A0 Arduino Uno, когда этот NTC стоит в верхнем плече делителя на 10 kΩ с питанием 5 V (схема в следующем разделе). Последний столбец показывает, сколько градусов приходится на один шаг АЦП, то есть разрешение измерения. Таблицы реальных производителей могут отличаться от этих значений на несколько процентов, особенно по краям диапазона.

ТемператураСопротивление NTCНапряжение на A0 (5 V)analogReadОдин шаг ≈
−20 °C105,4 kΩ0,433 V890,20 °C
0 °C33,6 kΩ1,146 V2350,10 °C
10 °C20,2 kΩ1,657 V3390,09 °C
20 °C12,5 kΩ2,219 V4540,09 °C
25 °C10,0 kΩ2,500 V5120,09 °C
30 °C8,04 kΩ2,772 V5670,09 °C
40 °C5,30 kΩ3,268 V6690,11 °C
50 °C3,59 kΩ3,680 V7530,13 °C
60 °C2,49 kΩ4,004 V8190,17 °C
80 °C1,27 kΩ4,436 V9080,31 °C
100 °C698 Ω4,674 V9560,57 °C
125 °C359 Ω4,827 V9881,17 °C

Из таблицы следуют два важных вывода. Во-первых, делитель напряжения чувствительнее всего, когда сопротивление NTC равно постоянному резистору; в этом примере это около 25 °C: там напряжение на A0 меняется примерно на 55 mV на градус, и даже 10-битная Uno измеряет с шагом 0,09 °C. Это в пять раз лучше, чем у LM35, который с опорой 5 V даёт разрешение всего 0,49 °C. Во-вторых, чем дальше от этой точки, тем хуже разрешение: при 100 °C один шаг уже 0,57 °C, а при 125 °C — 1,2 °C. Поэтому выбирай постоянный резистор близким к сопротивлению NTC при той температуре, которую будешь измерять чаще всего. Чтобы получить максимальный размах напряжения на A0 в заданном диапазоне, постоянный резистор должен быть средним геометрическим сопротивлений NTC на двух концах диапазона: для 0–100 °C это √(33,6 kΩ × 0,70 kΩ) ≈ 4,8 kΩ, то есть стандартные 4,7 kΩ; для 60–100 °C — около 1,3 kΩ, то есть 1,2 kΩ или 1,5 kΩ.

Подключение NTC-термистора: делитель напряжения (Uno, ESP32, Pico)

Аналоговые входы Arduino измеряют напряжение, а не сопротивление. Поэтому NTC включают последовательно с постоянным резистором, получая делитель напряжения: напряжение в точке соединения двух резисторов меняется вместе с сопротивлением NTC, а значит, и с температурой. Это ровно та же схема, что и с фоторезистором (LDR); разница лишь в том, что резистор реагирует не на свет, а на температуру. В коде этой статьи NTC стоит в верхнем плече (подключён к питанию), а резистор на 10 kΩ — в нижнем (подключён к GND), поэтому при нагреве показание растёт, что интуитивно понятно. Выходное напряжение для разных номиналов можно посчитать в утилите делителя напряжения, а цветовой код постоянного резистора проверить в утилите цветового кода резисторов.

ПодключениеArduino UnoESP32Raspberry Pi Pico
Ножка 1 NTC5V3V33V3(OUT), пин 36
Ножка 2 NTC + один вывод резистора 10 kΩA0GPIO 34 (ADC1)GP26 / ADC0, пин 31
Другой вывод резистора 10 kΩGNDGNDAGND, пин 33
Конденсатор 100 nF (по желанию)Между A0 и GNDМежду GPIO 34 и GNDМежду GP26 и AGND
СхемаНапряжение на A0Сопротивление NTC (10 бит)analogRead при нагреве
NTC сверху: 5V – NTC – A0 – 10 kΩ – GNDVcc × Rs / (Rs + Rntc)Rntc = Rs × (1023 − adc) / adcРастёт
NTC снизу: 5V – 10 kΩ – A0 – NTC – GNDVcc × Rntc / (Rs + Rntc)Rntc = Rs × adc / (1023 − adc)Падает
Две самые частые ошибки такие. Первая — подключить NTC напрямую между 5V и A0 без постоянного резистора: тогда A0 при любой температуре показывает 1023. Вторая — собрать схему одним способом, а формулу взять для другого варианта подключения: тогда кажется, что при нагреве температура падает, или выходят бессмысленные значения. На ESP32 и Pico никогда не питай делитель от 5V: когда NTC стоит в верхнем плече, напряжение на пине превышает 3,3 V примерно при 41 °C, а при замыкании NTC на пин приходят все 5 V; и то и другое может повредить вход АЦП, рассчитанный на 3,3 V.

У этой схемы есть приятное свойство: измерение получается ратиометрическим. По умолчанию АЦП Uno использует в качестве опорного напряжения питание 5 V, и делитель питается от тех же 5 V. Даже если USB даёт 4,8 V вместо 5,0 V, выход делителя и опорное напряжение АЦП снижаются в одной пропорции, и значение analogRead не меняется. Поэтому для чтения NTC знать напряжение питания не нужно, и бороться с опорным напряжением, как в случае с LM35, не придётся. По той же причине не используй analogReference(INTERNAL) в схеме с NTC: с опорой 1,1 V пропорция нарушается, и расчёт получается неверным. Точность на самом деле определяет номинал постоянного резистора: резистор с допуском 5% сам по себе может дать ошибку около 1 °C. Поэтому бери металлоплёночный резистор с допуском 1% или измерь реальное сопротивление своего резистора мультиметром и впиши его в код.

Расчёт температуры по уравнению с B-коэффициентом (B = 3950)

Производители описывают NTC двумя числами: сопротивлением при 25 °C (R0 = 10 kΩ) и B-коэффициентом (Beta). По этим двум числам уравнение с B-коэффициентом даёт температуру для любого сопротивления: 1/T = 1/T0 + (1/B) × ln(R/R0). Здесь T и T0 — в кельвинах (T0 = 25 + 273,15 = 298,15 К), ln — натуральный логарифм; чтобы перевести результат в градусы Цельсия, вычти 273,15. Пример: если NTC показывает 5300 Ω, то ln(5300/10000) = −0,635; 1/T = 0,003354 − 0,000161 = 0,003193, и T = 313,2 К, то есть около 40 °C. Маленькие цифры рядом с B-коэффициентом говорят, между какими двумя температурами его измеряли: B25/50 = 3950 значит, что B рассчитан по сопротивлениям при 25 °C и 50 °C. Если даташита нет, B можно найти самостоятельно: измерь сопротивление при двух температурах и воспользуйся формулой B = ln(R1/R2) / (1/T1 − 1/T2). Например, если при 25 °C получается 10 000 Ω, а при 50 °C — 3588 Ω, выходит B ≈ 3950.

Первое измерение с Arduino шаг за шагом

  1. Вставь NTC и резистор на 10 kΩ в макетную плату; одну ножку NTC подключи к 5V, а другую — к одному выводу резистора.
  2. Другой вывод резистора соедини с GND, а от точки соединения NTC и резистора проведи перемычку к A0.
  3. Загрузи код ниже и открой монитор порта на скорости 9600 бод.
  4. При комнатной температуре должно быть около 20–25 °C. Зажми NTC между двумя пальцами: через несколько секунд значение должно подняться к 30 °C.
  5. Если при нагреве значение падает, NTC и резистор перепутаны местами: либо исправь схему, либо замени формулу в коде на формулу для варианта «NTC снизу».
C++ (Arduino IDE)
1const int NTC_PIN = A0;            // NTC ile 10k direncin birleştiği nokta / junction of the NTC and the 10k resistor
2const float SERIES_R = 10000.0;    // sabit direnç, ölçtüğün değeri yaz / fixed resistor, write your measured value
3const float R_NOMINAL = 10000.0;   // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float T_NOMINAL_K = 298.15;  // 25 °C kelvin cinsinden / 25 °C in kelvin
5const float BETA_K = 3950.0;       // B25/50 değeri (veri sayfası) / B25/50 value (datasheet)
6const int SAMPLES = 16;            // ortalama için ölçüm sayısı / number of samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;                      // ortalama ham değer / average raw value
19
20  if (adc < 1.0 || adc > 1022.0) {                       // kablo kopuk ya da kısa devre / open or shorted wire
21    Serial.println(F("Sensor hatasi / Sensor error"));
22    delay(1000);
23    return;
24  }
25
26  float rNtc = SERIES_R * (1023.0 - adc) / adc;          // NTC üstte bağlantı / NTC on the high side
27  float tempK = 1.0 / (1.0 / T_NOMINAL_K + log(rNtc / R_NOMINAL) / BETA_K);   // Beta denklemi / Beta equation
28  float tempC = tempK - 273.15;                          // kelvin -> santigrat / kelvin -> Celsius
29
30  Serial.print(F("ADC: "));
31  Serial.print(adc, 1);
32  Serial.print(F("  R: "));
33  Serial.print(rNtc, 0);
34  Serial.print(F(" ohm  Sicaklik / Temp: "));
35  Serial.print(tempC, 2);
36  Serial.println(F(" C"));
37  delay(1000);
38}

При каждом измерении код шестнадцать раз читает A0 и усредняет результат; так сглаживается дрожание АЦП на один-два шага. Если среднее меньше 1 или больше 1022, провод NTC оборван или замкнут, и вместо бессмысленной температуры код выводит сообщение об ошибке. Затем по среднему значению вычисляется сопротивление NTC, а по нему — температура по уравнению с B-коэффициентом. В Arduino функция log() возвращает натуральный логарифм (ln); log10() — это десятичный логарифм, и если их перепутать, по мере удаления от 25 °C результат становится совершенно неверным. В мониторе порта появятся строки вида «ADC: 512.3 R: 9969 ohm Sicaklik / Temp: 25.07 C».

Уравнение Стейнхарта — Харта: более точный результат

Уравнение с B-коэффициентом очень хорошо работает в диапазоне, где измерен B (обычно 25–50 °C), но вдали от него начинает «уплывать», потому что у реального NTC B-коэффициент немного меняется с температурой. В широком диапазоне, например 0–100 °C, ошибка может превысить 1 °C. Для более точного результата применяют трёхкоэффициентное уравнение Стейнхарта — Харта: 1/T = A + B × ln(R) + C × (ln R)³. Уравнение с B-коэффициентом на самом деле частный случай этого уравнения при C = 0. Коэффициенты вычисляют по трём значениям сопротивления, измеренным при трёх разных температурах; при трёх удачно выбранных точках уравнение в откалиброванном диапазоне обычно точнее 0,1 °C. Вместо того чтобы решать систему для A, B и C вручную, код ниже сам вычисляет коэффициенты по трём твоим измеренным точкам прямо в setup().

C++ (Arduino IDE)
1const int NTC_PIN = A0;
2const float SERIES_R = 10000.0;    // ölçtüğün sabit direnç / your measured fixed resistor
3
4// Kalibrasyon noktaları: örnek değerler, kendi ölçümlerini yaz / calibration points: sample values, use your own
5const float CAL_T1 = 0.0,  CAL_R1 = 32900.0;   // buzlu su / ice water
6const float CAL_T2 = 25.0, CAL_R2 = 10000.0;   // oda, referans termometreyle / room, against a reference thermometer
7const float CAL_T3 = 98.5, CAL_R3 = 690.0;     // kaynayan su / boiling water
8
9float shA, shB, shC;               // Steinhart-Hart katsayıları / coefficients
10
11void computeCoefficients() {
12  float L1 = log(CAL_R1), L2 = log(CAL_R2), L3 = log(CAL_R3);
13  float Y1 = 1.0 / (CAL_T1 + 273.15);
14  float Y2 = 1.0 / (CAL_T2 + 273.15);
15  float Y3 = 1.0 / (CAL_T3 + 273.15);
16  float g2 = (Y2 - Y1) / (L2 - L1);
17  float g3 = (Y3 - Y1) / (L3 - L1);
18  shC = ((g3 - g2) / (L3 - L2)) / (L1 + L2 + L3);
19  shB = g2 - shC * (L1 * L1 + L1 * L2 + L2 * L2);
20  shA = Y1 - (shB + shC * L1 * L1) * L1;
21}
22
23float readResistance() {
24  long sum = 0;
25  for (int i = 0; i < 16; i++) {
26    sum += analogRead(NTC_PIN);
27    delay(2);
28  }
29  float adc = sum / 16.0;
30  if (adc < 1.0 || adc > 1022.0) return -1.0;            // sensör hatası / sensor error
31  return SERIES_R * (1023.0 - adc) / adc;                // NTC üstte / NTC on the high side
32}
33
34void setup() {
35  Serial.begin(9600);
36  computeCoefficients();           // katsayıları bir kez hesapla / compute the coefficients once
37}
38
39void loop() {
40  float r = readResistance();
41  if (r < 0) {
42    Serial.println(F("Sensor hatasi / Sensor error"));
43  } else {
44    float lnR = log(r);
45    float tempK = 1.0 / (shA + shB * lnR + shC * lnR * lnR * lnR);   // Steinhart-Hart
46    Serial.print(F("R: "));
47    Serial.print(r, 0);
48    Serial.print(F(" ohm  Sicaklik / Temp: "));
49    Serial.print(tempK - 273.15, 2);
50    Serial.println(F(" C"));
51  }
52  delay(1000);
53}

Три точки в коде — лишь пример; измерь свой NTC и подставь свои значения. С этими примерными значениями Стейнхарт — Харт даёт точно правильный результат при 0 °C, 25 °C и 98,5 °C. А если подать те же сопротивления в уравнение с B-коэффициентом (B = 3950), точка 0 °C превращается в 0,4 °C, а точка 98,5 °C — в 100,4 °C, то есть при высокой температуре ошибка около 2 °C. Выбирай точки на обоих концах и в середине диапазона, который будешь измерять; за пределами откалиброванного диапазона (например, при −20 °C с этими коэффициентами) ошибка снова растёт. На Uno тип float всего 32-битный, но для этого расчёта этого достаточно: результаты совпадают с расчётом двойной точности в пределах 0,01 °C.

Калибровка: превращаем NTC в надёжный термометр

  1. Измерь постоянный резистор: измерь мультиметром реальное сопротивление резистора на 10 kΩ и впиши его в код как SERIES_R; отклонение на 1% само по себе даёт ошибку около 0,2 °C.
  2. Защити NTC от воды: не опускай голый эпоксидный NTC в воду; изолируй ножки термоусадочной трубкой и силиконом или возьми готовый NTC в зонде из нержавеющей стали.
  3. Точка 0 °C: наполни стакан доверху колотым льдом, добавь немного холодной воды и перемешай. Подержи NTC в середине стакана 2–3 минуты и, когда значение установится, запиши значение R из монитора порта.
  4. Точка комнатной температуры: оставь NTC на 10 минут рядом с надёжным цифровым термометром в месте без сквозняков; запиши показание термометра и сопротивление NTC.
  5. Точка высокой температуры: на уровне моря вода кипит при 100 °C, но на каждые 300 м высоты температура кипения падает примерно на 1 °C (около 96,7 °C на высоте 1000 м). Опусти NTC в кипящую воду, не касаясь дна кастрюли, и запиши сопротивление.
  6. Впиши значения в код: введи три точки в код Стейнхарта — Харта. Если измерять нужно только около комнатной температуры, часто хватает коррекции смещения по одной точке (вычитания постоянной разницы).
Когда понятно, откуда берётся ошибка, видно, куда стоит прикладывать усилия. Для NTC на 10 kΩ с B3950: допуск R25 ±1% даёт около ±0,2 °C; допуск B ±1% — ±0,2 °C при 0 °C и ±0,9 °C при 100 °C. В делителе 5 V с резистором 10 kΩ на NTC рассеивается не больше 0,625 mW, и в неподвижном воздухе он нагревает сам себя примерно на 0,3–0,4 °C. Чтобы уменьшить этот эффект, можно питать делитель не от 5V, а от цифрового пина и выставлять на нём HIGH только на время измерения, либо взять NTC на 100 kΩ с постоянным резистором 100 kΩ. Во втором случае добавь конденсатор 100 nF между A0 и GND, потому что АЦП ATmega328P рассчитан на источник с сопротивлением примерно до 10 kΩ.

Термометр на NTC с LCD-дисплеем

Чтобы видеть показания без компьютера, добавим I2C LCD 16x2. Подключи пин SDA дисплея к A4, SCL — к A5, VCC — к 5V, GND — к GND; схема NTC остаётся прежней. Код использует библиотеку LiquidCrystal I2C, которую можно установить через «Менеджер библиотек» (Library Manager). Адрес дисплея обычно 0x27, на некоторых модулях 0x3F. Для значка градуса выводим символ 223 из таблицы символов LCD. В нижней строке дисплей также показывает минимальную и максимальную температуру с момента включения Arduino.

LCD-дисплей I2C 2x16
I2C LCD 16x2: благодаря I2C-модулю на обратной стороне подключается всего 4 проводами (GND, VCC, SDA, SCL); синий подстроечный резистор регулирует контрастность.
C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);   // adres 0x27 ya da 0x3F / address 0x27 or 0x3F
5
6const int NTC_PIN = A0;
7const float SERIES_R = 10000.0;
8const float R_NOMINAL = 10000.0;
9const float T_NOMINAL_K = 298.15;
10const float BETA_K = 3950.0;
11
12float minC = 999.0;                   // en düşük değer / lowest value
13float maxC = -999.0;                  // en yüksek değer / highest value
14
15float readTempC() {
16  long sum = 0;
17  for (int i = 0; i < 16; i++) {
18    sum += analogRead(NTC_PIN);
19  }
20  float adc = sum / 16.0;
21  if (adc < 1.0 || adc > 1022.0) return NAN;             // sensör hatası / sensor error
22  float r = SERIES_R * (1023.0 - adc) / adc;
23  return 1.0 / (1.0 / T_NOMINAL_K + log(r / R_NOMINAL) / BETA_K) - 273.15;
24}
25
26void setup() {
27  lcd.init();
28  lcd.backlight();
29}
30
31void loop() {
32  float t = readTempC();
33  lcd.clear();
34  if (isnan(t)) {
35    lcd.print(F("Sensor hatasi"));
36  } else {
37    if (t < minC) minC = t;
38    if (t > maxC) maxC = t;
39    lcd.print(F("Sicaklik "));
40    lcd.print(t, 1);
41    lcd.print((char)223);             // derece işareti / degree symbol
42    lcd.print('C');
43    lcd.setCursor(0, 1);              // ikinci satır / second row
44    lcd.print(F("Min"));
45    lcd.print(minC, 1);
46    lcd.print(F(" Max"));
47    lcd.print(maxC, 1);
48  }
49  delay(1000);
50}

NTC-термистор и ESP32

АЦП ESP32 12-битный (0–4095), а сама микросхема работает от 3,3 V, поэтому делитель питай от пина 3V3. NTC всегда подключай к пину ADC1 (GPIO 32–39): пины ADC2 нельзя читать при включённом Wi-Fi. Карту пинов своей платы можно посмотреть в утилите распиновки. Здесь есть важное отличие: АЦП ESP32 использует как опору не напряжение питания, а внутреннее опорное напряжение около 1,1 V с выбранным ослаблением (attenuation). Поэтому ратиометрическое измерение, как на Uno, автоматически не получается, и нужно знать реальное напряжение на линии 3V3. Вот почему код читает милливольты функцией analogReadMilliVolts(), которая использует записанные в микросхему на заводе калибровочные данные, и вычисляет сопротивление по значению 3V3, измеренному мультиметром. Согласно документации Espressif, классический ESP32 при ослаблении 11 dB по умолчанию измеряет 150–3100 mV, но рекомендуемая и самая линейная область — 150–2450 mV. Эти пределы задают диапазон температур, который можно измерить, в зависимости от схемы:

Схема (3,3 V, 10 kΩ)150–2450 mV (точнее всего)150–3100 mV (полный диапазон)
NTC сверху: 3V3 – NTC – GPIO 34 – 10 kΩ – GNDПримерно −30 … +50 °CПримерно −30 … +100 °C
NTC снизу: 3V3 – 10 kΩ – GPIO 34 – NTC – GNDПримерно +3 … +114 °CПримерно −26 … +114 °C
C++ (Arduino IDE)
1const int NTC_PIN = 34;            // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const float VCC_MV = 3300.0;       // 3V3 pinini multimetreyle ölçüp yaz / measure the 3V3 pin and write it here
3const float SERIES_R = 10000.0;
4const float R_NOMINAL = 10000.0;
5const float T_NOMINAL_K = 298.15;
6const float BETA_K = 3950.0;
7const int SAMPLES = 64;            // ortalama için ölçüm sayısı / number of samples to average
8
9void setup() {
10  Serial.begin(115200);
11  analogReadResolution(12);                     // 0–4095
12  analogSetPinAttenuation(NTC_PIN, ADC_11db);   // varsayılan zayıflatma / default attenuation
13}
14
15void loop() {
16  uint32_t sum = 0;
17  for (int i = 0; i < SAMPLES; i++) {
18    sum += analogReadMilliVolts(NTC_PIN);       // kalibre edilmiş mV / calibrated millivolts
19    delay(1);
20  }
21  float mv = sum / (float)SAMPLES;
22
23  if (mv < 150.0 || mv > 3100.0) {              // ADC aralığı dışında / outside the ADC range
24    Serial.println("Aralik disi / Out of range");
25    delay(1000);
26    return;
27  }
28
29  float rNtc = SERIES_R * (VCC_MV - mv) / mv;   // NTC üstte / NTC on the high side
30  float tempC = 1.0 / (1.0 / T_NOMINAL_K + log(rNtc / R_NOMINAL) / BETA_K) - 273.15;
31  Serial.printf("Gerilim / Voltage: %.0f mV  R: %.0f ohm  Sicaklik / Temp: %.2f C\n", mv, rNtc, tempC);
32  delay(1000);
33}

Для комнатного или уличного термометра идеально подходит схема «NTC сверху». Если нужно измерять выше 50 °C, например чайник, кофемашину или стол 3D-принтера, перенеси NTC в нижнее плечо и замени формулу на Rntc = Rs × mV / (Vcc − mV). При включённом Wi-Fi броски тока ESP32 дают небольшие пульсации на линии 3V3; усреднение 64 измерений и конденсатор 100 nF между GPIO 34 и GND заметно улучшают результат. Если ESP32 для тебя в новинку, про настройку читай в статье «Что такое ESP32».

NTC с Raspberry Pi Pico и MicroPython

12-битный АЦП Pico выведен на пины GP26, GP27 и GP28; в MicroPython read_u16() возвращает результат, приведённый к диапазону 0–65535. Опорное напряжение АЦП Pico (ADC_VREF) формируется на плате из линии 3,3 V через небольшой RC-фильтр. Если делитель тоже питать от пина 3V3(OUT), измерение получается почти ратиометрическим, как на Uno, и формула остаётся той же; просто вместо 1023 используется 65535. АЦП Pico немного шумит и слегка скачет на некоторых кодах, поэтому и здесь без усреднения не обойтись. Если использовать AGND (пин 33) как аналоговую землю, шум немного снижается. Если Pico в руках впервые, установку MicroPython найдёшь в статье «Что такое Raspberry Pi Pico».

MicroPython
1from machine import ADC
2import math
3import time
4
5ntc = ADC(26)                # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6SERIES_R = 10000             # sabit direnç / fixed resistor
7R_NOMINAL = 10000            # NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
8T_NOMINAL_K = 298.15         # 25 °C kelvin cinsinden / 25 °C in kelvin
9BETA_K = 3950                # B25/50 değeri / B25/50 value
10SAMPLES = 64                 # ortalama için ölçüm sayısı / number of samples to average
11
12
13def read_temp_c():
14    total = 0
15    for _ in range(SAMPLES):
16        total += ntc.read_u16()          # 0–65535
17    raw = total / SAMPLES
18    if raw < 100 or raw > 65435:
19        return None                      # kopuk ya da kısa devre / open or shorted
20    r_ntc = SERIES_R * (65535 - raw) / raw          # NTC üstte / NTC on the high side
21    temp_k = 1 / (1 / T_NOMINAL_K + math.log(r_ntc / R_NOMINAL) / BETA_K)
22    return temp_k - 273.15
23
24
25while True:
26    t = read_temp_c()
27    if t is None:
28        print("Sensor hatasi / Sensor error")
29    else:
30        print("Sicaklik / Temp: {:.2f} C".format(t))
31    time.sleep(1)

В MicroPython math.log() тоже возвращает натуральный логарифм, поэтому формула та же, что и в коде для Arduino. У Pico есть и встроенный датчик температуры (ADC(4)), но он измеряет температуру самой микросхемы, а не окружающей среды, и во время работы обычно завышает показания на несколько градусов. Для температуры воздуха внешний NTC гораздо точнее. Если нужны коэффициенты Стейнхарта — Харта, функцию computeCoefficients() из кода для Arduino можно перевести на Python в несколько строк.

NTC и PTC: в чём разница?

У PTC-термисторов (Positive Temperature Coefficient, положительный температурный коэффициент) сопротивление с температурой растёт. Самый распространённый тип PTC служит для защиты, а не для измерения: переключающие PTC из керамики на основе титаната бария сохраняют низкое сопротивление до определённой температуры (точки Кюри), а выше неё их сопротивление резко подскакивает в сотни и тысячи раз. По этому принципу работают защита обмоток двигателей от перегрева и саморегулирующиеся PTC-нагреватели. Похожим образом ведут себя полимерные самовосстанавливающиеся предохранители (polyfuse); предохранитель на 500 mA на линии USB у Arduino Uno — один из них. Кремниевые PTC-датчики вроде KTY81, напротив, меняются почти линейно, примерно на 0,7–0,8%/°C. Платиновые термометры сопротивления (RTD), такие как PT100 и PT1000, тоже имеют положительный коэффициент, но это металлические датчики, а не термисторы: при 0 °C они показывают 100 Ω или 1000 Ω, работают выше 500 °C и для чтения требуют усилителя, например MAX31865.

ПараметрNTC-термисторПереключающий PTCPT100 / PT1000 (RTD)
Сопротивление при нагревеПадает (около −4,4%/°C при 25 °C)Меняется мало, затем резко растёт при температуре переключенияРастёт (около +0,385%/°C)
ХарактеристикаЭкспоненциальная, нелинейнаяРезкий скачок (как у переключателя)Почти линейная
Типичный диапазон−40 … +125 °C (250–300 °C в стекле)Температура переключения задаётся моделью (например, 80 °C, 120 °C)−200 … +500 °C и выше
Основное применениеИзмерение температуры, ограничение пускового токаЗащита от перегрева и перегрузки по токуТочные промышленные измерения
Чтение с ArduinoДелитель напряжения + аналоговый пинДля измерения обычно не применяетсяЧерез модуль усилителя, например MAX31865
ЦенаОчень дешёвыйДешёвыйДороже

Применение в 3D-принтерах и аккумуляторах

В 3D-принтерах температуру и хотэнда, и стола чаще всего измеряют NTC-термисторами. Здесь вместо NTC на 10 kΩ ставят NTC на 100 kΩ, потому что при 250 °C NTC на 10 kΩ падает примерно до 35 Ω, и измерение теряет разрешение; в конфигурационном файле популярной прошивки Marlin для обычного термистора на 10 kΩ даже есть предупреждение «do not use for a hotend, it gives bad resolution at high temp» (не использовать для хотэнда, плохое разрешение при высокой температуре). На 8-битных платах вроде RAMPS входы термисторов подтянуты к 5 V резистором 4,7 kΩ, а Marlin переводит значение АЦП в температуру по готовым таблицам; один из типов, определённых для термисторов 100 kΩ B3950, — номер 11. Если провод термистора оборвётся, АЦП покажет максимум, прошивка примет это за сильный холод и выдаст Err: MINTEMP; при коротком замыкании появится Err: MAXTEMP. Если термистор выскользнет из гнезда, нагреватель продолжит греть, а измеренное значение расти не будет; Marlin ловит это защитой THERMAL RUNAWAY и отключает нагреватели. Никогда не отключай эту защиту.

Литий-ионные ячейки нельзя заряжать ниже 0 °C и выше примерно 45 °C: зарядка на холоде приводит к отложению металлического лития внутри ячейки и необратимо её повреждает. Поэтому в большинстве аккумуляторов телефонов, ноутбуков и электровелосипедов к ячейкам приклеен NTC, а третий контакт на разъёме аккумулятора (с пометкой T или NTC) обычно ведёт к этому термистору. Вывод 1 (TEMP) популярной микросхемы зарядки TP4056 нужен именно для этого: согласно даташиту, если напряжение на этом выводе дольше 0,15 секунды остаётся ниже 45% или выше 80% входного напряжения, зарядка приостанавливается. В собственном проекте с аккумулятором можно приклеить NTC к ячейке, читать его с Arduino и отключать цепь зарядки MOSFET-транзистором, когда температура выходит за пределы. В блоках питания крупные дисковые NTC ограничивают пусковой ток, который течёт в конденсаторы при включении устройства; по мере нагрева их сопротивление падает с нескольких ом до долей ома, поэтому в обычном режиме потери очень малы.

Модуль зарядки Li-ion TP4056
Модуль зарядки TP4056 со входом USB-C и схемой защиты: вывод TEMP микросхемы может следить за температурой ячейки с помощью NTC; на большинстве готовых модулей этот вывод соединён с GND, и функция отключена.

Идеи проектов с NTC-термистором

  • Термостат для вентилятора с гистерезисом: включай вентилятор через модуль реле, когда температура превышает 30 °C, и выключай, когда она падает до 28 °C; зазор в 2 градуса не даёт реле постоянно щёлкать.
  • Термометр для аквариума с водонепроницаемым зондом: измеряй температуру воды NTC-зондом из нержавеющей стали и включай зуммер, если нагреватель откажет.
  • Карманный термометр с OLED-дисплеем: показывай температуру и график за последний час на OLED-дисплее.
  • Монитор корпуса 3D-принтера: измеряй температуру внутри закрытого корпуса и запускай вытяжной вентилятор выше 45 °C.
  • Защита аккумулятора по температуре: следи за температурой ячейки во время зарядки, прерывай зарядку вне диапазона 0–45 °C и предупреждай светодиодом.
  • Регистратор температуры с Wi-Fi: на ESP32 записывай показание на SD-карту каждую минуту или показывай его на веб-странице, которую открываешь на телефоне.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
Значение всегда 1023 или 0Нет постоянного резистора, оборван провод или замкнут NTCПроверь делитель; при 25 °C мультиметр должен показывать на A0 около 2,5 V
При нагреве температура падаетNTC и постоянный резистор перепутаны местамиИсправь схему или возьми формулу для другого варианта подключения
Результат −273.15 °C, inf или nananalogRead возвращает 0, и происходит деление на нольПроверь провод; не убирай из кода проверку диапазона
Около 25 °C верно, дальше сильно неверноВместо ln использован log10() или неверный B-коэффициент (например, 3950 для NTC на 3435)Используй log() и введи B-коэффициент из даташита NTC
Значение всегда завышено на 1–2 °CСамонагрев или NTC стоит рядом со стабилизатором или модулем ESP32Питай делитель только во время измерения, вынеси NTC на кабеле подальше от платы
Показания дрожатПомехи, длинные провода или плохой контакт в макетной платеУсредняй показания, добавь конденсатор 100 nF, скрути провода
Бессмысленные значения на ESP32 на холоде или в жаруНапряжение вне линейной области АЦП 150–2450 mVВыбери схему под свой диапазон (см. таблицу для ESP32)
Чтение на ESP32 ломается при запуске Wi-FiNTC подключён к пину ADC2Используй один из пинов ADC1, GPIO 32–39
Очень медленная реакцияТепловая инерция толстого зонда или корпусаЭто нормально; для быстрой реакции выбирай тонкую эпоксидную каплю или SMD NTC
Если не получается выбрать между NTC, LM35 и DS18B20, рассуждай так: NTC — самый дешёвый и быстро реагирующий датчик с наибольшим выбором корпусов, но его точность зависит от калибровки. DS18B20 с завода имеет точность ±0,5 °C, его цифровой выход надёжен даже на длинных кабелях, а несколько датчиков могут делить один пин. LM35 даёт линейный аналоговый выход, но требует не меньше 4 V. Подробное сравнение есть в статье сравнение датчиков температуры, а чтобы глубже разобраться в работе АЦП, загляни в статью об аналого-цифровом преобразовании.

NTC-термистор учит превращать дешёвую деталь в точный термометр с помощью одного резистора и нескольких строк математики: делитель напряжения, АЦП, логарифмы и калибровка — всё в одном. Тот же подход пригодится потом и с другими аналоговыми датчиками; а чтобы показания стали ещё плавнее, посмотри приёмы фильтрации данных датчиков. В приложении BlueGrays есть проекты «Измерение температуры с NTC и LCD-дисплеем 2x16», «Температура и влажность с DHT11», температурная станция на ESP32 с LCD и регистратор температуры, у каждого — пошаговые схемы подключения и готовый код.

Частые вопросы

Для чего нужен NTC-термистор?

NTC-термистор — полупроводниковый резистор, сопротивление которого падает при росте температуры. Чаще всего его используют для измерения температуры: 3D-принтеры, кондиционеры, холодильники, аккумуляторные сборки и цифровые термометры обычно измеряют температуру с помощью NTC. Крупные дисковые модели ограничивают пусковой ток в блоках питания.

Как проверить NTC-термистор мультиметром?

Переключи мультиметр в режим измерения сопротивления и измерь между двумя ножками NTC; NTC на 10 kΩ должен показывать около 10 kΩ при 25 °C и около 12,5 kΩ при 20 °C. Затем зажми NTC пальцами: в течение нескольких секунд сопротивление должно заметно упасть. Если на дисплее OL (обрыв) или значение близко к нулю, термистор неисправен.

Чем NTC отличается от PTC?

У NTC сопротивление при нагреве падает, а у PTC растёт. NTC в основном применяют для измерения температуры и ограничения пускового тока. Самые распространённые PTC — защитные компоненты, сопротивление которых резко подскакивает при определённой температуре; так работают защита двигателей от перегрева и саморегулирующиеся нагреватели.

Какой резистор нужен для NTC-термистора на 10k?

Если измерять нужно около комнатной температуры, бери резистор, равный сопротивлению NTC при 25 °C, то есть 10 kΩ: при этой температуре делитель наиболее чувствителен. Для конкретного диапазона лучший номинал — среднее геометрическое сопротивлений NTC на двух концах диапазона, например около 4,7 kΩ для 0–100 °C. Ради точности выбирай металлоплёночный резистор с допуском 1%.

Что означает B-коэффициент термистора (3950)?

B-коэффициент — константа материала, которая показывает, как быстро сопротивление NTC меняется с температурой; измеряется он в кельвинах. B25/50 = 3950 значит, что он рассчитан по сопротивлениям при 25 °C и 50 °C. Если в коде не использовать реальный B-коэффициент своего NTC, ошибка растёт по мере удаления от 25 °C.

Что лучше: NTC-термистор, DS18B20 или LM35?

Ради скорости, низкой цены и малого размера выбирай NTC; для точности ±0,5 °C без калибровки и длинных кабелей лучше DS18B20. LM35 даёт линейный аналоговый выход, но требует не меньше 4 V, поэтому с ESP32 и Pico на 3,3 V он неудобен. Выше 125 °C (например, в хотэнде 3D-принтера) нужен NTC в стеклянном корпусе, PT100 или термопара.

Все проекты
Измерение температуры с NTC и LCD-дисплеем 2x16
#44Новичок
Premium

Измерение температуры с NTC и LCD-дисплеем 2x16

Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

4.5(33)
44
Температура и влажность с DHT11
#55Средний

Температура и влажность с DHT11

Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

4.7(47)
73
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Измерение освещённости модулем LDR на ESP32
#113Новичок

Измерение освещённости модулем LDR на ESP32

Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

4.6(36)
55
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

4.8(38)
56
Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Продвинутый
Premium

Регистратор температуры на ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Собери на ESP32 регистратор температуры с отметками времени! Каждую минуту читай температуру и влажность с DHT22, бери реальное время из DS1307 RTC и записывай всё на карту microSD в формате CSV. OLED показывает текущую температуру (крупным шрифтом), влажность в процентах, время и счётчик записей. Файл /temp_log.csv на SD-карте открывается в Excel, Google Sheets или Python pandas — идеально для теплиц, комнат, лабораторий и хранения продуктов.

4.7(7)
12
LCD-экран с I2C
#32Новичок
Premium

LCD-экран с I2C

Дай своему Arduino собственный экран и заставь его написать первое сообщение. Двухстрочный LCD-экран подключается всего несколькими проводами; в верхней строке появляется приветствие, затем второе соо

4.8(53)
70
Цифровой вольтметр с LCD-дисплеем
#56Средний
Premium

Цифровой вольтметр с LCD-дисплеем

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

4.5(27)
36