Если вы хотите отслеживать климат в своей теплице или данные температуры и влажности в проекте метеостанции, то вам идеально подойдет датчик температуры и влажности DHT11 или DHT22.
Датчики калибруются на заводе, а для подключения к Ардуино потребуется только один резистор (существуют и готовые модули уже с запаянным резистором). С помощью всего лишь нескольких подключений и небольшого количества кода вы можете сразу начать измерять относительную влажность и температуру.
Сравнение DHT11 и DHT22
DHT11 и DHT22 — два наиболее широко используемых датчика серии DHT. Они имеют одинаковую распиновку, но отличаются по размерам и техническим характеристикам.
Из этих двоих DHT22 стоит дороже и обладает лучшими техническими характеристиками.
DHT22 может измерять температуру от -40°C до +125°C с точностью ±0,5°C, в то время как DHT11 может измерять температуру от 0°C до 50°C с точностью ±2°C.
Кроме того, датчик DHT22 может измерять относительную влажность от 0 до 100% с точностью ±2% (максимум ±5%), в то время как датчик DHT11 может измерять относительную влажность только от 20 до 80% с точностью ±5%.
Вот технические характеристики датчиков:
DHT11 | DHT22 | |
---|---|---|
Рабочее напряжение | от 3 до 5 В | от 3 до 5 В |
Максимальный ток потребления | 2.5 мА | 2.5 мА |
Диапазон измерения влажности | от 20% до 80% | от 0% до 100% |
Погрешность измерения влажности | ±5% | ±2% (макс. ±5%) |
Диапазон измерения температуры | от 0°C до 50°C | от -40°C до 80°C |
Погрешность измерения температуры | ±2°C | ±0.5°C |
Частота измерения | 1 Гц (измеряет каждую секунду) | 0.5 Гц (измеряет один раз в 2 секунды) |
Габаритные размеры | 12.5мм ⨉ 16мм ⨉ 6мм | 15.1мм ⨉ 25.1мм ⨉ 7.7мм |
Преимущества | Низкая цена | Более точный |
Несмотря на то, что DHT22 более точен и способен работать в более широком диапазоне температур и влажности, DHT11 полностью превосходит DHT22 в цене, размерах и скорости измерения: DHT11 проводит измерение раз в секунду, а DHT22 раз в две секунды.
Диапазон рабочего напряжения для обоих датчиков от +3 до +5 вольт, при максимальном токе 2,5 мА (во время преобразования).
А вот самое приятное то, что датчики DHT11 и DHT22 взаимозаменяемы. Так что, если вы создаете свой проект с одним из них, вы можете просто отключить его и заменить другим. Потребуется только немного подправить код, но схема подключения останется прежней.
Из чего состоит датчик DHT
Если вы разберете корпус датчика, внутри вы обнаружите чувствительный элемент для измерения влажности и NTC-термистор.
Чувствительный элемент датчика влажности имеет два электрода с влагоудерживающей подложкой (обычно это соль или электропроводящий пластиковый полимер) между ними. При повышении влажности подложка поглощает водяной пар, что приводит к уменьшению сопротивления между двумя электродами. Это изменение сопротивления пропорционально влажности, которая фиксируется микросхемой на обратной стороне платы.
Датчик также включает в себя NTC термистор для измерения температуры. Термистор — это тип резистора, сопротивление которого меняется в зависимости от температуры.
Термисторы устроены так, что их сопротивление резко меняется с температурой. Аббревиатура NTC означает «отрицательный температурный коэффициент» (Negative Temperature Coefficient), то есть с повышением температуры сопротивление термистора уменьшается.
На модуле также запаяна микросхема. Эта микросхема измеряет и обрабатывает аналоговый сигнал с использованием сохраненных калибровочных коэффициентов. Затем преобразует его в цифровой вид и передает микроконтроллеру.
Распиновка DHT11 и DHT22
Датчики DHT11 и DHT22 относительно просты в подключении. Они имеют четыре контакта:
VCC
Контакт обеспечивает питание датчика. Рекомендуется использовать питание +5В, так как тогда датчик можно разместить на расстоянии до 20 метров. При напряжении питания +3,3В датчик можно разместить на расстоянии до 1 метра. В противном случае падение напряжения приведет к ошибкам измерения.
Data
Контакт используется для связи между датчиком и микроконтроллером.
NC
Не используется
GND
Земля
Подключение датчиков DHT11 и DHT22 к Arduino
Теперь давайте разберемся с подключением к Ардуино.
Подключить датчики DHT к Arduino несложно. Они имеют довольно длинные контакты с шагом 2.54 мм, что позволяет легко подключать их к макетной плате.
Подключите вывод VCC к 5V платы Arduino, а вывод GND — к GND Arduino. Контакт Data подключите для передачи данных к цифровому контакту D2.
Чтобы обеспечить правильную связь между датчиком и микроконтроллером, необходимо также добавить подтягивающий резистор 10 кОм между линией передачи данных Data и питанием VCC (для поддержания высокого уровня сигнала). Если вы используете готовый модуль датчика (например, такой как KY-015), вам не нужно добавлять подтягивающий резистор, поскольку он уже на нем установлен.
Библиотека для работы с датчиками DHT
Датчики DHTxx имеют собственный протокол однопроводной передачи данных. Однако мы не будем рассматривать его в этой статье, а воспользуемся готовой библиотекой DHTlib версии 1.3.6. Скачать библиотеку можно ниже в разделе Загрузки, или через менеджер библиотек в Arduino IDE.
Чтобы установить библиотеку, перейдите в Инструменты > Управление библиотеками и в поле поиска введите DHTlib. Должна появится одна библиотека. Нажмите на кнопку УСТАНОВКА.
Код для вывода показаний в монитор порта
После установки библиотеки скопируйте и вставьте этот код в Arduino IDE. Следующий код выведет значения температуры и влажности в монитор порта.
#include <dht.h> /* Контакт, к которому подключен датчик */ #define DATA_PIN 2 /* Создание объекта DHT */ dht DHT; void setup() { /* Инициализация последовательного порта */ Serial.begin(9600); } void loop() { /* Считываем данные с датчика DHT11 */ int readData = DHT.read11(DATA_PIN); /* Считываем данные с датчика DHT22 */ //int readData = DHT.read22(DATA_PIN); /* Получает значения температуры */ float t = DHT.temperature; /* Получает значения влажности */ float h = DHT.humidity; /* Выводим значения в монитор порта */ Serial.print("Температура = "); Serial.print(t); Serial.print(" °C "); Serial.print("Влажность = "); Serial.print(h); Serial.println(" % "); Serial.println(""); /* Задержка 2 секунды */ delay(2000); }
После загрузки кода вы должны увидеть следующий вывод в мониторе порта.
Пояснения к коду
Программа начинается с подключения библиотеки DHTlib. После этого мы указываем номер контакта Arduino, к которому подключен вывод данных нашего датчика, и создаем объект DHT.
#include <dht.h> /* Контакт, к которому подключен датчик */ #define DATA_PIN 2 /* Создание объекта DHT */ dht DHT;
В функции setup()
мы инициализируем последовательную связь.
void setup() { /* Инициализация последовательного порта */ Serial.begin(9600); }
В функции loop()
мы используем функцию read11(DATA_PIN)
для чтения DHT11. Эта функция принимает в качестве параметра номер контакта данных датчика. При работе с DHT22 необходимо использовать функцию read22(DATA_PIN)
, для этого вам просто нужно раскомментировать строку int readData = DHT.read22(DATA_PIN);
и закомменитировать или убрать int readData = DHT.read11(DATA_PIN);
.
/* Считываем данные с датчика DHT11 */ int readData = DHT.read11(DATA_PIN); /* Считываем данные с датчика DHT22 */ //int readData = DHT.read22(DATA_PIN);
Теперь мы можем получить значения влажности и температуры, обратившись к свойствам объекта DHT:
/* Получает значения температуры */ float t = DHT.temperature; /* Получает значения влажности */ float h = DHT.humidity;
А дальше выводим значения в порт.
Вывод данных на LCD 1602
Если вы строите метеостанцию или аналогичный проект, то вам понадобится выводить данные на какой-нибудь дисплей, а не на последовательный монитор. В следующем примере мы рассмотрим, как подключить ЖК дисплей к Arduino, чтобы выводить измеренные значения с датчиков DHT11 и DHT22.
Схема покдлючения
Для экономии контактов Ардуино, мы подключим дисплей с помощью адаптера I2C. В этом случае для управления выводом данных на дисплей нам необходимо только два контакта, не считая питания и землю.
Код для Ардуино
Для работы с дисплеем через шину I2C будем использовать библиотеку LiquidCrystal_I2C.
/* Подключаем библиотеки */ #include <dht.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> /* Создание объекта lcd */ LiquidCrystal_I2C lcd(0x27,16,2); /* Контакт, к которому подключен датчик */ #define DATA_PIN 2 /* Создание объекта DHT */ dht DHT; void setup() { /* Инициализация дисплея */ lcd.init(); /* Включаем подсветку */ lcd.backlight(); } void loop() { /* Считываем данные с датчика DHT11 */ int readData = DHT.read11(DATA_PIN); /* Считываем данные с датчика DHT22 */ //int readData = DHT.read22(DATA_PIN); /* Получает значения температуры */ float t = DHT.temperature; /* Получает значения влажности */ float h = DHT.humidity; /* Выводим температуру на первой строке */ lcd.home(); lcd.print("T: "); lcd.print(t); /* Выводим символ градуса */ lcd.print(char(223)); lcd.print("C"); /* Выводим влажность на второй строке */ lcd.setCursor(0,1); lcd.print("H: "); lcd.print(h); lcd.print("%"); /* Задержка между измерениями 2 секунды */ delay(2000); }
В результате получилась следующая картина:
И напоследок, сравнили значения, которые выдал датчик DHT11, с термогигрометром ИВА-6.