Датчик температуры и влажности
Датчик температуры и влажности DHT11
Сенсор DHT11 для измерения температуры и относительной влажности окружающего воздуха — отлично откалиброванный, стабильный и энергоэффективный датчик.
Датчик подключается к управляющей электронике через 3 провода. При подключении к Arduino будет крайне удобно использовать Troyka Shield. Шлейф для подключения включён в комплект.
Внимание! Распиновка питания этого сенсора может различаться. Перед включением модуля ознакомьтесь с особенностями подключения модулей DFRobot .
Данные и температуры, и влажности поставляются по сигнальному проводу в виде цифрового сигнала. Это позволяет передавать данные на расстояние до 20 м. Сенсор работает по собственному протоколу. Полная инструкция по его подключению и использованию с Arduino приведена на нашей вики.
Характеристики
- Напряжение питания: 5 В
- Диапазон температур: 0–50 °С
- Погрешность температуры: ±2 °С
- Диапазон влажности: 20–90%
Погрешность влажности: ±5%
Если необходима большая точность, рассмотрите датчик температуры и влажности SHT1x .
Датчик влажности и температуры DHT11
Датчик DHT11 - это цифровой датчик температуры и влажности, позволяющий калибровать цифровой сигнал на выходе. Состоит из емкостного датчика влажности и термистора. Также, датчик содержит в себе АЦП для преобразования аналоговых значений влажности и температуры.
Питание и I/O 3.5-5.5 В
Характеристики:
- Определение влажности 20-95% с 5% точностью
- Определение температуры 0-50 град. с точностью 2 град.
- Частота опроса не более 1 Гц (не более раза в 1 сек.)
- Размеры 15.5мм x 12мм x 5.5мм
- 4 вывода с расстоянием между ножками 0.1"
При подключении к микроконтроллеру, вы можете между выводами Vcc и Data разместить подтягивающий pull-up резистор номиналом 10 кОм. Плата Arduino имеет встроенные pull-up, однако они очень слабенькие — порядка 100 кОм.
Датчик температуры и влажности DHT22
Очень популярный китайский датчик, сообщающий температуру и влажность. Дешёвый, имеет простой протокол передачи данных.
Используется шина с общим коллектором и подтяжкой к плюсу. Протокол общения таков:
- Прижимаем шину к 0 в течение 80мкс, отпускаем шину. Это служит меткой запроса. Переводим контакт ввода-вывода STM32 в состояние «вход».
- Датчик откликается удерживанием линии в 1 течение 90мкс, и начинает передавать данные.
- Каждый бит — это 0 в течение 50 мкс и 1 в течение 25 или 125 мкс.
- Датчик передаёт 2 байта данных влажности, 2 байта температуры и 1 байт — сумма первых 4. Это CRC.
- После завершения передачи (около 4 мс) датчик отпускает линию в состояние 1.
Осциллограмма создана прибором Red Pitaya . На графике видны паузы между битами — низкий уровень в течение
50мкс, и биты данных — высокий уровень в течение 25 мкс (передан 0) или в течение 125 мкс (передана 1). Понятно, что раз биты имеют переменную длину, длина всей посылки тоже заранее неизвестна, она будет от 2.7мс (переданы все нули) до 6.5мс (переданы все единицы в байтах данных, crc = 11111100b).
Данные — это просто значение влажности или температуры в десятых долях процента или градуса. Давайте посмотрим на пример:
Пример измерения влажности и температуры на DHT22
В начале видим запрос от МК (длинный ноль в момент 0.25мс), ответ от датчика (длинная единица в 0.3мс), и в 0.9мс начинается передача битов: короткие импульсы высокого уровня — это логический ноль, длинные — логическая единица (кстати, похоже на телеграф и на протокол 1-Wire), пауза между битами — низкий уровень. Для наглядности я разделил байты чёрными линиями; приняли 5 байт с такими значениями:
- 00000001b = 1, это старший байт (MSB) значения влажности.
- 01011111b = 95, это младший байт (LSB) значения влажности.
- 00000000b = 0, старший байт (MSB) температуры.
- 11100101b = 229, младший байт (LSB) температуры.
- 01000101b = 69, это контрольная сумма (CRC), которая должна быть равна сумме всех байт данных. Проверяем: 1+95+0+229 = 325. Понятно, что 325 в байт не влезет, возьмём модуль по 256 (т.е. отрежем старшие биты) — получилось 69. Всё точно!
Последний шаг: влажность = 1 * 256 + 95 = 351, то есть 35.1% ; температура = 0 * 256 + 229 = 229, то есть 22.9°. Это я объясняю так долго, а на самом деле надо просто запихнуть принятые байты в uint16_t, и он сразу покажет эти цифры
Осталось написать программу для чтения DHT22 на STM32. Для общения с датчиком я использую вывод PA1.
Код может показаться не очень понятным, но по сути всё просто: если состояние входа изменилось и стало 0 — значит, только что пришёл новый бит. Измеряем его длительность, если она короткая (меньше 9 циклов опроса — это экспериментальное значение), значит это 0, иначе это 1. Записываем этот бит в переменную типа int64_t на следующую позицию, с каждым новым битом сдвигаемся в этом числе на 1. После окончания приёма ответа в переменной лежит весь ответ, все 5 байт — 40 бит.
Осталось выделить из этого числа два 16-битных числа: влажность (с 24 бита по 39) и температуру (с 8 бита по 23). Я делаю это так: сдвигаю число вправо на 24 бита и привожу результат к 16 битам — к типу uint16_t. Кстати, того же самого обрезания до 16 бит можно было добиться, сделав И с числом 0xFFFF, но это не так наглядно.
На мой взгляд, этот датчик можно использовать:
- системе умного дома
- в домашней метеостанции
- для автоматического управления вентиляцией в теплицах
Правда мне кажется, что это какой-то очень «дополнительный» датчик, не такой важный как термометр или датчик движения. Что делать-то с полученным значением влажности? Может быть, управлять кондиционером ?
А как вы используете DHT22?
Навигация по записям
(3 votes, average: 5,00 out of 5)