====== Датчик температуры и влажности DHT-21: инструкция, примеры использования и документация ======
[[amp>product/temperature-humidity-sensor-dht21?utm_source=announce&utm_campaign=dht-21&utm_medium=wiki|Выносной датчик DHT-21 ]] предназначен для измерения температуры и влажности окружающей среды.
{{ :продукты:dht-21:img_0360.jpg?nolink |}}
===== Подключение и настройка =====
Датчик общается с управляющей электроникой по трём проводам.
При подключении к [[amp>collection/arduino?utm_source=man&utm_campaign=dht-21&utm_medium=wiki|Arduino]] или [[amp>product/iskra-js?utm_source=man&utm_campaign=dht-21&utm_medium=wiki|Iskra JS]] удобно использовать [[amp>/product/arduino-troyka-shield?utm_source=man&utm_campaign=dht-21&utm_medium=wiki|Troyka Shield]].
{{ :продукты:dht-21:dht-21.png?nolink |}}
===== Примеры работы =====
Рассмотрим примеры работы датчика температуры и влажности DHT-21 в зависимости от управляющей платформы.
==== Пример для Arduino ====
В качестве примера выведем в Serial-порт текущее значение температуры и влажности. Для запуска примера скачайте и установите библиотеку [[https://github.com/amperka/TroykaDHT|TroykaDHT]].
// библиотека для работы с датчиками серии DHT
#include
// создаём объект класса DHT
// передаём номер пина к которому подключён датчик и тип датчика
// типы сенсоров: DHT11, DHT21, DHT22
DHT dht(4, DHT21);
void setup()
{
// открываем последовательный порт для мониторинга действий в программе
Serial.begin(9600);
dht.begin();
}
void loop()
{
// считывание данных с датчика
dht.read();
// проверяем состояние данных
switch(dht.getState()) {
// всё OK
case DHT_OK:
// выводим показания влажности и температуры
Serial.print("Temperature = ");
Serial.print(dht.getTemperatureC());
Serial.println(" C \t");
Serial.print("Temperature = ");
Serial.print(dht.getTemperatureK());
Serial.println(" K \t");
Serial.print("Temperature = ");
Serial.print(dht.getTemperatureF());
Serial.println(" F \t");
Serial.print("Humidity = ");
Serial.print(dht.getHumidity());
Serial.println(" %");
break;
// ошибка контрольной суммы
case DHT_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
// превышение времени ожидания
case DHT_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
// данных нет, датчик не реагирует или отсутствует
case DHT_ERROR_NO_REPLY:
Serial.println("Sensor not connected");
break;
}
// ждём две секунды
delay(2000);
}
==== Пример для Iskra JS ====
Выведем данные температуры и влажности в консоль Espruino Web IDE.
// подключаем библиотеку DHT22 для работы с датчиком DHT21 и создаём объект для работы с датчиком
var dht = require("DHT22").connect(P4);
// считываем данные с датчика
// выводим показания температуры и влажности в консоль
dht.read(function (a) {
console.log("Temp is "+a.temp.toString()+" and RH is "+a.rh.toString());
});
==== Пример для Raspberry Pi ====
Выведем данные температуры и влажности в консоль Thonny.
# Подключаем библиотеку для работы с пинами
from machine import Pin
# Подключаем библиотеку работы со временем
from time import sleep
# Подключаем библиотеку для работы с датчиками dht
import dht
# Создаём переменную, в которой инициализируем объект DHT
# и передаём номер пина, к которому подключен датчик.
# Датчики DHT 21 и DHT 22 инициализируются как DHT 22
dht22 = dht.DHT22(Pin(14))
# Входим в бесконечный цикл
while True:
# Если значения с датчика приходят
try:
# Ожидаем 2 секунды
sleep(2)
# Инициализируем измерения
dht22.measure()
# Создаём переменную temp, для хранения считанного значения температуры
temp = dht22.temperature()
# Создаём переменную hum, для хранения считанного значения влажности
hum = dht22.humidity()
# Выводим значение температуры в градусах Цельсия
print('Temperature: %3.2f C' %temp)
# Выводим значение влажности в процентах
print('Humidity: %3.2f %%' %hum)
# Если не удаётся прочитать значения с датчика
except OSError as e:
# Выводим сообщение, что данные не удалось прочитать
print('Failed to read data from the DHT22 sensor.')
===== Протокол датчика DHT =====
Выходом датчика является [[сенсоры:цифровые|цифровой сигнал]]. Температура и влажность передаются по одному сигнальному проводу (''S''). DHT21 общается с принимающей стороной, такой как [[amp>collection/arduino|Arduino]] по собственному протоколу. Коммуникация двунаправлена и в общих чертах выглядит так:
- Микроконтроллер говорит о том, что хочет считать показания. Для этого он устанавливает сигнальную линию в 0 на некоторое время, а затем устанавливает её в 1
- Сенсор подтверждает готовность отдать данные. Для этого он аналогично сначала устанавливает сигнальную линию в 0, затем в 1
- После этого сенсор передаёт последовательность 0 и 1, последовательно формирующих 5 байт (40 бит). В первых двух байтах передаётся температура, в третьем-четвёртом — влажность, в пятом — контрольная сумма, чтобы микроконтроллер смог убедиться в отсутствии ошибок считывания
Благодаря тому, что сенсор делает измерения только по запросу, достигается энергоэффективность: пока общения нет, датчик потребляет ток 100 мкА.
==== Датчик DHT21 ====
Цифровой датчик DHT21 является составным датчиком, который выдаёт калиброванный цифровой сигнал с показаниями температуры и влажности.
Сенсор включает в себя ёмкостный компонент измерения влажности и резистивный компонент измерения температуры с отрицательным температурным коэффициентом (NTC), которые подключены к высокопроизводительному АЦП.
Каждый датчик DHT21 проходит калибровку на заводе-изготовителе. Коэффициенты калибровки хранятся в однократно программируемой энергонезависимой памяти и используются во внутренних процессах обработки сигнала.
==== Контакты подключения трёхпроводного шлейфа ====
Модуль подключается к управляющей электронике по [[сенсоры:3-провода|трём проводам]].
Назначение контактов трёхпроводного шлейфа:
* Питание (''V'') — красный провод. На него должно подаваться напряжение питания от 3,3 до 5 В;
* Земля (''G'') — чёрный провод. Должен быть соединён с землёй микроконтроллера;
* Сигнальный (''S'') — жёлтый провод. Подключается к цифровому выходу микроконтроллера. Через него сенсор общается с микроконтроллером по собственному протоколу.
===== Характеристики =====
* Напряжение питания: 3,3–5 В
* Потребляемый ток:
* в режиме запроса данных: 1,5 мА
* в режиме покоя: 1,1 мА
* Диапазон измеряемой температуры: −40…+80 °С
* Погрешность температуры: ±0,3 °С
* Диапазон влажности: 0–99,9%
* Погрешность влажности: ±3%
* Размеры: 60×27×13 мм