Это простой и недорогой датчик для определения температуры и влажности, который отлично подходит для обучения. Большая часть написанного подойдет и для аналогичных датчиков DHT22 и AM2301.
Датчик включает в себя:
- термистор для измерения температуры;
- емкостной датчик влажности;
- 8-разрядный микроконтроллер с АЦП для вывода значений температуры и влажности в виде последовательных данных.
Он откалиброван на заводе-изготовителе и, следовательно, легко взаимодействует с другими микроконтроллерами.
Однопроводный последовательный интерфейс делает системную интеграцию быстрой и простой. Его небольшой размер, низкое энергопотребление и передача сигнала до 20 метров делают его лучшим выбором для различных применений.
Характеристики датчика DHT11
Измерение влажности
- Измеряемый диапазон влажности: 20–90% RH
- Точность измерений влажности: 0,1% RH
- Погрешность измерений влажности: ±5% RH
- Время реакции на изменение значения: 6–10 с
Зависимость диапазона измерений от температуры:
- 0 °C — 30–90% RH
- 25 °C — 20–90% RH
- 50 °C — 20–80% RH
RH (Relative Humidity) — относительная влажность
Измерение температуры
- Измеряемый диапазон температур: 0–50 °C
- Точность измерения температуры: 0,1 °C
- Погрешность измерения температуры: ±2 °C
- Время реакции на изменение значения: 6–30 с
Электрические параметры
- Напряжение питания: 3–5,5 В
- Потребляемый ток:
- при выполнении преобразования — 0,5–2.5 мА
- в режиме ожидания — 100–150 мкА
- Минимальное время преобразования: 1 с
Габариты
- Длина, ширина, высота: 15,5 х 12 х 5,5 мм
- Шаг выводов: 2,54 мм (0,1″)
Стандартная схема подключения
Назначение выводов сенсора:
- Питание (VDD)
- Вывод данных
- Не используется
- Земля (GND)
Если длина провода соединяющего датчик и микроконтроллер короче 20 метров, рекомендуется подтягивающее сопротивление 5 кОм. Если длина соединения превышает 20 метров, необходимо самостоятельно выбирать подходящий подтягивающий резистор.
Также рекомендуется использовать фильтрующий конденсатор 100 нФ по питанию для исключения помех, и при подаче питания на сенсор в течении одной секунды не передавать инструкции на датчик, чтобы контроллер в сенсоре успел пройти нестабильное состояние.
Среди модулей, подготовленных для работы с конструктором на базе Arduino, этот устанавливается на плату, уже имеющую подтягивающий резистор на 5,1 кОм, три контакта («+», out, «−») и фильтрующий конденсатор.
Пример использования с Arduino
Для тех, кто хочет понять принцип работы не углубляясь в подробности можно использовать библиотеку для работы с датчиком, которую нужно скачать по ссылке и разместить в папке /libraries (всю папку).
После мы подключаем «+» датчика к 5V на плате Arduino, «−» — к GND, и вывод «out» на датчике — к, например, второму цифровому входу.
Для работы с датчиком можно воспользоваться примером из библиотеки (я убрал лишнее, подредактировал и нашпиговал его комментариями).
// подключаем библиотеку
#include "DHT.h"
// к какому пину подключен «out» датчика
#define DHTPIN 2
// тип используемого датчика
#define DHTTYPE DHT11
// инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
// задержка между измерениями 2 секунды
delay(2000);
// получение значеия влажности
float h = dht.readHumidity();
// получение значения температуры
float t = dht.readTemperature();
// проверка полученных значений
if (isnan(h) || isnan(t)) {
Serial.println("Ошибка получения данных!");
return;
}
// вывод результата
Serial.println("Влажность: " + h + "% RH\tТемпература: " + t + " *C");
}
А теперь баловство в сторону, пора знакомиться ближе.
Передача данных по последовательному интерфейсу (Single-Wire Two-Way)
Все показания датчика отправляются с использованием однопроводной шины, что снижает стоимость и увеличивает расстояние. Чтобы отправить данные по шине требуется использовать специальный протокол передачи данных.
На DHT-11 шина данных подключается с резистором к VDD (Vcc). Поэтому, если ничего не происходит, напряжение на шине равно VDD (Vcc). Логический уровень сигнала в этом случае определяется не напряжением на шине, а длительностью импульса.
Процесс общения с датчиком разделен на три основные стадии:
- Запрос к датчику
- Ответ датчика о готовности
- Передача данных
В упрощенном виде это можно показать так (кликабельно):
На рисунке выше к первой стадии относятся два первых интервала, ко второй — два следующих, к третьей — все остальные.
Запрос к датчику
Чтобы датчик отправил вам показания, ему нужно послать ему соответствующий запрос. Он состоит в том, чтобы опустить напряжение в шине более чем на 18 мс, а затем подтянуть ее обратно на 20–40 мкс. Это действие выводит датчик из спящего режима.
Сразу после отпускания уровня в шине надо переключиться на прием и ждать ответа датчика.
Ответ датчика о готовности
Это автоматический ответ от датчика, который указывает, что он получил ваш запрос. Датчик опускает уровень сигнала в шине примерно на 54 мкс и снова подтягивает на 80 мкс.
После этих этюдов в шину пойдут данные.
Передача данных
Один цикл передачи данных длится около 4 миллисекунд. Полный пакет данных состоит из 40 бит (5 пять блоков по 8 бит).
Формат пакета следующий: первые два блока — это значение влажности (целая и десятичная часть, каждая по 8 бит), следующие два блока — это значение температуры (целая и десятичная часть, каждая по 8 бит), последний блок — это 8 бит контрольной суммы.
8 bit integral RH data | 8 bit decimal RH data | 8 bit integral T data | 8 bit decimal T data | 8 bit check sum |
---|
Контрольная сумма — это сумма первых четырех блоков. Если ее значение не совпадает с суммой первых четырех блоков, значит полученные данные не верны.
Перед каждым битом уровень в шине опускается на 54 мкс, затем шина снова подтягивается к питанию на 24 или 70 мкс. От длительности этого импульса зависит «0» или «1» была передана.
В блоках сначала передаются старшие биты, поэтому каждый блок будет выглядеть как-то так:
После передачи пакета данных датчик снова опускает уровень в шине на 54 мкс, после чего уходит в спящий режим, и шина снова подтягивается к питанию.
Для повторного запроса данных повторяем всю процедуру по новой.