Эксперимент 15. Комнатный термометр
← Счётчик нажатий | Оглавление | Метеостанция →
В этом эксперименте мы измеряем температуру окружающей устройство среды и с помощью шкалы показываем, на сколько она превышает заданный порог.
Список деталей для эксперимента
- 1 плата Arduino Uno
- 1 беспаечная макетная плата
- 1 светодиодная шкала
- 1 резистор номиналом 10 кОм
- 10 резисторов номиналом 220 Ом
- 14 проводов «папа-папа»
Для дополнительного задания
- еще 2 провода
Принципиальная схема
Схема на макетке
Обратите внимание
- Термистор мы включили в известную нам схему делителя напряжения.
Скетч
- p150_bar_thermometer.ino
// Огромное количество готового кода уже написано другими людьми // и хранится в виде отдельных файлов, которые называются // библиотеками. Для использования кода из библиотеки, её нужно // подключить (англ. include). Библиотека «math» даёт разные // математические функции, в том числе функцию логарифма // (англ. log), которая нам понадобится далее #include <math.h> #define FIRST_LED_PIN 2 #define LED_COUNT 10 // Параметр конкретного типа термистора (из datasheet): #define TERMIST_B 4300 #define VIN 5.0 void setup() { for (int i = 0; i < LED_COUNT; ++i) pinMode(i + FIRST_LED_PIN, OUTPUT); } void loop() { // вычисляем температуру в °С с помощью магической формулы. // Используем при этом не целые числа, а вещественные. Их ещё // называют числами с плавающей (англ. float) точкой. В // выражениях с вещественными числами обязательно нужно явно // указывать дробную часть у всех констант. Иначе дробная // часть результата будет отброшена 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 >= 21+i); digitalWrite(i + FIRST_LED_PIN, enableSegment); } }
Пояснения к коду
- Директивы для подключения библиотек
#include
включаются в начало программы. - В этом эксперименте мы подключаем библиотеку
math.h
для того, чтобы использовать функцию взятия натурального логарифма xlog(x)
. - В переменных типа
float
можно хранить дробные числа, числа с плавающей точкой. - При использовании переменных данного типа имейте в виду:
- при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в примере
- они могут принимать значения от -3.4028235×1038 до 3.4028235×1038,
- при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!
- точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании
float
в условном операторе. Не полагайтесь на точность! - вычисления с
float
происходят медленнее, чем с целыми числами
- Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу.
Вопросы для проверки себя
- Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?
- Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?
- Чем неудобно использование чисел с плавающей точкой на Arduino?
- Что за выражение стоит справа от
=
при объявлении булевой переменнойenableSegment
?
Задания для самостоятельного решения
- Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов.
- Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация при достижении температуры, например, 25 градусов.