Урок 15. Комнатный термометр


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

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

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

  • пьезопищалка
  • еще 2 провода

Принципиальная схема

Схема на макетке

Обратите внимание

  • Термистор мы включили в известную нам схему делителя напряжения.

Скетч

  1.     // Огромное количество готового кода уже написано другими людьми
    
  2.     // и хранится в виде отдельных файлов, которые называются
    
  3.     // библиотеками. Для использования кода из библиотеки, её нужно
    
  4.     // подключить (англ. include). Библиотека «math» даёт разные
    
  5.     // математические функции, в том числе функцию логарифма
    
  6.     // (англ. log), которая нам понадобится далее
    
  7.     #include 
    
  8.  
  9.     #define FIRST_LED_PIN 2
    
  10.     #define LED_COUNT     10
    
  11.  
  12.     // Параметр конкретного типа термистора (из datasheet):
    
  13.     #define TERMIST_B 4300 
    
  14.  
  15.     #define VIN 5.0
    
  16.  
  17.     void setup(
    )
    
  18.     {
    
  19.       for (
    int i = 0
    ; i < LED_COUNT; ++i)
    
  20.         pinMode(i + FIRST_LED_PIN, OUTPUT)
    ;
    
  21.     }
    
  22.  
  23.     void loop(
    )
    
  24.     {
    
  25.       // вычисляем температуру в °С с помощью магической формулы.
    
  26.       // Используем при этом не целые числа, а вещественные. Их ещё
    
  27.       // называют числами с плавающей (англ. float) точкой. В
    
  28.       // выражениях с вещественными числами обязательно нужно явно
    
  29.       // указывать дробную часть у всех констант. Иначе дробная
    
  30.       // часть результата будет отброшена
    
  31.  
  32.        float voltage = analogRead(A0) * VIN / 1023.0
    ;
    
  33.        float r1 = voltage / (VIN - voltage)
    ;
    
  34.  
  35.  
  36.        float temperature = 1./
    ( 1./
    (TERMIST_B)
    *
    log
    (r1)
    +
    1./
    (
    25. + 273.) ) - 273
    ;
    
  37.  
  38.       for (
    int i = 0
    ; i < LED_COUNT; ++i) {
    
  39.         // при 21°С должен гореть один сегмент, при 22°С — два и
    
  40.         // т.д. Определяем должен ли гореть i-й нехитрым способом
    
  41.         boolean enableSegment = (temperature >= 21
    +i)
    ;
    
  42.         digitalWrite(i + FIRST_LED_PIN, enableSegment)
    ;
    
  43.       }
    
  44.     }
    

Пояснения к коду

  • Директивы для подключения библиотек #include включаются в начало программы.
  • В этом эксперименте мы подключаем библиотеку math.h для того, чтобы использовать функцию взятия натурального логарифма x log(x).
  • В переменных типа float можно хранить дробные числа, числа с плавающей точкой.
  • При использовании переменных данного типа имейте в виду:
    •   вычисления с float происходят медленнее, чем с целыми числами
    •   точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании float в условном операторе. Не полагайтесь на точность!
    •   при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!
    •   они могут принимать значения от -3.4028235×1038 до 3.4028235×1038,
    •   при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в примере
  • Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу.

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

  • Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?
  • Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?
  • Чем неудобно использование чисел с плавающей точкой на Arduino?
  • Что за выражение стоит справа от = при объявлении булевой переменной enableSegment?

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

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

 

 

Теги: 
Источник: 
wiki.amperka.ru