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

КВАНТОЛАБ г. Полярный



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 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

// термистор на пине А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);

}

 

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

#define B 3950 // ntc коэффициент
#define RESISTOR 200000 // сопротивление резистора в омах
#define THERMISTOR 100000 // сопротивление термистора в омах
#define NOMINAL 25 // номинальная температура
 
#define NTC A1 // пин подключения терморезистора
#define BLU 10
#define RED 12
 
void setup() {
   Serial.begin(9600);
   pinMode(NTC, INPUT);
   pinMode(BLU, OUTPUT);
   pinMode(RED, OUTPUT);
}
 
void loop() {
   int t = analogRead(NTC);
   float tr = 1023.0 / t - 1;
   tr = RESISTOR / tr;
   Serial.print("R=");
   Serial.print(tr);
   Serial.print(", t=");
 
   float steinhart;
   steinhart = tr / THERMISTOR;
   steinhart = log(steinhart);
   steinhart /= B;
   steinhart += 1.0 / (NOMINAL + 273.15);
   steinhart = 1.0 / steinhart;
   steinhart -= 273.15; 
   Serial.println(steinhart);

   if (steinhart < 24) { digitalWrite(BLU, HIGH); digitalWrite(RED, LOW); }
   if (steinhart >= 24) { digitalWrite(BLU, LOW); digitalWrite(RED, HIGH); }
  
   delay(1000);
}



Дата: 2023-06-02   Автор: Админ   Просмотров: 1070





Контакты

Если у Вас есть вопросы, мы с удовольствием на них ответим.

Адрес:

Мурманская область, г.Полярный ул. Красный Горн, д.16, 3-й этаж, 34 каб.

Телефон:

+7 9646829261