====== Эксперимент 15. Комнатный термометр ====== [[счетчик-нажатий|← Счётчик нажатий]] | [[конспект-arduino:|Оглавление]] | [[метеостанция|Метеостанция →]] В этом эксперименте мы измеряем температуру окружающей устройство среды и с помощью шкалы показываем, на сколько она превышает заданный порог. ===== Список деталей для эксперимента ===== * 1 плата [[amp>product/arduino-uno|Arduino Uno]] * 1 беспаечная [[amp>collection/breadboards|макетная плата]] * 1 светодиодная [[amp>product/bar-led|шкала]] * 1 [[amp>product/resistor-10k|резистор]] номиналом 10 кОм * 1 [[amp>product/thermistor|термистор]] * 10 [[amp>product/resistor-220r|резисторов]] номиналом 220 Ом * 14 проводов [[amp>product/wire-mm|«папа-папа»]] ====Для дополнительного задания==== * 1 [[amp>product/piezo-buzzer|пьезопищалка]] * еще 2 провода ===== Принципиальная схема ===== {{ :конспект-arduino:15_bar_thermometer_scheme.svg.png?nolink& |}} ===== Схема на макетке ===== {{ :конспект-arduino:15_bar_thermometer_bread.svg.png?nolink& |}} ===== Обратите внимание ===== * Термистор мы включили в известную нам схему делителя напряжения. ===== Скетч ===== // Огромное количество готового кода уже написано другими людьми // и хранится в виде отдельных файлов, которые называются // библиотеками. Для использования кода из библиотеки, её нужно // подключить (англ. include). Библиотека «math» даёт разные // математические функции, в том числе функцию логарифма // (англ. log), которая нам понадобится далее #include #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'' для того, чтобы использовать функцию взятия натурального логарифма **x** ''log(x)''. * В переменных типа ''float'' можно хранить дробные числа, числа с плавающей точкой. * При использовании переменных данного типа имейте в виду: * при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в примере * они могут принимать значения от -3.4028235×1038 до 3.4028235×1038, * при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой! * точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании ''float'' в условном операторе. Не полагайтесь на точность! * вычисления с ''float'' происходят медленнее, чем с целыми числами * Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу. ===== Вопросы для проверки себя ===== - Как нужно подключить термистор, чтобы получать на Arduino данные о температуре? - Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код? - Чем неудобно использование чисел с плавающей точкой на Arduino? - Что за выражение стоит справа от ''='' при объявлении булевой переменной ''enableSegment''? ===== Задания для самостоятельного решения ===== - Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов. - Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация при достижении температуры, например, 25 градусов. ---- [[счетчик-нажатий|← Счётчик нажатий]] | [[конспект-arduino:|Оглавление]] | [[метеостанция|Метеостанция →]]