Ардуино подключение терморезистора. Терморезисторы

Здравствуй, Хабрасообщество. После прочтения нескольких статей на хабе Arduino я загорелся заполучить эту игрушку. И вот недавно получил посылку с платой. Затем побаловался со светодиодами и захотел чего-нибудь посерьёзнее. Решил сделать простейший термометр, используя всего термистор, резистор на 10 кОм и LCD дисплей. Кому интересно что получилось - прошу под кат.

Начало

Термистор - это переменный резистор, меняющий своё сопротивление в зависимости от температуры окружающей среды.

Нам потребуются следующие детали:
Arduino Uno - 1 шт
Термистор - 1 шт
Резистор c сопротивлением 10 кОм - 1 шт
LCD дисплей HJ1602A - 1 шт
Соединительные перемычки - несколько штук

Всё это у меня было, поэтому я сразу начал проектирование на breadboard.

Ножки к экрану я еще припаял в день покупки.

Затем присоединяем экран к выходам Arduino. У моего экрана распиновка такая.

1 (GND) GND - Земля
2 (VDD) 5v - Питание(+)
3 (VO/Contrast) - Управление контрастностью (сюда я подключил переменный резистор)
4 (RS) - 12 - Канал данных
5 (RW) - 11 - Канал данных
6 (E) - 10 - Канал данных
11 (DB4) - 5 - Канал данных
12 (DB5) - 4 - Канал данных
13 (DB6) - 3 - Канал данных
14 (DB7) - 2 - Канал данных
15 (BL1/Backlight1) - 13 - Питание подсветки(+)
16 (BL2/Backlight2) - GND - Земля(-)

Получилась вот такая картина.

Далее подключим одну ногу термистора к аналоговому входу A4 и резистор на 10 кОм в землю, а вторую ногу термистора к 5V.

В общем то и всё. Аппаратная часть готова. Вот схема.

Программирование

С программированием тут всё понятно. Исходный код скетча:

// подключаем две библиотеки для работы с LCD и математических вычислений #include #include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD int backLight = 13; void setup(void) { pinMode(backLight, OUTPUT); digitalWrite(backLight, HIGH); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0,0); } // создаем метод для перевода показаний сенсора в градусы Цельсия double Getterm(int RawADC) { double temp; temp = log(((10240000/RawADC) - 10000)); temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp)); temp = temp - 273.15; return temp; } // создаем метод для вывода на экран показаний сенсора void printTemp(void) { double temp = Getterm(analogRead(4)); // считываем показания с сенсора lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperature is:"); lcd.setCursor(0,1); lcd.print(temp); lcd.print(" C"); } void loop(void) { printTemp(); // вызываем метод, созданный ранее delay(1000); }

Результат работы программы.

Предлагаю Вашему вниманию свою схему термостата. Данное устройство мне понадобилось для моего 3D принтера, а точнее для нагрева стола (у меня самодельная PRUSA I3, когда я поставил на неё подогреваемый столик, возникла проблема, из-за открытого корпуса принтера стол не может удержать температуру, и контролёр принтера кидает ошибку, а потом останавливает печать). Я решил собрать отдельный контроллер нагрева (из имевшихся у меня компонентов, да и просто ради развлечения). В наличии у меня были безымянные терморезисторы, дисплеи на tm1637 контроллеры, полумостовые драйверы ULN2803 и, естественно, микроконтроллеры.

Первое, что нужно было сделать - это понять, как работает терморезистор. Оказалось - очень просто. Надпись NTC - означает, что чем больше температура, тем меньше сопротивление. Здесь всё понятно. Теперь надо решить, как его подключить к контроллеру. Есть несколько вариантов, но основные из них - это делитель напряжения из двух резисторов с подтяжкой к земле или с подтяжкой к питанию. Я выбрал вариант номер два (так сделано в 3D принтере), подключил с подтяжкой к питанию резистором 10 килоом (смотрите на схеме).

С подключением определились. Вопрос номер два: как узнать какие значения АЦП будут соответствовать определённым значениям температуры? Здесь есть несколько путей. Можно взять термистор с известными параметрами и таблицами сопротивлений, или воспользоваться сложными формулами расчёта. Мне эти варианты не подошли (резистор неизвестный, а в высшей математике я не силён). Я выбрал другой и, наверное, самый простой путь. Так как я делал не термометр, а термореле, мне не нужно было знать, какому значению температуры соответствует каждое значение АЦП. Мне нужно знать значение АЦП для конкретных (нужных мне) температур в небольшом диапазоне. Поэтому я решил построить график зависимости АЦП от температуры по нескольким точкам, а потом по этому графику определить приблизительные значения АЦП для нужных мне температур. Для этого я собрал всю схему и написал простой код в arduino, который выводил к значения АЦП через uart в терминал.

Const int termo_up = A2; //Вход терморезистора с подтяжкой на плюс void setup() { Serial.begin(9600); } void loop() { int adc_value=analogRead(termo_up); Serial.print("ADC = "); Serial.println(adc_value); delay(500); }

