Интернет-журнал дачника. Сад и огород своими руками

Термореле на NTC резисторе. Измерение температуры и влажности на Arduino – подборка способов Измерение температуры термистор и ардуино

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

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

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

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

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

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

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

В результате электронные приборы – термисторы, демонстрируют очень хорошую воспроизводимую резистивность, сохраняя эксплуатационные характеристики, позволяющие продуктивно работать в диапазоне температур до 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 достаточно эффективно обеспечивают защиту от нежелательно высоких пусковых токов. Преимущественной стороной здесь является то, что этот тип приборов способен эффективно обрабатывать более высокие пусковые токи по сравнению с резисторами стандартного образца.

Ноябрь 25, 2018

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

Терморезистор был изобретён Самюэлем Рубеном (Samuel Ruben) в 1930 году.

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

По типу зависимости сопротивления от температуры различают терморезисторы с отрицательным (NTC -термисторы, от слов «N egative T emperature C oefficient») и положительным (PTC -термисторы, от слов «P ositive T emperature C oefficient» или позисторы ) температурным коэффициентом сопротивления (или ТКС). Для позисторов - с ростом температуры растёт их сопротивление; для NTC -термисторов увеличение температуры приводит к падению их сопротивления.

Условно терморезисторы классифицируют как низкотемпературные (предназначенные для работы при температуpax ниже 170 Кельвин), среднетемпературные (от 170 до 510 К) и высокотемпературные (выше 570 К). Выпускаются терморезисторы, предназначенные для работы при температурах от 900 до 1300 К.

Термисторы бывают разных видов вот например:

Конкретно мне интересен термистор по нескольким параметрам. Во первых их используют для измерения температуры в Экструдере 3Д принтеров и они давольно хорошо измеряют температуру необходимую для плавления пластика. Во вторых размер, если посмотреть на 3тий тип термистора на картинке выше, который в эпоксидной смоле, он очень маленький и его можно зацепить за любую поверхность и мерить на ней температуру. Вот по этим параметрам я и собираюсь его использовать так как хочу сделать станок для изготовления прутка для печати на 3Д принтере.

В данном примере будем использовать простейший NTC термистор c номинальным сопротивлением 100 кОм при температуре 25 градусов “С” который используется в 3Д принтерах. Данный термистор имеет маркирову 3950.

Для реализации нам понадобится:

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

Чтобы вычислить значение температуры используют формулу Стейнхарта - Харта:

Уравнение имеет параметры A,B и C, которые нужно брать из спецификации к датчику. Так как нам не требуется большой точности, можно воспользоваться модифицированным уравнением (B-уравнение):

В этом уравнении неизвестным остается только параметр B, который для NTC термистора равен 3950. Остальные параметры нам уже известны:

  • T0 - комнатная температура в Кельвинах, для которой указывается номинал термистора; T0 = 25 + 273.15;
  • T - искомая температура, в Кельвинах;
  • R - измеренное сопротивление термистора в Омах;
  • R0 - номинальное сопротивление термистора в Омах.

Скетч будет выглядеть следующем образом:

#define B 3950 // B-коэффициент #define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм #define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм #define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм) const byte tempPin = A0; void setup() { Serial.begin(9600); pinMode(tempPin, INPUT); } void loop() { int t = analogRead(tempPin); float tr = 1023.0 / t - 1; tr = SERIAL_R / tr; Serial.print("R="); Serial.print(tr); Serial.print(", t="); float steinhart; steinhart = tr / THERMISTOR_R; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= B; // 1/B * ln(R/Ro) steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // Invert steinhart -= 273.15; Serial.println(steinhart); delay(100); }

Вот что мы увидим в мониторе порта:

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

Предлагаю Вашему вниманию свою схему термостата. Данное устройство мне понадобилось для моего 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

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

Технически все резисторы являются термисторами, так как их сопротивление меняется в зависимости от температуры. Но эти изменения очень незначительны и измерить их очень сложно. Термисторы изготавливаются таким образом, чтобы сопротивление изменялось на значительную величину в зависимости от температуры. Около 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.

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

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

Измерение терморезистором

Самым простым способом определения температуры является использование . Это вид резистора сопротивление которого зависит от температуры окружающей среды. Выделяют терморезисторы с положительным и отрицательным температурным коэффициентом сопротивления - PTC (еще называют позисторы) и NTC-терморезисторы соответственно.

На графике ниже вы видите зависимости сопротивления от температуры. Штриховой линией изображена зависимость для терморезистора с отрицательным ТКС (NTC), а жирной сплошной линией для термистора с положительным ТКС (PTC).

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

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

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

Для описания этого изменение существует уравнение Штейнхарта-харта.

где A, B и C - это константы термистора определяемые по измерениям трёх температур с разницей не менее 10 градусов Цельсия. При этом разные источники указывают, что для типичного 10 кОм NTC-термистора они равны:

Примечание:

Кто хорошо понимает технический текст на английском языке и любит вычисления может ознакомиться со следующим документом: https://www.bipm.org/utils/common/pdf/ITS-90/Guide-SecTh-Thermistor-Thermometry.pdf

Это брошюра об измерениях температуры с помощью термистора выпущенная Консультативным комитетом по термометрии (ККТ).

Однако использование такого уравнение трудоёмко и в любительских проектах неоправданно, поэтому можно воспользоваться beta-уравнением для термистора.

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

При этом B указывается в виде:

Это значит, что коэффициент высчитывался исходя из данных полученных при измерении сопротивления при температурах 25 и 100 градусов Цельсия, именно такой вариант распространён более всего. Тогда его высчитывают по формуле:

B = (ln(R1) - ln(R2)) / (1/T1 - 1/T2)

Типовая схема подключения термистора к микроконтроллеру изображена ниже.

Здесь R1 - это постоянный резистор, термистор подключается к источнику питания, а данные снимаются со средней точки между ними, на схеме условно указано, что сигнал подаётся к выводу A0 - это .

Для расчета сопротивления термистора можно использовать следующую формулу:

Rтермистора=R1⋅((Vсс/Vвыход)−1)

Чтобы перевести в понятный для ардуино язык нужно вспомнить о том, что у ардуино 10-битный АЦП, значит максимальное цифровое значение входного сигнала (напряжением 5В) будет равно 1023. Тогда условно:

  • D - фактическое значение сигнала.

Rтермистора=R1⋅((Dmax /D)−1)

Теперь используем это для вычисления сопротивления и последующего вычисления температуры термистора с помощью бета-уравнения . Скетч будет таким:

Еще большую популярность для измерения температуры с помощью. Ардуино нашёл цифровой датчик DS18B20. Он связывается с микроконтроллером по интерфейсу 1-wire, вы можете подсоединить несколько датчиков (до 127) на один провод, а для обращения к ним вам придётся узнать ID каждого из датчиков.

Примечание: ID вы должны знать даже если используете всего 1 датчик.

Схема подключения датчика ds18b20 к Ардуино выглядит так:

В таком режиме не гарантируется корректная работа при измерении температуры выше 100 градусов Цельсия.

Цифровой датчик температуры DS18B20 состоит из целого набора узлов, как и любая другая ЦИМС. Её внутреннее устройство вы можете наблюдать ниже:

Для работы с ним нужно скачать библиотеку Onewire для Ардуино, а для самого датчика рекомендуется использовать библиотеку DallasTemperature.

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


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

Схема подключения довольно проста:

    1 вывод - питание;

    2 вывод - данные;

    3 вывод - не используется;

    4 вывод - общий провод.

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

Для работы нам нужна библиотека dht.h её нет в стандартном наборе, поэтому её нужно скачать и установить в папке libraries в папке с arduino IDE. Она поддерживает все датчики этого семейства:

    DHT 21 (AM2301);

    DHT 22 (AM2302, AM2321).

Заключение

В наше время создать свою станцию для измерения температуры и влажности очень просто благодаря платформе Arduino. Стоимость таких проектов составляет 3-4 сотни рублей. Для автономной работы, а не вывода данных на компьютер, может использоваться (их мы описывали в недавней статье), тогда можно построить портативный прибор для использования как дома, так и в машине. Пишите в комментариях что еще вы хотели бы узнать о простых самоделках на ардуино!

Похожие публикации