Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Датчики температуры и влажности

Датчик температуры LM35
Датчик температуры и влажности DHT11
Модуль KY-015 с датчиком DHT11
DHT22
Библиотека для DHT
Модуль датчика температуры KY-001
Модуль датчика температуры KY-013
Модуль датчика температуры KY-028

Существует большое число разновидностей датчиков для измерения температуры с разной точностью, степенью защиты от внешних условий и другими параметрами. Кроме описанных ниже датчиков, есть ещё модели TMP36, MAX6675, MAX31855, DS18B20.

Датчик температуры LM35

Датчик температуры LM35 позволяет очень просто получать значения температуры. Вам нужно получить показания с аналогового вывода, сделать несложные математические вычисления и получить готовый результат.

У датчик три вывода: питание и земля по краям и средний для вывода данных.

LM35

Точность составляет почти 0.75-1 градусов. Интервал показаний от -55 до +150. Но в большинстве случаев используются показания от 0 до 105. Если вам нужны отрицательные температуры, то используйте датчик TMP36.

Скетч для работы с датчиком.


const int analogIn = A0;

int value = 0;
double voltage = 0;
double celsius = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  value = analogRead(analogIn);
  voltage = (value / 1023.0) * 5000;
  celsius = voltage * 0.1;
  Serial.print("Temperature in C = ");
  Serial.println(celsius, 1);
  delay(500);
}

Датчик температуры и влажности DHT11

Существует семейство датчиков влажности и температуры DHT (DHT11, DHT22 и др.), которые используются для построения домашней метеостанции. Одновременно измерять температуру и относительную влажность выглядит оправданным, поскольку второе напрямую зависит от первого. Так, повышение температуры батарей центрального отопления приводит к уменьшению относительной влажности воздуха.

Считается, что оптимальное значение влажности около 50% — именно при такой влажности растения, люди и животные чувствуют себя комфортно.

DHT11
DHT11

Датчик температуры и влажности DHT11 является дешёвым датчиком, который удобно использовать в домашних условиях в учебных целях. Он не обеспечивает точные показания и имеет ограниченный диапазон измерений. Но тем не менее, он очень популярен из-за своей простоты. Существуют более дорогие аналоги, в частности его старший брат DHT22.

Датчики DHT состоят из двух основных частей: ёмкостный датчик влажности и термистор. Также в корпусе установлен простенький чип для преобразования аналогового сигнала в цифровой. Считывать цифровой сигнал на выходе достаточно просто, можно использовать любой контроллер, не только Arduino.

DHT11

Технические характеристики

  • Питание от 3 до 5В
  • Максимально потребляемый ток - 2.5мА при преобразовании (при запросе данных)
  • Рассчитан на измерение уровня влажности в диапазоне от 20% до 80%. Точность измерений в диапазоне 5%
  • Измеряет температуру в диапазоне от 0 до +50 градусов с точностью ±2°C
  • Частота измерений не более 1 Гц (одно измерение в секунду)
  • Размер корпуса: 15.5 мм x 12 мм x 5.5 мм

Сам датчик представляет собой синий прямоугольник с решёткой. Имеет четыре ножки, одна из которых (третья) не используется. Ножки имеют стандартное расстояние между собой и прибор легко устанавливается на макетную плату.

  1. VCC - Питание от 3 до 5 В
  2. DATA (OUT) - Вывод данных
  3. NC - Не подключается
  4. GND - Земля

При подключении используйте подтягивающий резистор к VCC и рекомендуется конденсатор (фильтр по питанию между VCC и GND).

Модуль KY-015 с датчиком DHT11

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

DHT11

DHT11 достаточно медленно конвертирует измеренные значения, считывайте показания не чаще, чем раз в секунду.

Модуль должен быть защищён от солнечного света и других излучений, имеющих в спектре ультрафиолетовую часть. Могут привести к повреждению газы, содержащие диоксид серы, пары соляной кислоты. Высокая концентрация паров этанола приведёт к полному повреждению чувствительного слоя датчика.

DHT22

По форм-фактору датчик похож на своего собрата. Может встречаться название Aosong AM2302.

Более точный датчик DHT22 имеет преимущества перед DHT11.

Диапазон температур от -40° до +80° (сравните с 0°..+50°). Точность измерений в диапазоне ±0.5°

Уровень влажности 0-99.9%. Точность измерений в диапазоне 2-4%.

Рекомендуемая частота чтения данных - не чаще, чем один раз в 2 секунды.

