Комнатный термометр

В этом эксперименте мы измеряем температуру окружающей устройство среды и с помощью шкалы показываем, на сколько она превышает заданный порог.

Список деталей для эксперимента

  • 1 плата Arduino Uno

  • 1 беспаечная макетная плата

  • 1 светодиодная шкала

  • 1 резистор номиналом 10 кОм

  • 1 термистор

  • 10 резисторов номиналом 220 Ом

  • 14 проводов «папа-папа»

Для дополнительного задания:

  • 1 пьезопищалка

  • еще 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 для того, чтобы использовать функцию взятия натурального логарифма log(x).

  • В переменных типа float можно хранить дробные числа, числа с плавающей точкой.

  • При использовании переменных данного типа имейте в виду: - при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в примере; - они могут принимать значения от -3.4028235×10^38 до 3.4028235×10^38, - при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой! - точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании float в условном операторе. Не полагайтесь на точность! - вычисления с float происходят медленнее, чем с целыми числами.

  • Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу.

Вопросы для проверки себя

  1. Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?

  2. Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?

  3. Чем неудобно использование чисел с плавающей точкой на Arduino?

  4. Что за выражение стоит справа от = при объявлении булевой переменной enableSegment?

Задания для самостоятельного решения

  1. Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов.

  2. Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация при достижении температуры, например, 25 градусов.