Затем я просто брал воду разной температуры, измерял её термометром, погружал в неё термистор и записывал значения АЦП. Потом по этим значениям строил график. Получилось примерно так: (это не окончательный вариант, только для наглядности, но форма графика приблизительно такая же. Полученные точки, которые сильно отдалялись от линии я корректировал (так сказать к общей тенденции).

График я строил онлайн, что очень удобно, можно в любой точке графика посмотреть значения x и y.

В итоге я составил массив значений АЦП с шагом в один градус Цельсия в диапазоне от 0 до 80 градусов:

//Массив значений АЦП (по возрастанию от 0 до 80 градусов по Цельсию) int termo = {976,975,974,973,972,971,970,969,968,967,966,965,964,963,962,961,960,959,958, 956,954,952,949,946,943,940,937,934,930,928,925,921,917,913,910,906,902,897, 893,888,884,878,874,870,865,861,856,852,847,843,837,834,830,825,820,815,810, 805,800,795,790,785,780,776,771,766,761,755,748,741,733,727,720,712,703,693, 685,674,663,654,643};

Теперь немного электроники. Схема довольно простая, atmega8, обвязка, драйвер реле в виде ULN2803, дисплей, кренка и терморезистор.

Несколько пояснений. На ножках атмеги отмечены названия выходов как портов контролёра, так и выводов arduino (в качестве контролёра можно использовать любой arduino совместимый). Выводов для релюшек четыре штуки только потому, что жалко свободных выводов атмеги (можно программно что-нибудь будет прикрутить к ним). Выводы драйвера спарены для надёжности и из-за их избытка тоже. Вместо ULN2803 можно использовать ULN2003 и подобные, они представляют из себя сборку транзисторов Дарлингтона, при желании можно просто сделать ключи на n-канальных мосфетах. Стабилизатор на 5 вольт - любой, входное питание 12 вольт позволяют ставить LM7805, у меня использовано low-drop ams1117-5,0, только не жалейте фильтрующих конденсаторов, можно также вывод AVCC атмеги запитать через дроссель для уменьшения помех АЦП. Кварц при желании можно поставить и на 8 MHz, только для этого в ардуино нужно скомпилировать свой hex или просто прошить через uart с правильным загрузчиком.

И, собственно, программа. Написана, естественно, в среде arduino, так как это очень быстро и удобно для такого простого устройства (не надо морочиться с драйверами для дисплея, АЦП, uart и т.д.).

#include #define CLK 3//pins definitions for TM1637 and can be changed to other ports #define DIO 4 TM1637 tm1637(CLK,DIO); //Массив значений АЦП (по возрастанию от 0 до 80 градусов по цельсию) int termo = {976,975,974,973,972,971,970,969,968,967,966,965,964,963,962,961,960,959,958, 956,954,952,949,946,943,940,937,934,930,928,925,921,917,913,910,906,902,897, 893,888,884,878,874,870,865,861,856,852,847,843,837,834,830,825,820,815,810, 805,800,795,790,785,780,776,771,766,761,755,748,741,733,727,720,712,703,693, 685,674,663,654,643}; int warm = 20; // Переменная, в которой хранится значение уровня температуры const int button1 = 13; //Пин первой кнопки ("нагрев вкл/выкл") const int button2 = 12; //Пин второй кнопки "+" const int button3 = 11; //Пин третьей кнопки "-" const int relay1 = 5; //Пины реле 1-4 const int relay2 = 6; //Просто жалко свободных ног МК и ULN2803 const int relay3 = 7; const int relay4 = 8; const int termo_up = A2; //Вход терморезистора с подтяжкой на плюс const int termo_down = A3; ////Вход терморезистора с подтяжкой на землю void setup() { pinMode(19, INPUT_PULLUP); //Настраиваем ноги на входы/выходы pinMode(18, INPUT_PULLUP); //Кнопки с подтяжкой к питанию pinMode(17, INPUT_PULLUP); //Можно и без, в схеме всёравно есть резисторы pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); tm1637.set(BRIGHT_TYPICAL); //Настраиваем наш экранчик tm1637.init(); tm1637.point(false); digitalWrite(relay1,LOW); //Отключаем на всякий случай все реле digitalWrite(relay2,LOW); digitalWrite(relay3,LOW); digitalWrite(relay4,LOW); tm1637_disp(); //Выводим на экран значение переменной "warm" } void loop() { if(digitalRead(button1)==LOW){ //Если нажата кнопка 1 while(digitalRead(button1)==LOW); //Ждём, пока она нажата delay(20); nagrev(); //Переходим в функцию нагрева } if(digitalRead(button2)==LOW){ //Если нажата кнопка 2 while(digitalRead(button2)==LOW); //Ждём, пока она нажата delay(20); warm=warm+1; //Добавляем 1 к переменной warm if(warm>80){warm=80;} //Проверяем, чтобы не выходила за пределы наших значений tm1637.clearDisplay(); //Очищаем дисплей tm1637_disp(); //И выводим на него новое значение warm } if(digitalRead(button3)==LOW){ //Аналогично с кнопкой 2 while(digitalRead(button3)==LOW); delay(20); warm=warm-1; if(warm<0){warm=0;} tm1637.clearDisplay(); tm1637_disp(); } } void tm1637_disp(){ //Функция выводит на дисплей значение переменной warm if((warm/100)>0){ //Если warm больше или равно 100 tm1637.display(1,(warm/100)); //пишем во 2 разряд сотни tm1637.display(2,((warm%100)/10)); //пишем в 3 разряд десятки tm1637.display(3,((warm%100)%10)); //пишем в 4 разряд единицы } if((warm/100)==0){ if(((warm%100)/10)>0){ //если warm меньше ста tm1637.display(2,((warm%100)/10)); //десятки tm1637.display(3,((warm%100)%10));} //единицы else{tm1637.display(3,((warm%100)%10));} //если меньше десяти - только единицы } } void nagrev(){ //Функция нагрева tm1637.display(0,0xc); //Выводим букву "С" в первый разряд индикатора uint16_t adc; //Переменная для чтения значений АЦП //Цикл нагрева do{ adc = analogRead(termo_up); //Читаем значение АЦП if((adc>termo)){ //Если значение температуры меньше заданного digitalWrite(relay3,HIGH); //Включаем реле } else if((adc

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

А вот и фото готового устройства (реле и термистор выносные на проводах):

В конце статьи я прикреплю скетч arduino, HEX для atmega8 (16 MHz, FUSE: high - DC, low - BF) , библиотеку для tm1637 и плату в layout (всё в архиве).

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
МК AVR 8-бит

ATmega8

1 tqfp32 В блокнот
Составной транзистор

ULN2803

1 можно uln2003 с переделкой платы В блокнот
Cr1 Кварц 16 MHz 1 В блокнот
NTC1 Термистор NTC 100K 1 Можно любой В блокнот
R1-R5 Резистор

10 кОм

5 В блокнот
С1,С5 Конденсатор 10 мкФ 2 smd 0805

Часто в различных источниках питания возникает задача ограничить стартовый бросок тока при включении. Причины могут быть разные – быстрый износ контактов реле или выключателей, сокращение срока службы конденсаторов фильтра итд. Такая задача недавно возникла и у меня. В компьютере я использую неплохой серверный блок питания, но за счет неудачной реализации секции дежурного режима, происходит сильный ее перегрев при отключении основного питания. Из-за этой проблемы уже 2 раза пришлось ремонтировать плату дежурного режима и менять часть электролитов, находящихся рядом с ней. Решение было простое – выключать блок питания из розетки. Но оно имело ряд минусов – при включении происходил сильный бросок тока через высоковольтный конденсатор, что могло вывести его из строя, кроме того, уже через 2 недели начала обгорать вилка питания блока. Решено было сделать ограничитель бросков тока. Параллельно с этой задачей, у меня была подобная задача и для мощных аудио усилителей. Проблемы в усилителях те же самые – обгорание контактов выключателя, бросок тока через диоды моста и электролиты фильтра. В интернете можно найти достаточно много схем ограничителей бросков тока. Но для конкретной задачи они могут иметь ряд недостатков – необходимость пересчета элементов схемы для нужного тока; для мощных потребителей – подбор силовых элементов, обеспечивающих необходимые параметры для расчетной выделяемой мощности. Кроме того, иногда нужно обеспечить минимальный стартовый ток для подключаемого устройства, из-за чего сложность такой схемы возрастает. Для решения этой задачи есть простое и надежное решение – термисторы.

Рис.1 Термистор

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


Рис.2 ТКС термистора

Нас интересуют следующие параметры термистора:

    Сопротивление при 25˚С

    Максимальный установившийся ток

Оба параметра есть в документации на конкретные термисторы. По первому параметру мы можем определить минимальный ток, который пройдет через сопротивление нагрузки при подключении ее через термистор. Второй параметр определяется максимальной рассеиваемой мощностью термистора и мощность нагрузки должна быть такой, что бы средний ток через термистор не превысил это значение. Для надежной работы термистора нужно брать значение этого тока меньшее на 20 процентов от параметра, указанного в документации. Казалось бы, что проще – подобрать нужный термистор и собрать устройство. Но нужно учитывать некоторые моменты:

  1. Термистор достаточно долго остывает. Если выключить устройство и сразу включить опять, то термистор будет иметь низкое сопротивление и не выполнит свою защитную функцию.
  2. Нельзя соединять термисторы параллельно для увеличения тока – из-за разброса параметров ток через них будет сильно различаться. Но вполне можно соединять нужное к-во термисторов последовательно.
  3. При работе происходит сильный нагрев термистора. Греются также элементы рядом с ним.
  4. Максимальный установившийся ток через термистор должен ограничиваться его максимальной мощностью. Этот параметр указан в документации. Но если термистор используется для ограничения коротких бросков тока (например, при первоначальном включении блока питания и зарядке конденсатора фильтра), то импульсный ток может быть больше. Тогда выбор термистора ограничен его максимальной импульсной мощностью.

Энергия заряженного конденсатора определяется формулой:

E = (C*Vpeak²)/2

где E – энергия в джоулях, C – емкость конденсатора фильтра, Vpeak – максимальное напряжение, до которого зарядится конденсатор фильтра (для наших сетей можно взять значение 250В*√2 = 353В).

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

Я взял таблицу с параметрами термисторов NTC фирмы Joyin. В таблице указаны:

Rном - номинальное сопротивление термистора при температуре 25°С

Iмакс - максимальный ток через термистор (максимальный установившийся ток)

Смакс - максимальная емкость в тестовой схеме, которую разряжают на термистор без его повреждения (тестовое напряжение 350v)

Как проводится тестовое испытание, можно посмотреть на седьмой странице.

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

Наименование

Rном,

Iмакс,

Смакс,

д иаметр 8мм

диаметр 10мм

диаметр 13мм

диаметр 15мм

диаметр 20мм

Таблица параметров NTC термисторов фирмы Joyin

Соединяя несколько одинаковых NTC термисторов последовательно, мы уменьшаем требования к максимальной импульсной энергии каждого из них.

Приведу пример. Например, нам необходимо подобрать термистор для включения блока питания компьютера. Максимальная мощность потребления компьютера – 700 ватт. Мы хотим ограничить стартовый ток величиной 2-2.5А. В блоке питания установлен конденсатор фильтра 470мкФ.

Считаем действующее значение тока:

I = 700Вт/220В = 3.18А

Как писал выше, для надежной работы термистора, выберем максимальный установившийся ток из документации на 20% больше этой величины.

Iмакс = 3.8А

Считаем нужное сопротивление термистора для стартового тока 2.5А

R = (220В*√2)/2.5А = 124 Ом

Из таблицы находим нужные термисторы. 6 штук последовательно включенных термисторов JNR15S200L подходят нам по Iмакс , общему сопротивлению. Максимальная емкость, которую они могут зарядить будет равна 680мкФ*6*0.65=2652мкФ, что даже больше, чем нам нужно. Естественно, при понижении Vpeak , понижаются и требования к максимальной импульсной мощности термистора. Зависимость у нас от квадрата напряжения.

И последний вопрос по поводу выбора термисторов. Что, если мы подобрали необходимые по максимальной импульсной мощности термисторы, но они нам не подходят по Iмакс (постоянная нагрузка для них слишком велика), либо в самом устройстве нам не нужен источник постоянного нагрева? Для этого мы применим простое решение – добавим в схему еще один выключатель параллельно термистору, который включим после зарядки конденсатора. Что я и сделал в своем ограничителе. В моем случае параметры такие – максимальная мощность потребления компьютера 400вт, ограничение стартового тока – 3.5А, конденсатор фильтра 470мкФ. Я взял 6 штук термисторов 15d11 (15 ом). Схема приведена ниже.


Рис. 3 Схема ограничителя

Пояснения по схеме. SA1 отключает фазовый провод. Светодиод VD2 служит для индикации работы ограничителя. Конденсатор C1 сглаживает пульсации и светодиод не мерцает с частотой сети. Если он вам не нужен, то уберите из схемы C1, VD6, VD1 и просто соедините параллельно светодиод и диод по аналогии элементов VD4, VD5. Для индикации процесса зарядки конденсатора, параллельно термисторам включен светодиод VD4. В моем случае при зарядке конденсатора блока питания компьютера, весь процесс занимает менее секунды. Итак, собираем.


Рис.4 Набор для сборки

Индикацию питания я собрал непосредственно в крышке от выключателя, выкинув из нее китайскую лампу накаливания, которая бы прослужила недолго.


Рис. 5 Индикация питания


Рис.6 Блок термисторов


Рис. 7 Собранный ограничитель

На этом можно было бы закончить, если бы через неделю работы не вышли из строя все термисторы. Выглядело это так.


Рис. 8 Выход из строя NTC термисторов

Несмотря на то, что запас по допустимой величине емкости был очень большой – 330мкФ*6*0.65=1287мкФ.

Термисторы брал в одной известной фирме, причем разных номиналов – все брак. Производитель неизвестен. Либо китайцы заливают в большие корпуса термисторы меньших диаметров, либо качество материалов очень плохое. В итоге купил даже меньшего диаметра - SCK 152 8мм. То же Китай, но уже фирменные. По нашей таблице допустимая емкость 100мкФ*6*0.65=390мкФ, что даже немного меньше, чем нужно. Тем не менее, все работает отлично.

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

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

Такие формы позволяют изменять резистивное значение пропорционально малым изменениям температуры. Для стандартных резисторов изменение сопротивления от нагрева видится нежелательным явлением.

Но этот же эффект видится удачным при построении многих электронных схем, требующих определения температуры.

Таким образом, будучи нелинейным электронным устройством с переменным сопротивлением, терморезистор успешно подходит для работы в качестве терморезистора-датчика. Такого рода датчики широко применяют для контроля температуры жидкостей и газов.

Выступая твердотельным устройством, изготовленным на основе высокочувствительных оксидов металлов, терморезистор работает на молекулярном уровне.

Валентные электроны становятся активными и воспроизводят отрицательный ТКС либо пассивными и тогда воспроизводят положительный ТКС.

В результате электронные приборы – термисторы, демонстрируют очень хорошую воспроизводимую резистивность, сохраняя эксплуатационные характеристики, позволяющие продуктивно работать в диапазоне температур до 200ºC.

Применение терморезисторов на практике

Базовым направлением применения, в данном случае, являются резистивные температурные датчики. Однако эти же электронные элементы, принадлежащие семейству резисторов, можно успешно использовать включенными последовательно с другими компонентами или устройствами.

Простые схемы включения терморезисторов, показывающие работу приборов в качестве температурных датчиков — своеобразных преобразователей напряжения за счёт изменения сопротивления

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

Производятся термисторы разного типа, на основе различных материалов и отличаются по размерам в зависимости от времени отклика и рабочей температуры.

Существуют герметичные модификации приборов, защищённые от проникновения влаги. Есть конструкции под высокие рабочие температуры и компактные по размерам.

Следует выделить три наиболее распространенных типа терморезисторов:

  • шариковые,
  • дисковые,
  • инкапсулированные.

Работают приборы в зависимости от изменения температуры:

  1. На уменьшение резистивного значения.
  2. На увеличение резистивного значения.

То есть существует два типа приборов:

  1. Обладающие отрицательным ТКС (NTC).
  2. Обладающие положительным ТКС (PTC).

Отрицательный коэффициент ТКС

NTC-термисторы с отрицательным ТКС уменьшают собственное резистивное значение по мере увеличения внешней температуры. Как правило, именно эти приборы чаще выступают датчиками температуры, поскольку идеально подходят практически к любому типу электроники, где требуется контроль температуры.

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


Схема калибровки (проверки) терморезистора: 1 — источник питания; 2 — направление тока; 3 — испытуемый электронный элемент термистор; 4 — калибровочный микроамперметр

Терморезисторы NTC, снижающие сопротивление с повышением температуры, по исполнению доступны с различными базовыми сопротивлениями. Как правило, базовым сопротивлениям при комнатной температуре.

Например: 25ºC берётся за контрольную (базовую) температурную точку. Отсюда выстраиваются значения приборов, допустим, следующих номиналов:

  • 2,7 кОм (25ºC),
  • 10 кОм (25ºC)
  • 47 кОм (25ºC)….

Другой важной характеристикой является значение «В». Величина «В» представляет собой постоянную константу, которая определяется керамическим материалом, из которого изготовлен термистор.

Этой же константой определяется градиент кривой резистивного отношения (R/T) в определенном температурном диапазоне между двумя температурными точками.

Каждый материал термистора имеет различную материальную константу и, следовательно, индивидуальную кривую отношения сопротивления и температуры.

Так, константа «B» определяет одно резистивное значение при базовой T1 (25ºС), и другое значение при Т2 (например, при 100ºC).

Следовательно, значение B определит постоянную константу материала термистора, ограниченную диапазоном T1 и T2:

B * T1 / T2 (B* 25 / 100)

p.s. значения температуры в расчётах берутся в градуировке Кельвина.

Отсюда вытекает, что имея значение «В» (из характеристики производителя) конкретного прибора, электронщику останется только создать таблицу температур и сопротивлений, чтобы построить подходящий график при помощи следующего нормированного уравнения:

B (T1/T2) = (T 2 * T 1 / T 2 – T 1) * ln(R1/R2)

где: T 1 , T 2 – температуры в градусах Кельвина; R 1 , R 2 – сопротивления при соответствующих температурах в Омах.

Так, например, термистор NTK, обладающий сопротивлением 10 кОм, имеет значение «В» равным 3455 в рамках температурного диапазона 25 — 100ºC.

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

Применение термистора в роли активного датчика

Поскольку прибор является активным типом датчика, для работы требуется сигнал возбуждения. Любые изменения сопротивления в результате изменения температуры преобразуются в изменение напряжения.


Промышленностью выпускаются термисторы разного исполнения, в том числе высокоточные, надёжно защищённые для применения в системах высокого уровня

Самый простой способ добиться подобного эффекта — использовать термистор как часть схемы делителя потенциала, как показано на рисунке ниже. Постоянное напряжение подаётся в цепь резистора и терморезистора.

К примеру, используется схема, где термистор 10 кОм включен последовательно с резистором 10 кОм. В этом случае выходное напряжение при базовой Т = 25ºC составит половину напряжения питания.

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

Простыми словами: чем теплее корпус термистора, тем ниже напряжение на выходе.

Между тем, если изменить положение последовательного резистора, R S и термистора R TH , в этом случае уровень выходного напряжения изменится на противоположный вектор. То есть теперь чем больше нагреется термистор, тем выше будет уровень выходного напряжения.

Использовать термисторы допускается и как часть базовой конфигурации с использованием мостовой схемы. Связью между резисторами R1 и R2 устанавливается опорное напряжение до требуемого значения. Например, если R1 и R2 имеют одинаковые значения сопротивления, опорное напряжение равно половине напряжения питания (V/2).

Схема усилителя, построенная с использованием этой мостовой схемы с термозондом, может выступать в качестве высокочувствительного дифференциального усилителя или в качестве простой схемы запуска Шмитта с функцией переключения.


Включение терморезистора в мостовую схему: R1, R2, R3 -обычные постоянные резисторы; Rт — термистор; А — измерительный прибор микроамперметр

Существует проблема, связанная с термистор (эффект «самонагрева»). В таких случаях рассеиваемая мощность I 2 R достаточно высока и создаёт больше тепла, чем способен рассеять корпус прибора. Соответственно, это «лишнее» тепло влияет на резистивное значение, что приводит к ложным показаниям.

Одним из способов избавления от эффекта «самонагрева» и получения более точного изменения сопротивления от влияния температуры (R/T), видится питание термистора от постоянного источника тока.

Термистор как регулятор пускового тока

Приборы традиционно используются в качестве резистивных чувствительных к температуре преобразователей. Однако сопротивление термистора изменяется не только под влиянием окружающей среды, но также изменения наблюдаются от протекающего через прибор электротока. Эффект того самого «самонагрева».

Разное электрооборудование на индуктивной составляющей:

  • двигатели,
  • трансформаторы,
  • электролампы,
  • другое,

подвергается чрезмерным пусковым токам при первом включении. Но если в цепь последовательно включить термистор, можно эффективно ограничивать высокий начальный ток. Такое решение способствует увеличению срока службы электрооборудования.

Терморезисторы с низким ТКС (при 25°C) обычно используются для регулирования пускового тока. Так называемые ограничители тока (перенапряжения) меняют сопротивление до очень низкого значения при прохождении тока нагрузки.

В момент первоначального включения оборудования пусковой ток проходит через холодный термистор, резистивное значение которого достаточно велико. Под воздействием тока нагрузки термистор нагревается, сопротивление медленно уменьшается. Так осуществляется плавная регулировка тока в нагрузке.

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

Термистор (терморезистор) - это резистор, который меняет свое сопротивление с изменением температуры.

Технически все резисторы являются термисторами, так как их сопротивление меняется в зависимости от температуры. Но эти изменения очень незначительны и измерить их очень сложно. Термисторы изготавливаются таким образом, чтобы сопротивление изменялось на значительную величину в зависимости от температуры. Около 100 Ом и даже больше при изменении температуры на 1 градус по Цельсию!

Существуют два вида термисторов - с NTC (negative temperature coefficient - отрицательный температурный коэффициент) и с PTC (positive temperature coefficient - положительный температурный коэффициент). В большинстве случаев для измерения температуры используются NTC сенсоры. PTC часто используются в качестве предохранителей - с увеличением температуры растет сопротивление, это приводит к тому, что через них проходит большая сила тока, они нагреваются и срабатывают как предохранители. Достаточно удобно для предохранительных цепей!

Если сравнивать термисторы с аналоговыми датчиками температуры типа LM35, TMP36 , цифровыми вроде DS18B20, или термопарами , основными преимуществами термисторов можно назвать:

  • Во первых, они гораздо дешевле чем все перечисленные выше датчики температуры!
  • Их гораздо проще использовать в условиях повышенной влажности, так как это просто резистор.
  • Термисторы работают с любым напряжением (цифровые датчики требуют 3 или 5 В питания логики).
  • Если сравнить термистор и термопару, то первым не нужен усилитель сигнала, чтобы считывать данные. Соответственно, вы можете использовать практически любой микроконтроллер.
  • Соотношение точность показаний/цена - потрясающие. Например, термистор 10 КОм 1% может производить измерения температуры с точностью ±0.25°C! (При условии, что у вас подходящий аналогово-цифровой преобразователь на микроконтроллере).
  • Их практически невозможно поломать или повредить.

С другой стороны, диапазон температур, который можно измерить с помощью термисторов не такой широкий как у термопар и их настройка для снятия показаний тоже немного сложнее. А если на вашем контроллере нет встроенного аналогово-цифрового преобразователя, то лучше вообще обойтись цифровыми датчиками температуры .

Тем не менее простота исполнения термисторов дает им огромный бонус и они безумно популярны для базовых задач контроля температуры. Например, вы хотите, чтобы автоматически включился кондиционер, если в помещении стало слишком жарко. Для этого вы можете использовать цифровой датчик температуры, Arduino, и реле . А можете использовать и термистор, который подключен к базе транзистора. В результате, с повышением температуры, сопротивление падает, на транзистор подается все больше тока, пока он не включится.

Технические характеристики

Ниже приведены технические характеристики термисторов, которые чаще всего используются в DIY проектах на Arduino:

  • Сопротивление при 25 °C: 10K ±1%.
  • B25/50: 3950 ±1%.
  • Диапазон измеряемых температур от -55°C до 125°C.
  • Диаметр: 3.5 мм / 0.13 дюйма.
  • Длина: 18 дюймов / 45 см.

Обратите внимание на то, что сам термистор может измерять температуру до 125° C, но сами контакты порой рассчитаны на меньшую температуру. То есть, термистор не стоит использовать для контроля температуры слишком горячих жидкостей.

Так как термисторы - по своей сути - резисторы, проверить их не составит труда. Достаточно измерить сопротивление с помощью мультиметра:

При комнатной температуре показания должны составить около 10 КОм. Например, показания при 30°C - 86°F, составляют около 8 КОм.

Термисторы подключаются к Arduino очень просто. Достаточно использовать монтажную плату, как это показано на рисунке ниже. Так как сопротивление термистора достаточно высокое (около 10 КОм), сопротивление проводников практически не повлияет на результаты измерений.


Для того, чтобы определить температуру, мы должны измерить сопротивление. При этом на Arduino нет встроенного измерителя сопротивления. Но зато есть возможность считать напряжение с помощью аналогово-цифрового конвертера. Так что нам надо преобразовать сопротивление в напряжение. Для этого мы последовательно добавим в схему подключения еще один резистор. Теперь, когда вы будете мерять напряжение по центру, с изменением сопротивления, будет меняться и напряжение.

Скажем, мы используем резистор с постоянным номиналом 10K и переменный резистор, который называется R. При этом напряжение на выходе (Vo), которое мы будем передавать Arduino, будет равно:

Vo = R / (R + 10K) * Vcc,

где Vcc - это напряжение источника питания (3.3 В или 5 В)

Теперь мы хотим подключить все это к Arduino. Не забывайте, что когда вы измеряете напряжение (Vi) с использованием АЦП на Arduino, вы получите числовое значение.

ADC value = Vi * 1023 / Vcc

Теперь мы совмещаем два напряжения (Vo = Vi) и получаем:

ADC value = R / (R + 10K) * Vcc * 1023 / Vcc

Что самое прекрасное, Vcc сокращается!

ADC value = R / (R + 10K) * 1023

То есть вам неважно, какое напряжение питания вы используете!

В конце мы все же хотим получить R (сопротивление). Для этого надо использовать еще одно преобразование, в котором R переносятся в одну сторону:

R = 10K / (1023/ADC - 1)

Отлично. Давайте попробуем, что из этого всего выйдет. Подключите термистор к Arduino как это показано на рисунке ниже:


Подключите один контакт резистора на 10 КОм к контакту 5 В, второй контакт резистора 10 КОм 1% - к одному контакту термистора. Второй контакт термистора подключается к земле. "Центр" двух резисторов подключите к контакту Analog 0 на Arduino.

Теперь запустите следующий скетч для Arduino:

// значение "другого" резистора

#define SERIESRESISTOR 10000

// к какому пину подключается термистор

#define THERMISTORPIN A0

void setup(void) {

Serial.begin(9600);

void loop(void) {

reading = analogRead(THERMISTORPIN);

Serial.print("Analog reading ");

Serial.println(reading);

// преобразуем полученные значения в сопротивление

reading = (1023 / reading) - 1;

reading = SERIESRESISTOR / reading;

Serial.println(reading);

В результате вы должны получить значения, которые соответствуют измеренным с помощью мультиметра.

Более точные измерения

При проведении измерений аналоговых значений, особенно с "шумными" платами вроде Arduino, можно использовать два метода для улучшения качества показаний. Первый - использовать пин 3.3 В для аналогового сигнала и второй - собрать небольшой массив экспериментальных значений и усреднить их.

Первое. Питание 5 В от Arduino подается напрямую от USB вашего персонального компьютера. В результате сигнал гораздо более зашумленный, чем питание от контакта 3.3 В (этот контакт предусматривает предварительную обработку через интегрированный в плату регулятор). То есть просто подключите 3.3 к контакту AREF и используйте его в качестве источника напряжения VCC.

Второе. Снять несколько показаний для того, чтобы получить усредненное значение также значительно улучшит показания, так как будут учтены внешние шумы. Для усреднения рекомендуется брать не меньше 5 значений.

В результате схема подключения и новый скетч для Arduino будут имеет следующий вид:


В этом скетче учтены оба "апгрейда". В результате вы сможете подучить более точные показания температуры.

// к какому аналоговому контакту мы подключены

#define THERMISTORPIN A0

// сколько показаний берется для определения среднего значения

// чем больше значений, тем дольше проводится калибровка,

// но и показания будут более точными

#define NUMSAMPLES 5

// емкость второго резистора в цепи

#define SERIESRESISTOR 10000

int samples;

void setup(void) {

Serial.begin(9600);

// подключите AREF к 3.3 В и используйте именно этот контакт для питания,

// так как он не так сильно "шумит"

analogReference(EXTERNAL);

void loop(void) {

// формируем вектор из N значений с небольшой задержкой между считыванием данных

// определяем среднее значение в сформированном векторе

average += samples[i];

average /= NUMSAMPLES;

Serial.println(average);

average = 1023 / average - 1;

Serial.print("Thermistor resistance ");

Serial.println(average);

Естественно, от сопротивления на термисторе нам не холодно не жарко. Нам надо узнать именно температуру! Если вам достаточно на скорую руку оценить температуру (например, если температура ниже какого-то значения X, выполняем определенную задачу, если же выше какого-то Y, выполняем другую задачу), вы можете просто использовать таблицу зависимости температуры от сопротивления.

Но скорее всего, вам понадобятся фактические значения температуры. Для этого можно использовать уравнение Стейнхарта-Харта , которое позволит реализовать достаточно достоверную аппроксимацию конвертированных значений.

Уравнение достаточно сложное и требует большого количества переменных-параметров, которых может не быть для конкретного термистора. Вместо этого уравнения можно использовать упрощенное B parameter уравнение.

Для этой зависимости нам надо знать исключительно To (этот параметр для комнатной температуры (25 °C) = 298.15 K), B (в данном конкретном случае равен 3950 - коэффициент, который зависит от используемого термистора), и Ro (сопротивление при комнатной температуре. В данном случае он равен 10 КОм). Подставляем R (измеренное сопротивление) и получаем значение T (температура по Кельвину), которую преобразовываем в °C.

В программе для Arduino, которая приведена ниже, рассчитывается температура в °C.

// к какому аналоговому пину мы подключены

#define THERMISTORPIN A0

// сопротивление при 25 градусах по Цельсию

#define THERMISTORNOMINAL 10000

// temp. для номинального сопротивления (практически всегда равна 25 C)

#define TEMPERATURENOMINAL 25

// сколько показаний используем для определения среднего значения

#define NUMSAMPLES 5

// бета коэффициент термистора (обычно 3000-4000)

#define BCOEFFICIENT 3950

// сопротивление второго резистора

#define SERIESRESISTOR 10000

int samples;

void setup(void) {

Serial.begin(9600);

analogReference(EXTERNAL);

void loop(void) {

// сводим показания в вектор с небольшой задержкой между снятием показаний

samples[i] = analogRead(THERMISTORPIN);

// рассчитываем среднее значение

average += samples[i];

average /= NUMSAMPLES;

Serial.print("Average analog reading ");

Serial.println(average);

// конвертируем значение в сопротивление

average = 1023 / average - 1;

average = SERIESRESISTOR / average;

Serial.print("Thermistor resistance ");

Serial.println(average);

float steinhart;

steinhart = average / THERMISTORNOMINAL; // (R/Ro)

steinhart = log(steinhart); // ln(R/Ro)

steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)

steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)

steinhart = 1.0 / steinhart; // инвертируем

steinhart -= 273.15; // конвертируем в градусы по Цельсию

Serial.print("Temperature ");

Serial.print(steinhart);

Serial.println(" *C");


Для того, чтобы получить еще более точные измерения, рекомендуется учесть точный номинал резистора. В данном случае он, например, не будет равен ровно 10 КОм, а будет принимать значение близкое к 10 КОм.

Насколько точно можно определить температуру с помощью термистора и Arduino?

Вероятно, вы заметили выше, что значение температуры равно 28.16°C. Значит ли это, что точность показаний составляет 0.01°C? К сожалению, нет. У нас есть погрешность самого термистора и погрешность аналоговой электрической цепи.

Можно аппроксимировать ожидаемую погрешность, если учесть ошибку сопротивления самого термистора. Например, на термисторе указано 1%. Это значит, что при 25 °C он может выдать показания в диапазоне от 10,100 до 9900 Ом. При 25°C разница в показаниях в 450 Ом соответствует 1°C, так что погрешность 1% составляет около +-0.25 °C (можно провести калибровку термистора при 0 °C и исключить отклонения). Также можно использовать термистор с погрешностью 0.1%. Это поможет уменьшить ошибку в показаниях до +-0.03°C

Есть вторая погрешность, которая возникает при аналогово-цифровом преобразовании. Каждый некорректно прочитанный бит может давать отклонения около 50 Ом. В принципе эта погрешность меньше, чем ошибка самого термистора +-(0.1°C), но, используя Arduino Uno или Arduino Pro Mini , уменьшить эту погрешность невозможно. Если вас такая точность не устраивает, необходимо использовать более "продвинутые" можели Arduino (которые обеспечат 12-16 бит вместо 10 при аналогово-цифровом преобразовании).

В общем, термисторы обеспечивают большую точность при измерении температуры по сравнению с термопарами и большинством недорогих цифровых датчиков температуры, но, используя Arduino и термистор, вы не получите измерения с точностью более чем +-0.1 °C. Используя 1% термистор, показания не будут точнее +-0.5 °C.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!