====== Эксперимент 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:|Оглавление]] | [[метеостанция|Метеостанция →]]