Учитывая широкий диапазон, датчик можно применять в сложных системах: вентиляция, кондиционирование, метеорологические станции

Диапазон питания датчика составляет +3.3...+5.5В, поэтому его можно использовать в платах Arduino с пониженными напряжениями. Рекомендуемая длина кабеля, соединяющего DHT22 с MCU при питании от 3.3В не должна превышать 100 см.

Библиотека для DHT

Измерим температуру и влажность воздуха при помощи датчика DHT11.

Следует подключить подтягивающий резистор на 10 кОм между питанием и сигналом. У меня такого не оказалось, я подключил резистор на 2.2 кОм, вроде не сгорело. Для датчика DHT22 резистор не обязателен.

Также встречается модульное исполнение датчика с тремя ножками и готовым установленным резистором. Такой модуль может быть предпочтительнее. Как правило ножки подписаны, трудностей быть не должно.

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

У меня получилась следующая схема.

Схема для DHT11

Первую ножку датчика соедините с питанием на 5В (красный провод), вторую - с пином номер 2, третью пропускаем, а четвёртую соединяем с GND (чёрный провод). Также вставляем на плату резистор - одна ножка соединяется с первой ножкой датчика, а вторая со второй.

Следующий шаг - установка библиотеки. В сети существует много библиотек для данного датчика. Популярна библиотека GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11DHT22, etc Temp & Humidity Sensors. Скачиваем архив и переименовываем папку в DHT, папку размещаем в общей папке для библиотек Arduino libraries.

Второй и удобный способ - установка через менеджер библиотек. Открываем Tools | Manage Libraries... и в поиске диалогового окна вводим DHT. Найдётся несколько библиотек, выбираем библиотеку от Adafruit. Устанавливайте версию 1.2.3. Если вы будете устанавливать версию 1.3.0 или выше, то вам придётся также установить ещё библиотеку Adafruit Unified Sensor, без неё скетч не будет компилироваться.

DHT Library

После установки библиотеки, запускаем IDE и находим пример File | Examples | DHT sensor library | DHTtester.

Скетч по умолчанию рассчитан на датчик DH22, поэтому вам нужно сначала закомментировать строчку #define DHTTYPE DHT22 и снять комментарий с строчки #define DHTTYPE DHT11.

Полностью скетч выглядит следующим образом.


// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

Запускаем скетч и наблюдаем за результатами в Serial Monitor. Датчик считается очень медленным, поэтому не следует делать слишком маленькую задержку, в примере используется пауза на две секунды.

Показания DHT11

Пример проверялся летом в жаркий день. Результаты вполне правдоподобны. Если подышать на датчик (помните в детстве мы дышали на стекло?), то влажность увеличится (и температура). Через какое-то время показания будут медленно возвращаться к первоначальным.

В составе библиотеки также есть файл с именами функций.

DHT
Класс датчика. Объявляем объект класса: DHT dht(DHTPIN, DHTTYPE);. В первом параметре объявляем пин, во втором - тип датчика
begin()
Запускаем датчик
readTemperature()
Без параметров функция измеряет в градусах Цельсия. Вызов readTemperature(true) вернёт значения в градусах Фаренгейта
convertCtoF()
Конвертирует из одной системы в другую
convertFtoC()
Конвертирует из одной системы в другую
computeHeatIndex()
Выводит индекс жары. По умолчанию используется индекс на основе градусов Фаренгейта, где нужно указать градусы и влажность. Для температуры по Цельсию нужно указывать три параметра computeHeatIndex(t, h, false)
readHumidity()
Функция для измерения влажности
read()
Что-то считывает

Дополнительные материалы для DHT

Fritzing-Library/DHT11 Humitidy and Temperature Sensor.fzpz at master · adafruit/Fritzing-Library · GitHub - в составе Fritzing нет датчика DH11. Скачайте данный файл и перетащите его на окно программы. Теперь вы сможете составлять схемы с его участием (смотри мой скриншот выше). В программе он будет находиться в разделе MINE.

Датчик температуры и влажности DHT11 (DHT22) - здесь дана дополнительная информация о работе датчика в модульном исполнении, ссылка на даташиты, примеры кода без библиотеки, графики.

Модуль датчика температуры KY-001

KY-001

Модуль состоит из датчика температуры воздуха с цифровым представлением данных. Основной компонент – микросхема DS18B20, преобразующая температуру корпуса в информацию передаваемую по последовательной двухпроводной шине данных 1-Wire. На шину данных можно установить несколько датчиков. Можно применять для измерения температуры воздуха в помещении и на открытом воздухе.

