Skip to contentSkip to main navigation Skip to footer

Arduino и термистор

Описание


Термистор (терморезистор) – электронный компонент, меняющий своё сопротивление в зависимости от температуры. Термисторы существуют в разных корпусах, имеют разные сопротивления, B (beta) коэффициент, а также бывают NTC и PTC типа (отрицательный и положительный температурный коэффициент сопротивления). В наборе GyverKIT идёт термистор в герметичном исполнении, как на картинке справа:

  • Тип: NTC
  • Сопротивление при 25 °С: 10 кОм
  • B коэффициент: 3950
  • Измеряемый диапазон: -20.. 105 °С
  • Точность: 1%
  • Реальная точность: я сравнивал несколько термисторов с ds18b20, на участке 15.. 80 °С термисторы стабильно показывали на 0.5 °С больше. Между собой термисторы показывали одинаковое значение. Таким образом штука довольно точная и поддаётся простой калибровке.
  • Разрешение (при 10 бит АЦП): ~0.1 °С в диапазоне -10.. 60 °С и ~0.5 °С в остальных случаях

 

Подключение


Arduino сама по себе не умеет измерять сопротивление, поэтому термистор подключается фактически так же, как потенциометр: по схеме делителя напряжения центральной точкой на аналоговый пин с дополнительным резистором к VCC. Для этого в наборе идут резисторы на 10 кОм:

 

Библиотеки


В примерах на этом сайте мы будем использовать библиотеку GyverNTC. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverNTC. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Примеры


Читаем температуру

Читаем и выводим температуру в порт:

#include <GyverNTC.h>

// термистор на пине А0
// сопротивление резистора 10к
// тепловой коэффициент 3950
GyverNTC therm(0, 10000, 3950);

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

void loop() {
  // вывести температуру (чтение с усреднением)
  Serial.println(therm.getTempAverage());
  delay(500);
}
Фильтруем показания

Температура будет немного “шуметь”, несмотря на чтение с усреднением. Для более точных измерений можно использовать простейший фильтр – экспоненциальное скользящее среднее, которое реализуется так: filt_val += (new_val - filt_val) * k, где k – число от 0.0 до 1.0. Фильтр даёт плавное изменение, что позволяет получать максимально точное значение с течением времени. Результат работы данной программы лучше наблюдать во встроенном плоттере графиков:

// пример выводит температуру в COM порт
#include <GyverNTC.h>
GyverNTC therm(0, 10000, 3950);

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

float filT = 0;
void loop() {
  // получаем новые данные и фильтруем
  filT += (therm.getTemp() - filT) * 0.1;

  // выводим температуру
  Serial.println(filT);
  delay(200);
}
Несколько термисторов

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

 

В программе создаём ещё один экземпляр класса и точно так же с ним работаем:

// пример выводит температуру в COM порт
#include <GyverNTC.h>

// термистор на пине А3
// сопротивление резистора 10к
// тепловой коэффициент 3950
GyverNTC therm1(0, 10000, 3950);
GyverNTC therm2(1, 10000, 3950);

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

void loop() {
  Serial.print(therm1.getTempAverage());
  Serial.print(',');
  Serial.println(therm2.getTempAverage());
  delay(500);
}

Видео


Домашнее задание


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

 

Полезный пример?

Похожие примеры
24 Комментария
  • А как подключить два таких датчика? Если его подключаю так же как первый он сходит с ума.

  • Подключил по схеме (для двух датчиков) и ардуино сгорела. Отличная схема

  • Добрый день, подскажите а как получить целое число градусов (32,5 > 32 C) и разделить его на две переменные (32,5 > h=3; l=2;)

    • Разобрался. Получаю усреднённую температуру. То что и хотел. Не претендую на истину, но у меня работает
      char str[2];
      dtostrf(therm.getTempAverage(),2,0,str);
      int h = str[0];
      int l = str[1];
      Может кому и пригодится.

      • да нууу! Можно ведь без костылей и строк сделать, просто на арифметике
        int t = round(therm.getTempAverage()); // получаем целое
        int t1 = t % 10; // единицы
        int t2 = t / 10; // десятки

  • Доброго дня.
    Тепловой коэффициент 3950 у меня пришлось подобрать (получился приблизительно в 2-а раза больше) по эталонному датчику DS18B20. Иначе температура занижалась от реальной на 5 градусов.

  • Для 100к термисторов кто-нибудь решил проблему? Температура улетает в космос.

  • Уважаемый Алекс! Подключил ntc 10K 3950, запилил ваш скетч, температуру в монитор порта выводит как надо. НО, решил подключить дисплей 2004 по I2C и вывести туда градусы, как сразу показания сбились на 20 градусов. Макетировал на UNO.
    В чем может быть проблема, куда копать?

  • У меня температура разнится на градус. При чем оба врут по сравнению с Flucke, но DS18B20 точнее показывает. На градус выше чем есть на самом деле. Но есть, NTC врет на +2

  • Как я понял, точность измерения термистра зависит и от напряжения 5V или 3.3V. В библиотеки не обнаружил этой переменной.

    • У меня wemos r1 d1 .
      На 5в вообще ерунда порядка 1-2 градуса скачет. Но на 3.3в все ОК!

  • Подскажите, а как вывести на дисплей TM1637 температуру и 2 знака после запятой?
    float filT = 0;
    void loop() {
    filT += (therm.getTemp() – filT) * 0.1;
    disp.displayInt(filT);
    delay(300);
    }

  • Приветствую, подскажите пожалуйста, почему температура может выводится с разницей в 60 градусов? Подключил все по схеме, залил скетч, но выводит аномально низкую для квартиры температура в -40 градусов

  • Здраствуйте , у меня такая проблема . Термистор NTC 3950 10 кОМ 1% , подключён через резестор 10 кОМ , подключаю библеотеку . И выдаёт температуру -19. До этого пробовал сам , через формулы , выдавало тоже самое

Оставить комментарий

Ваш адрес email не будет опубликован.