Arduino подключаем термисторы. Практическое использование термистора с Arduino. Измерение сопротивления с помощью Arduino

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

Здравствуй, читатели. После прочтения нескольких статей на хабе 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); Serial.begin(9600); } // создаем метод для перевода показаний сенсора в градусы Цельсия 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

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

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


Схема измерения температуры с термистором

Мы помним, что на плате Arduino UNO есть шесть аналоговых входов, которые, по сути, являются каналами АЦП. В один из таких каналов мы и включим термистор. Однако как померить его сопротивление, если АЦП умеет измерять только напряжение? Умные ребята придумали для этого использовать схему простого делителя:

Здесь U0 - известное напряжение, R0 - известное сопротивление, RT - сопротивление, зависящее от температуры, Uизм - измеряемое напряжение. Из рисунка очевидно, что для измеряемого напряжения справедливо соотношение:

Откуда сопротивление термистора выражается так:

Однако померить сопротивление мало, нам ведь нужно получить температуру!

Уравнение Стейнхарта-Харта

Типовая зависимость сопротивления термистора от температуры выглядит так:

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

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

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

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

Сенсор в студию

Мой аналоговый температурный сенсор выглядит так:


Черная круглая блямба на переднем плане - и есть термистор. На нем написано "103", а это значит что при комнатной температуре он имеет сопротивление 10 КОм (103=10*10^3). Далее идет микросхемка, которая есть ни что иное, как операционный усилитель LM358P. Есть еще 2 простых резистора, на которых тоже написано 103, один из которых никуда не подключен. Еще помните формулу для RT? Вот мы и нашли для нее R0, оно равно 10 КОм. А U0 равно 5 В, я вам так скажу. Больше на плате ничего нет!

Сенсор очень просто подключается к Arduino Sensor Shield, который, в свою очередь, надевается на Arduino [в этом соль Arduino, кто еще не понял] , прям как у меня вот так:


Ну собственно все - железо готово к лабораторной работе.

Калибровочная установка

Для калибровки понадобится печка, которая показывает свою температуру, и держит ее при этом (!). Нет проблем - пошел в ИНХ СО РАН, их там в каждой лабе по несколько штук. Выбирай по цвету, что называется. Приглянулась мне вот такая:

Вообще это типа нагревательный столик (30...300 градусов Цельсия), который суют под микроскоп и рассматривают всякие штуки, нагревая их. Вот почему такой странный дизайн.

Собираем установочку: Arduino в комп, сенсор в крышечку с водой, крышечку на печку, хвостик под лавочку, накрываем печку колпачком из кварца.


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

Методика калибровки

Пристально смотрим на уравнение Стейнхарта-Харта и видим в нем три неизвестных. Это означает, что нам достаточно провести три измерения и получить, таким образом, три уравнения.

Выбираем три точки на температурной шкале. Мне нравятся, например, 30, 40 и 50 градусов Цельсия. Нагреваем печку до одной из температур, ждем 10 минут, чтобы все термодинамические процессы произошли и энтропия вселенной увеличилась, замеряем сопротивление. Потом повторяем все для второй и третьей температур.

Составляем три уравнения и решаем систему (линейных кстати) уравнений. Нам лениво и мы заставим это делать Mathcad, который нам таки-выдаст коэффициенты Стейнхарта-Харта.

Думаю, тут все понятно.

Serial Communication

Есть у Arduino такая классная штука - serial communication . Это есть явление общения компа с Arduino во время выполнения программы. Происходит это через USB-порт, который эмулирует COM-порт. Это позволяет мониторить состояние платы в реальном времени и даже посылать на нее команды с компа.

Чтобы вызвать Serial monitor , выберите в меню Tools->Serial Monitor или нажмите хитрую комбинацию из трех клавиш ctrl+shift+M во время выполнения программы.

Чтобы заставить Arduino вывести что-то в последовательный поток, просто воспользуйтесь функцией Serial.println(число) или Serial.println("текст") .

Последовательный обмен необходимо инициализировать в setup(){} , всунув туда команду Serial.begin(бодрейт) . Бодрейт (baudrate) - количество информации, передаваемой в единицу времени (не путать с битрейтом). Arduino предлагает на выбор: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 бод. Вот что бывает, если не согласовать бодрейт в своей программе и в мониторе последовательного порта:


У вас это и должно произойти, когда вы впервые откроете монитор. Не пугайтесь.

Кодим

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

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


void loop () {
double rt; //измеряемая величина
Serial .println ("voltage:" ); //пишем в поток слово для красоты
rt=(analogRead (0)); //читаем значение с сенсора
Serial .println (rt); //выводим значение с сенсора в поток
rt = ((10240000/rt) - 10000); //вычисляем сопротивление по формуле
Serial .println ("resistance:" ); //пишем в поток еще одно слово для красоты
Serial .println (rt); //выводим значение сопротивления в поток
delay (5000); //ничего не делаем 5 секунд
}


В результате все красиво:

Вычисляем коэффициенты Стейнхарца-Харца

По описанной выше методике выписываем на листочек три значения сопротивления при трех разных температурах. Подставляем их попарно в три уравнения Стейнхарца-Харца и решаем систему. Вот фотка моего маткадовского файлика:

Обратите внимание, что я вместо коэффициента "c" написал "се" [цэ], потому что маткад не дает использовать символ "с" кроме как в значении скорости света.

Нижний вектор-столбец и есть наши искомые коэффициенты.

Еще раз кодим

Теперь напишем скетч, который позволит Arduino измерять температуру.

#include //подключаем свою библиотеку с блэкджэком и логарифмами


double Steinhart(int value) {
double Temp; //в итоге эта переменная станет температурой
Temp = log ((10240000/value-10000)); //считаем логарифм
//считаем температуру из уравнения Стейнхарта-Харта
Temp = 1/(0.001768+0.00005719*Temp+0.000001354*Temp*Temp*Temp);
Temp = Temp-273.15;//переводим температуру в градусы Цельсия
return Temp; //передаем температуру обратно в loop
}


void setup () {
Serial.begin(115200); //стартуем последовательное соединение
}


void loop () {
//передаем в функцию Steinhart измеренное значение и выводим температуру, которую она вернет
Serial .println (int (Steinhart(analogRead (0))));
delay (2000); //ничего не делаем 2 секунды
}


Резюме

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

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