Эксперимент 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 градусов.