Также на модуле установлен резистор сопротивлением 4,7 кОм и светодиодный индикатор включения питания.

Технические характеристики

  • Питание: напряжение 3…5,5 В, ток 10 мА
  • Диапазон измерения температуры -55…125 °С/-57°F to 257°F
  • Разрешающая способность: 9…12 бит
  • Точность ±0,5 °С в диапазоне -10…+85 °С
  • Время измерения при разрешающей способности 12 бит составляет 0,75 с

Имеет три вывода:


KY-001 | Arduino 
----------------
     - | GND
     + | 5V 		 
     S | 2 

Для работы с модулем используются дополнительные две библиотеки.


#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
  // IC Default 9 bit
  // If you have troubles consider upping it 12.
  // Ups the delay giving the IC more time to process the temperature measurement
  sensors.begin(); 
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature for Device 1 is: ");
  // You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0)); 
}

Модуль датчика температуры KY-013

Датчик является аналоговым, но использовать его нужно не для измерения конкретных температур, а для слежения за превышением пороговых значений. В модуле используется PTC-термисторы - при повышении температуры растёт и сопротивление.

KY-013

При работе с датчиком пробуйте менять местами землю и питание, часто маркировка ошибочна.


KY-013 | Arduino 
----------------
     - | GND
     + | 5V 		 
     S | A0 

void setup() {
  Serial.begin(9600);
}

void loop() {
  double U = analogRead(A0); // напряжение
  double R = (10230000 / U) - 10000; // сопротивление
  Serial.print("R = ");
  Serial.print(R);
  Serial.print(" U = ");
  Serial.println(U);
  delay(500);
}

В целом использовать аналоговый датчик температуры KY-013 как термометр проблематично. Больше подходит для случаев, когда нужно включить прибор при определённой температуре и выключить при другой. Сначала нужно выяснить какое напряжение подаётся на аналоговый вход при нужной вам температуре, а затем написать код на основе полученных значений.

Модуль датчика температуры KY-028

KY-028

Датчик применяется для контроля температуры воздуха в помещении: регулятор температуры, автоматика систем отопления, автоматизация систем вентиляции.

Датчик грубо оценивает величину температуры, но умеет точно определять превышение порогового значения.

Технические характеристики

  • Напряжение питания: 3,3 – 5,5 В
  • Рабочая температура: 0 – 70°C

У датчика имеется два вывода: аналоговый и цифровой. Аналоговый позволяет получить температуру, цифровой - превышение установленного порога.


KY-028 | Arduino 
----------------
    A0 | A
     G | GND
     + | 5V 		 
    D0 | D 

Основной элемент датчика – терморезистор, который соединён со входом микросхемы компаратора LM393YD. С помощью подстроечного резистора выполняется настройка порога срабатывания компаратора. Так устанавливается температурный порог. При превышении температурой установленного порога на цифровом выходе D0 будет высокий уровень напряжения. Если температура мала, то на выходе D0 низкий уровень.

Датчик содержит два светодиодных индикатора. Индикатор L1 сообщает о подаче питания. Светодиод L2 включается при превышении температурой окружающего воздуха установленного порога. С его помощью удобно проводить настройку модуля.

При включении на выходе A0 присутствует напряжение соответствующее температуре в комнате. Эта температура известна лишь приблизительно. Для повышения точности можно использовать температуру тела (сожмите терморезистор пальцами), в этом случае мы узнаем напряжение аналогового выхода при температуре 36,6°C. На эти данные можно опираться в дальнейшем. Другой вариант - температура таяния льда 0°C. Используйте пакетик с таящим льдом или снегом из холодильника, чтобы получить новое значение напряжения, которому можно верить.


int led = 13; // LED pin
int digitalPin = 2;
int analogPin = A0;
int digitalVal; // digital readings
int analogVal; //analog readings

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(digitalPin, INPUT);
  Serial.begin(9600);
}

void loop()
{
  digitalVal = digitalRead(digitalPin); 
  if(digitalVal == HIGH) // if temperature threshold reached
  {
    digitalWrite(led, HIGH); // turn on LED
  }
  else
  {
    digitalWrite(led, LOW); // turn off
  }

  // Read the analog pin
  analogVal = analogRead(analogPin); 
  Serial.println(analogVal);

  delay(100);
}
Реклама