Главная » Полезное » Подключение ntc термодатчика к ардуино. Термореле на NTC резисторе. Применение термистора в роли активного датчика

Подключение ntc термодатчика к ардуино. Термореле на 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.

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

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

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

На принципиальных схемах терморезистор обозначается вот так.

В зависимости от сферы применения и типа терморезистора обозначение его на схеме может быть с небольшими отличиями. Но вы всегда его определите по характерной надписи t или .

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

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

На фото показан терморезистор ММТ-4В (4,7 кОм). Если подключить его к мультиметру и нагреть, например, термофеном или жалом паяльника, то можно убедиться в том, что с ростом температуры его сопротивление падает.

Терморезисторы есть практически везде. Порой удивляешься тому, что раньше их не замечал, не обращал внимания. Давайте взглянем на плату от зарядного устройства ИКАР-506 и попробуем найти их.

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

Второй. Это так называемый NTC-термистор (JNR10S080L ). О таких я ещё расскажу. Служит он для ограничения пускового тока. Забавно. Вроде терморезистор, а служит в качестве защитного элемента.

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

Также терморезисторы устанавливаются в автомобильные усилители. Вот терморезистор в усилителе Supra SBD-A4240. Здесь он задействован в цепи защиты усилителя от перегрева.

Вот ещё пример. Это литий-ионный аккумулятор DCB-145 от шуруповёрта DeWalt. Вернее, его "потроха". Для контроля температуры аккумуляторных ячеек применён измерительный терморезистор.

Его почти не видно. Он залит силиконовым герметиком. Когда аккумулятор собран, то этот терморезистор плотно прилегает к одной из Li-ion ячеек аккумулятора.

Прямой и косвенный нагрев.

По способу нагрева терморезисторы делят на две группы:

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

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

NTC-термисторы и позисторы.

По зависимости изменения сопротивления от температуры терморезисторы делят на два типа:

    PTC-термисторы (они же позисторы ).

Давайте разберёмся, какая между ними разница.

Своё название NTC-термисторы получили от сокращения NTC - Negative Temperature Coefficient , или "Отрицательный Коэффициент Сопротивления". Особенность данных термисторов в том, что при нагреве их сопротивление уменьшается . Кстати, вот так обозначается NTC-термистор на схеме.

Обозначение термистора на схеме

Как видим, стрелки на обозначении разнонаправлены, что указывает на основное свойство NTC-термистора: температура увеличивается (стрелка вверх), сопротивление падает (стрелка вниз). И наоборот.

На практике встретить NTC-термистор можно в любом импульсном блоке питания. Например, такой термистор можно обнаружить в блоке питания компьютера. Мы уже видели NTC-термистор на плате ИКАР"а, только там он был серо-зелёного цвета.

На этом фото NTC-термистор фирмы EPCOS. Применяется для ограничения пускового тока.

Для NTC-термисторов, как правило, указывается его сопротивление при 25°С (для данного термистора это 8 Ом) и максимальный рабочий ток. Обычно это несколько ампер.

Данный NTC-термистор устанавливается последовательно, на входе сетевого напряжения 220V. Взгляните на схему.

Так как он включен последовательно с нагрузкой, то весь потребляемый ток протекает через него. NTC-термистор ограничивает пусковой ток, который возникает из-за заряда электролитических конденсаторов (на схеме С1). Бросок зарядного тока может привести к пробою диодов в выпрямителе (диодный мост на VD1 - VD4).

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

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

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

Выход из строя ключевых транзисторов в блоке питания зарядного устройства привел к превышению максимального рабочего тока этого термистора (max 4A) и он сгорел.

Позисторы. PTC-термисторы.

Термисторы, сопротивление которых при нагреве растёт , называют позисторами. Они же PTC-термисторы (PTC - Positive Temperature Coefficient , "Положительный Коэффициент Сопротивления").

Стоит отметить, что позисторы получили менее широкое распространение, чем NTC-термисторы.

Позисторы легко обнаружить на плате любого цветного CRT-телевизора (с кинескопом). Там он установлен в цепи размагничивания. В природе встречаются как двухвыводные позисторы, так и трёхвыводные.

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

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

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

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

Кроме двухвыводных позисторов широко применяются трёхвыводные позисторы. Вот такие.

Отличие их от двухвыводных заключается в том, что они состоят из двух позисторов-"таблеток", которые установлены в одном корпусе. На вид эти "таблетки" абсолютно одинаковые. Но это не так. Кроме того, что одна таблетка чуть меньше другой, так ещё и сопротивление их в холодном состоянии (при комнатной температуре) разное. У одной таблетки сопротивление около 1,3 ~ 3,6 кОм, а у другой всего лишь 18 ~ 24 Ом.

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

И конденсаторы. Маркировка на них не наносится, что затрудняет их идентификацию. По внешнему виду SMD-терморезисторы очень похожи на керамические SMD-конденсаторы.

Встроенные терморезисторы.

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

Стоит отметить, что в электронике наряду с терморезисторами активно применяются термопредохранители и термореле (например, типа KSD), которые также легко обнаружить в электронных приборах.

Теперь, когда мы познакомились с терморезисторами, пора .

Предлагаю Вашему вниманию свою схему термостата. Данное устройство мне понадобилось для моего 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 я загорелся заполучить эту игрушку. И вот недавно получил посылку с платой. Затем побаловался со светодиодами и захотел чего-нибудь посерьёзнее. Решил сделать простейший термометр, используя всего термистор, резистор на 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); }

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

Здравствуй, Хабрасообщество. После прочтения нескольких статей на хабе 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); }

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



Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта