Лабораторная работа 11. термометр
Цель работы:
Знакомство с принципом работы термистора, а также применение полученных навыков для создания программы по контролю температуры.
Теоретическая часть.
Термистор (терморезистор) - это резистор, который меняет свое сопротивление с изменением температуры. Технически, все резисторы являются термисторами, так как их сопротивление меняется в зависимости от температуры. Но обычно эти изменения очень незначительны и измерить их очень сложно. Термисторы (Рисунок 11.1) изготавливаются таким образом, чтобы сопротивление изменялось на значительную величину в зависимости от температуры.
Рисунок 11.1. Терморезистор
Рисунок 11.2. Обозначение терморезистора
Существуют два вида термисторов - с NTC (negative temperature coefficient - отрицательный температурный коэффициент) и с PTC (positive temperature coefficient - положительный температурный коэффициент). В большинстве случаев для измерения температуры используются NTC сенсоры. PTC часто используются в качестве предохранителей - с увеличением температуры растет сопротивление. Это приводит к тому, что через них проходит большая сила тока, они нагреваются и срабатывают как предохранители. Часто используются для предохранительных цепей. Основными преимуществами термисторов по сравнению с аналоговыми датчиками температуры являются:
- Стоимость
- Работают в условиях повышенной влажности
- Термисторы работают с любым напряжением
- Высокая точность
- Надежность
Недостатком является небольшой диапазон температур, который можно измерить с помощью термисторов, и их настройка для снятия показаний сложнее. Также для измерений необходимо иметь аналого- во-цифровой преобразователь.
Тем не менее, простота исполнения обеспечивает популярность для базовых задач контроля температуры. Например, для автоматического включения кондиционера.
На Рисунке 11.2 показано, как изображаются на схемах термисторы. на схеме
Практическая часть
В данной лабораторной работе необходимо разработать программу, которая будет контролировать температуру в комнате. Для выполнения этой задачи сперва необходимо ознакомиться с библиотекой операций math.h и типом данных float.
Библиотека математических операций math.h.
Описание:
math.h — заголовочный файл стандартной библиотеки языка программирования С, разработанный для выполнения простых математических операций. C++ также реализует данные функции для обеспечения совместимости, все они содержатся в заголовочном файле cmath.
Все эти функции принимают тип данных double, если не определено иначе. Для работы с типами float и long double используются функции с постфиксами f и l соответственно. Все функции, принимающие или возвращающие угол, работают с радианами.
Одни из базовых функций библиотеки приведены ниже:
abs | Возвращает абсолютную величину целого числа |
---|---|
acos | Арккосинус |
asin | Арксинус |
atan | Арктангенс |
cos | Косинус |
exp | Вычисление экспоненты |
log | Натуральный логарифм |
log10 | Логарифм по основанию 10 |
pow(x,y) | Результат возведения x в степень y, xy |
sin | Синус |
sqrt | Квадратный корень |
tan | Тангенс |
В таблице представлены лишь основные математические функции. Библиотека включает гораздо большее количество функций для исполь- зования математических преобразований. Чтобы воспользоваться дан- ными функциями в своей программе, необходимо подключить данную библиотеку. Для этого в начале кода пишется:
#include
Точка с запятой в конце не ставятся.
Тип данных float.
Описание:
Тип данных float служит для хранения чисел с плавающей запятой. Этот тип часто используется для операций с данными, считываемыми с анало- говых входов. Диапазон значений — от -3.4028235E+38 до 3.4028235E+38. Переменная типа float занимает 32 бита (4 байта) в памяти.
Тип данных float имеет точность 6-7 знаков. Обычно для увеличения точности используют другой тип - double, но на платформе Arduino, типы данных double и float имеют одинаковую точность.
Хранение в памяти чисел с плавающей точкой в двоичной системе обуславливает потерю точности. Так, например, 6.0 / 3.0 не обязательно равен 2.0. Сравнивая два числа с плавающей точкой, следует проверять не точное равенство, а разницу между этими числами, меньше ли она не- кого выбранной малого порога.
Следует также учитывать, что арифметические операции над числа- ми с плавающей запятой выполняются существенно медленнее, чем над целыми.
Синтаксис:
float var = val;
Параметры:
- var - имя переменной
- val - присваиваемое значение
Схема подключения:
К данной рабочей программе используется следующая схема под- ключения (Рисунок 11.3). Для реализации проекта потребуются следую- щие компоненты: макетная плата, резистор на 220 Ом (10 шт), резистор на 10 кОм (1 шт), термистор (1 шт), светодиодная шкала (1 шт) и провода.
Рисунок 11.3. Схема подключения
После сборки схема имеет следующий вид (Рисунок 11.4):
Рисунок 11.4. Внешний вид схемы после сборки
Рабочая программа:
// Подключение библиотеки math.h для получения
// готовых математических функций.
#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
// Параметр конкретного типа термистора:
#define TERMIST_B 3950
// Напряжение на выходе #define VIN 5.0
void setup()
{
for (int i = 0; i < LED_COUNT; ++i) pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop()
{
// Установка значения, считанного с выхода, в напряжение
float voltage = analogRead(A0) * VIN / 1023.0;
// Сопротивление на термисторе
float r1 = voltage / (VIN - voltage);
// Вычисление температуры в °С с помощью формулы для термистора.
// При этом используются вещественные числа (с плавающей точкой).
// В выражениях с вещественными числами обязательно нужно явно
// указывать дробную часть у всех констант, иначе дробная
// часть результата будет отброшена
float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
for (int i = 0; i < LED_COUNT; ++i)
{
// при 21°С загорится один сегмент, при 22°С — два и
// т.д. вплоть до i-го сегмента
boolean enableSegment = (temperature >= 24+i); digitalWrite(i + FIRST_LED_PIN, enableSegment);
}
}
Вместо светодиодной ленты используются встроенные в плату светодиоды (пин 22 - 28). При установке температуры в 20 градусов будут гореть все светодиоды. Если нагреть датчик, то постепенно светодиоды перестанут гореть по очереди. А если наоборот, перестать нагревать, светодиоды по очереди будут загораться.
Схема подключения:
К данной рабочей программе используется следующая схема подключения (Рисунок 11.5). Для реализации проекта потребуются следующие компоненты: макетная плата, резистор на 10 кОм (1 шт), термистор (1 шт) и провода.
Рисунок 11.5. Принципиальная схема подключения светодиода к контроллеру
После сборки схема имеет следующий вид (Рисунок 11.6):
Рисунок 11.6. Внешний вид схемы после сборки
Рабочая программа:
// Подключение библиотеки math.h для получения
// готовых математических функций
#include <math.h>
#define FIRST_LED_PIN 22
#define LED_COUNT 6
// Параметр конкретного типа термистора:
#define TERMIST_B 3950
// Напряжение на выходе
#define VIN 5.0
void setup(){
for (int i = 0; i < LED_COUNT; ++i) pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop(){
// Установка значения, считанного с выхода, в напряжение
float voltage = analogRead(A0) * VIN / 1023.0;
// Сопротивление на термисторе
float r1 = voltage / (VIN - voltage);
// Вычисление температуры в °С с помощью формулы для термистора.
// При этом используются вещественные числа (с плавающей точкой).
// В выражениях с вещественными числами обязательно нужно явно
// указывать дробную часть у всех констант, иначе дробная
// часть результата будет отброшена
float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
for (int i = 0; i < LED_COUNT; ++i) {
// При 21°С загорится один сегмент, при 22°С — два и
// т.д. вплоть до i-го сегмента.
boolean enableSegment = (temperature >= 24+i);
digitalWrite(i + FIRST_LED_PIN, enableSegment);
}
}
Контрольные вопросы:
- Дайте определение термистору.
- В чём его особенность?
- Какие типы термисторов бывают?
- Какие еще переменные резисторы бывают?
- Какие преимущества и недостатки имеют термисторы по сравнению с датчиками температуры?
- Как изображаются на схемах термисторы?
- Что такое math.h?
- Для чего используют данную библиотеку?
- Назовите основные базовые функции библиотеки?
- Как использовать библиотеку в коде?
- Как используется тип данных float, в чём его особенность?
- Сколько памяти он занимает?
Список дополнительных задач:
- Изменить программу так, чтобы очередной светодиод включался при изменении не в 1 градус, а в 2. При этом начальное значение для за- жигания сделать 15 градусов.
- Подключить потенциометр и изменить программу так, чтобы им можно было регулировать начальное значение для включения первого светодиода.
Center-nav