Технические характеристики датчика температуры и влажности DHT11
Итак, датчик DHT11 имеет следующие характеристики:
- диапазон измеряемой относительной влажности – 20..90% с погрешностью до 5%,
- диапазон измеряемых температур – 0..50°C с погрешностью до 2°C;
- время реакции на изменения влажности – до 15 секунд, температуры – до 30 секунд;
- минимальный период опроса – 1 секунда.
Габаритные размеры и внешний вид датчика температуры и влажности DHT11
Как видно, датчик DHT11 не отличается особой точностью, да и диапазон температур не охватывает отрицательные значения, что вряд ли подойдёт для наружных измерений в холодное время года при нашем климате. Однако малая стоимость, малый размер и простота работы с ним частично перекрывают эти недостатки. На рисунке приведён внешний вид датчика и его размеры в миллиметрах.
Виды датчиков
Сегодня производитель Arduino проявил большую силу в сообществе разработчиков электронных приложений и распространил различные модули, которые позволяют проектам Arduino датчиков быть более гибкими.
Рассмотрим основные виды приборов, построенных на рассматриваемой платформе:
- Вращательный: в основном, резистор, подключенный к потенциометру и трехконтактному разъему, который позволяет подключать аналоговый выход и подавать его VCC и GND. Часто используется для определения положения двигателя, как сервомотора, так и шагового, постоянного тока и других. По-другому можно назвать – Ардуино датчик тока или Аrduino датчик движения.
- Звуковой: оснащен микрофоном, операционным усилителем LM386 и потенциометром, позволяющим захватывать любой звук вокруг него и превращать его в аналоговый сигнал с 0V до VCC, который может быть преобразован в сигнал Аrduino от 0 до 1024 в резолюции ADC. Существуют различные приложения для такого типа, которые относятся к аудиозахвату. Также существует ультразвуковой датчик Ардуино.
- Обнаружитель дыма: используется в системах обнаружения пожара, является прибором, который выявляет дым и газ, может быть откалиброван с помощью потенциометра, а выходной сигнал подключается к аналоговому входному модулю. Эти Ардуино-датчики имеют, помимо прочего, варианты MQ-2, MQ-3, MQ4 и дифференцируются по типу обнаруженного вещества, метана, спирта, пропана и другие.
- Детонация: предназначен для обнаружения сбоев или известен, как перкуссионный. Передает цифровой сигнал, когда обнаруживает изменение. Может быть подключен к цифровому входу на плате разработки Arduino и обнаруживать сигнал, который генерируется при наличии какого-либо удара.
- Ардуино-датчик температуры: предназначается для измерения состояния окружающей среды. К таким можно отнести Аrduino dsl8b20.
Чем отличаются датчики DHT11 и DHT22?
Две версии сенсоров DHT похожи друг на друга и имеют одинаковую распиновку. Их отличия в характеристиках. Спецификации:
Сенсор DHT11:
- определение влажности в диапозоне 20-80%
- определение температуры от 0°C до +50°C
- частота опроса 1 раз в секунду
Сенсор DHT22:
- определение влажности в диапазоне 0-100%
- определение температуры от -40°C до +125°C
- частота опроса 1 раз в 2 секунды
Таким образом, характеристики датчика DHT22 лучше по сравнению с DHT11, и поэтому он чуть-чуть дороже. Снимать показания чаще, чем раз в 1-2 секунды не получится, но, возможно, для вашего проекта более высокое быстродействие и не требуется.
Обзор аппаратного обеспечения
Теперь давайте перейдем к более интересным вещам. Давайте разберем оба датчика DHT11 и DHT22/AM2302 и посмотрим, что внутри.
Корпус состоит из двух частей, поэтому для его вскрытия достаточно просто достать острый нож и разделить корпус на части. Внутри корпуса на стороне датчиков находятся датчик влажности и датчик температуры NTC (термистор).
Рисунок 2 – Внутренности датчиков температуры и влажности DHT11 DHT22/AM2302
Чувствительный к влажности компонент, который используется, разумеется, для измерения влажности, имеет два электрода с влагоудерживающей подложкой (обычно соль или проводящий пластиковый полимер), зажатой между ними. По мере поглощения водяного пара подложка высвобождает ионы, что, в свою очередь, увеличивает проводимость между электродами. Изменение сопротивления между двумя электродами пропорционально относительной влажности. Более высокая относительная влажность уменьшает сопротивление между электродами, в то время как более низкая относительная влажность увеличивает это сопротивление.
Рисунок 3 – Внутренняя структура датчика влажности в DHT11 и DHT22
Кроме того, в этих датчиках для измерения температуры имеется датчик температуры NTC (термистор). Термистор – это терморезистор – резистор, который меняет свое сопротивление в зависимости от температуры. Технически все резисторы являются термисторами – их сопротивление слегка изменяется в зависимости от температуры, но обычно это изменение очень мало и его трудно измерить.
Термисторы сделаны так, чтобы их сопротивление резко изменялось при изменении температуры, и изменение на один градус может составлять 100 Ом или более! Термин «NTC» означает «Negative Temperature Coefficient» (отрицательный температурный коэффициент), что означает, что с ростом температуры сопротивление уменьшается.
Рисунок 4 – График зависимости сопротивления NTC термистора от температуры
С другой стороны имеется небольшая печатная плата с 8-разрядной микросхемой в корпусе SOIC-14. Эта микросхема измеряет и обрабатывает аналоговый сигнал с сохраненными калибровочными коэффициентами, выполняет аналого-цифровое преобразование и выдает цифровой сигнал с данными о температуре и влажности.
Распиновка DHT11 и DHT22/AM2302
Датчики DHT11 и DHT22/AM2302 довольно легко подключаются. У них есть четыре вывода:
Рисунок 5 – Распиновка датчиков температуры и влажности DHT11 и DHT22/AM2302
- Вывод VCC обеспечивает питание датчика. Хотя допускается напряжение питания в диапазоне от 3,3 до 5,5 В, рекомендуется питание 5 В. В случае источника питания 5 В, вы можете держать датчик на расстоянии до 20 метров от источника питания. Однако при напряжении питания 3,3 В длина кабеля не должна превышать 1 метра. В противном случае падение напряжения в линии приведет к ошибкам измерения.
- Вывод Data используется для связи между датчиком и микроконтроллером.
- NC не подключен
- GND должен быть подключен к земле Arduino.
Список деталей для сборки модели
Для сборки проекта, описанного в этом уроке, понадобятся следующие детали:
- плата Arduino (подробнее, о том как выбрать Arduino здесь);
- датчик DHT11 или DHT22 (можно купить, например, здесь или здесь);
- Breadboard;
- резистор на 10 кОм;
- программа Arduino IDE, которую можно скачать с сайта Arduino.
Датчик DHT11 входит в состав набора из 37 датчиков и других компонентов за $37.
Датчики DHT11 и DHT22
Подключение датчика DHT11 к Ардуино
У датчика DHT11 есть четыре вывода, один из которых (№3) не используется.
Как видно на фото, выводы нумеруются слева на право, если смотреть на корпус датчика со стороны решетки и ногами вниз. Подключаем выводы к Ардуино Уно по следующей схеме:
Датчик DHT11 | 1 | 2 | 4 |
Ардуино Уно | +5V | 2 | GND |
Принципиальная схема
Внешний вид макета
Важно отметить, что второй вывод датчика мы подключаем не только ко второй линии GPIO на Ардуино, но еще и к плюсу питания через резистор подтяжки 4,7 кОм. Таким образом, мы, что называется, «подтягиваем» линию данных датчика к плюсу. Это необходимо для правильного функционирования DHT11.
Программа для работы с DHT11
Теперь, когда датчик подключен, приступим к программированию контроллера. Первое, что нам следует сделать — установить в Arduino IDE дополнительную библиотеку. Существует множество библиотек для работы с DHT, но мы выберем вариант с портала Adafruit. Ссылка на библиотеку имеется в конце урока.
Устанавливаем библиотеку и составляем тестовую программу:
#include
В верхней части программы имеется три строки с директивой define, две из которых закомментированы (перед ними стоят два слеша). В зависимости от типа датчика мы можем раскомментировать нужную строку. Сейчас выбран датчик DHT11.
Загружаем программу в Ардуино Уно, открываем монитор последовательного порта (Tools/Serial Monitor) и наблюдаем результаты измерений!
Получение данных
Рассмотрим данные, полученные от DHT11.
00100101 00000000 00011001 00000000 00111110.
Чтобы проверить правильность полученных данных, нам нужно выполнить небольшой расчет. Добавьте все значения интегральных и десятичных значений RH и температуры и проверьте, равна ли сумма величине контрольной суммы, т. е. последним 8-битным данным:
00100101 + 00000000 + 00011001 + 00000000 = 00111110
Это значение совпадает с контрольной суммой и, следовательно, полученные данные действительны. Теперь, чтобы получить значения RH и температуры, просто преобразуйте двоичные данные в десятичные данные:
- RH = Десятичное значение 00100101 = 37%
- Температура = Десятичное значение 00011001 = 250C
Датчик влажности и температуры DHT11 позволяет легко добавлять данные в ваши проекты электроники DIY. Он идеально подходит для удаленных метеорологических станций, домашних систем управления окружающей средой и систем мониторинга фермы или сада.
Временная диаграмма информационного обмена датчика температуры и влажности DHT11 с микроконтроллером
С помощью временной диаграммы, полученной с логического анализатора, разберёмся, как осуществляется информационный обмен.
Для связи с микроконтроллером датчик температуры и влажности DHT11 использует однопроводный последовательный пакетный интерфейс. Один информационный пакет длительностью около 4 мс содержит: 1 бит запроса от микроконтроллера, 1 бит ответа датчика и 40 битов данных от датчика (16 битов информации о влажности, 16 битов информации о температуре и 8 проверочных битов). Давайте подробнее рассмотрим временную диаграмму информационного обмена Arduino с датчиком DHT11.
Временная диаграмма информационного обмена сенсора DHT11 с микроконтроллером
Из рисунка видно, что есть два типа импульсов: короткие и длинные. Короткие в данном протоколе обмена обозначают нули, длинные импульсы – единицы.
Итак, первые два импульса – это запрос Arduino к DHT11 и, соответственно, ответ датчика. Далее идут 16 бит влажности. Причём они разделены на байты, старший и младший, старший слева. То есть на нашем рисунке данные о влажности такие: 0001000000000000 = 00000000_00010000 = 0x10 = 16% относительной влажности.
Данные о температуре, аналогично: 0001011100000000 = 00000000_00010111 = 0x17 = 23 градуса Цельсия.
Контрольная сумма – это всего-навсего арифметическое суммирование 4-х полученных байтов данных:
00000000 +
00010000 +
00000000 +
00010111 =
00100111 в двоичной системе или 0 + 16 + 0 + 23 = 39 в десятичной.
Работа с датчиком DHT11 без библиотеки
Теперь мы знаем достаточно для того чтобы написать собственную программу для работы с сенсором температуры и влажности DHT11 без использования сторонних библиотек. Напишем скетч, который будет опрашивать раз в секунду датчик и выводить в последовательный порт компьютера принятый пакет и данные о температуре, влажности, а также проверочный байт. На 13-ую ножку Arduino выведем контрольный сигнал и, подключившись в ней логическим анализатором, проверим, что мы верно считываем информацию от датчика.
Скетч для работы с DHT11 и Arduino без сторонних библиотек (разворачивается)
#define DHT11pin 8 // для подключения шины DATA сенсора DHT11 #define LEDpin 13 // используем для контроля const int NUM_READS = 500; // зависит от частоты кварца и подбирается экспериментально long readsCounter = 0; // счётчик циклов чтения int reads[NUM_READS]; // сырой массив считанных значений void setup() { Serial.begin(9600); pinMode(DHT11pin, INPUT); pinMode(LEDpin, OUTPUT); } void loop() { if (readsCounter < NUM_READS) { readSerialDHT11(); } else { delay(1000); // задержка ПЕРЕД запросом processDht11Data(); // обрабатываем данные из прошлого цикла initLink(); // инициализируем новый цикл обмена resetVals(); } } // Посылает импульс инициализации обмена с DHT11: void initLink() { pinMode(DHT11pin, OUTPUT); digitalWrite(DHT11pin, LOW); delay(15); pinMode(DHT11pin, INPUT); } // Читает данные датчика DHT11 и записывает в массив: void readSerialDHT11() { int sensorValue = digitalRead(DHT11pin); reads[readsCounter] = sensorValue; digitalWrite(LEDpin, sensorValue); // для проверки выводим на отдельную ножку readsCounter++; } // Обрабатывает массив данных за цикл с DHT11: void processDht11Data() { byte dht11Data[41] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // обработанный массив (биты пакета) int zeroLen = 1; // минимальная длительность бита “0” int oneLen = 3 * zeroLen; // примерная длительность бита “1” int wrongData = 6 * zeroLen; // допуск по длительности для данных int currentBitLen = 0; // длительность текущего бита int bitPosition = 0; // позиция бита в пакете for (int i=1; i
Небольшая таблица даст дополнительные разъяснения к предлагаемому решению.
initLink() | Посылает импульс инициализации обмена с DHT11. | В режиме INPUT цифровые выводы Arduino находятся в состоянии “1”. Мы переводим их в режим OUTPUT и на 15 мс опускаем в “0”, что служит сигналом начала обмена для датчика DHT11. |
readSerialDHT11() | Читает данные датчика DHT11 и записывает в массив. | Постоянно опрашиваем состояние линии DATA, записываем принятые данные в массив (до верхней границы массива), выводим для проверки на 13-ый пин Arduino принятые данные (это нужно было мне для отладки, в «чистовом» коде этот кусок можно убрать). |
processDht11Data() | Обрабатывает массив данных, принятых за один цикл (один пакет). | По передним фронтам принятых импульсов фиксируем факт пришедшего нового бита и считаем в условных единицах его длительность. По длительности оцениваем – это бит-единица или бит-ноль (в некоторых заданных пределах). Составляем пакет из 41 бита. |
getHumidTemperatureParity() | Получает данные о влажности, температуре из пакета. | Выделяем из 41 бита пакета данные о влажности, температуре и контрольную сумму. |
resetVals() | Сбрасывает переменные в исходное состояние. | При расширении программы здесь могут появиться ещё переменные, требующие сброса. |
Вот так будет выглядеть временная диаграмма. Здесь A – это сигнал в шине DATA датчика DHT11, B – считываемый сигнал.
Временная диаграмма информационного обмена DHT11 с Arduino (A) и считанные контрольные значения на выводе 13 (B)
Видно, что мы считываем данные с небольшой задержкой. Кроме того, мы начинаем читать данные с ответного сигнала и пропускаем запросный сигнал. В программе этот первый импульс мы не учитываем, т.к. он не относится непосредственно к данным. В выводе монитора COM-порта мы можем наблюдать аналогичную картину: длинная строка единиц и нулей – это наши пакеты, и видно, что все они начинаются с единичного бита, т.к. мы считываем пакеты, начиная с ответного бита.
Принятые и расшифрованные данные сенсора DHT11 в мониторе COM-порта
Что мы не учли в этой программе, так это то, что минимальная длительность импульса бита-нуля может изменяться в некоторых пределах, а мы жёстко задали её значение в коде. По хорошему нужно ещё написать функцию getMinimalBitLen(), которая бы находила минимальную длительность (в условных единицах) одного бита-нуля в обрабатываемом пакете.
Подключение сенсоров DHT к Arduino
Датчики DHT имеют стандартные выводы и их просто установить на breadboard.
Датчики DHT имеют 4 вывода:
- питание.
- вывод данных
- не используется.
- GND (земля).
Между выводами питания и вывода данных нужно разместить резистор номиналом 10 кОм.
Датчик DHT часто продается в виде готового модуля. В этом случае он имеет три вывода и подключается без резистора, т.к. резистор уже есть на плате.
Схема подключения датчика с резистором:
Схема подключения датчика DHT к Arduino
Предыдущая