DHT11 та DHT22. Фото взято тут. |
Згадані в назві сенсори користуються певною популярністю поміж любителів. Вони мають терпимі параметри, прості в роботі та зовсім дешеві (на ebay -- менше долара перший, 2.7$ -- другий). Правда, відносно повільні та, іноді, капризні.
При тому, хоча вся інформація про них в мережі є, але вона розсіяна по купі різних місць, а більшість даташітів взагалі китайською, іноді із перекладом у вигляді "підстрочника". Так що, вирішив і я приєднатися до цього інформаційного хаосу. :-)
Отож, DHT11 і DHT22 міряють відносну вологість та температуру. Загальні характеристики:
Скачати згадані даташіти, накопані на просторах Інтернету, можна тут.
Отож, DHT11 і DHT22 міряють відносну вологість та температуру. Загальні характеристики:
DHT11 | DHT22 | |
---|---|---|
Живлення | 3-5В | |
Споживання | 2.5 мА | |
ДІапазон вимірювань вологості | 20-80% | 0-100% |
Точність вимірювань вологості | 5% | 2-5% |
Діапазон вимірювань температури | 0..50°C | -40..125°C |
Точність вимірювань температури | ±2°C | ±0.5°C |
Частота вимірювань | 1Гц | 0.5Гц |
Розмір | 15.5mm x 12mm x 5.5mm | 15.1mm x 25mm x 7.7mm |
Тобто, DHT11 i DHT22 сильно відрізняються в робочих інтервалах, трохи -- в точності вимірів. Однак, способи роботи із ними співпадають, відрізняються хіба часові параметри сигналів.
Принцип дії наступний: вимірюється опір через певний гігроскопічний матеріал, (якусь сіль чи провідний полімер). Температуру вимірює термістор.
Трапляються вони у двох варіантах -- "голого" сенсора та "модуля для Arduino":
Сам сенсор має чотири піни, зліва направо:
Принцип дії наступний: вимірюється опір через певний гігроскопічний матеріал, (якусь сіль чи провідний полімер). Температуру вимірює термістор.
Зауваження. Ці сенсори можуть трапляються під іншими назвами:
- DHT11 = RHT01
- DHT22 = RHT03= AM2302
- Також, є третій, близько споріднений із ними: DHT21 = RHT02= AM2301 = HM2301 та більш нові, DHT33 = RHT04 = AM2303; DHT44 = RHT05 (дані взято тут), але з ними я не працював, в руках не тримав.
Їх інтерфейси дуже схожі, тому код, який буде пізніше, можна легко пристосувати для роботи із DHT21/DHT33/DHT44. DHT21 там навіть вже згадується -- мав би запрацювати зразу, але гарантій не дам.
Підключення
Трапляються вони у двох варіантах -- "голого" сенсора та "модуля для Arduino":
Розташування пінів DHT11. Для DHT22 -- аналогічне. Зображення із статті: "How to Set Up the DHT11 Humidity Sensor on an Arduino". |
- Живлення.
- Дані.
- Не під'єднано і не використовується.
- Земля.
Пін "Дані" (Signal на зображенні вище) повинен бути підтягнутий до напруги живлення резистором на 5-10кОм. (Рекомендується 5кОм, якщо лінія коротша за 20 метрів, і підбирати в міру сил, якщо довша.) Модуль для Arduino вже містить цей резистор, тому не потребує додаткових елементів. Підключення самого сенсора виглядає так:
Алгоритму обміну даними однаковий для обох сенсорів, відрізняються лише часові параметри ініціалізації:
Етапи взаємодії, згідно номерів на рисунку:
Однак, інтерпретація, що таке ціла, а що -- дробова частина, для сенсорів відрізняється.
Для DHT11 байт-0 (той, що прийшов першим) містить вологість, у відсотках, байт-2 -- температуру, у градусах Цельсія. Байти 1 та 3 -- завжди нульові.
Щоб отримати виміри для DHT22, слід взяти молодший байт (0 для тиску, 2 для температури), зсунути на 8 біт ліворуч (помножити на 256), відкинувши перед тим знак для від'ємної температури, додати молодший байт, повернути назад знак температури. Отримане число буде fixed-point числом, де остання цифра -- десяті виміру, решта -- ціла частина. В коді це може виглядати так:
temp_raw = ( (conf->buf[2] & 0x7F) << 8 ) + conf->buf[3];
temp_raw = (conf->buf[2] & 0x80) ? -temp_raw : temp_raw;
pres_raw = (conf->buf[0] << 8) + conf->buf[1];
temp_integer = temp_raw / 10;
temp_decimal = abs(temp_raw) % 10;
pres_integer = pres_raw / 10;
pres_decimal = pres_raw % 10;
Взято із: "Temperature and Humidity using the DHT22 sensor". |
Обмін даними
Фізичний рівень
Алгоритму обміну даними однаковий для обох сенсорів, відрізняються лише часові параметри ініціалізації:
Етапи взаємодії, згідно номерів на рисунку:
- Так як сигнальна лінія притягнута до живлення, в "стані спокою" на ній логічна одиничка.
- Мікроконтролер (MCU) повідомляє сенсор, що йому потрібні дані, притягнувши лінію до 0 на час порядку 500 мкс для DHT22, 18 мс = 18 000 мкс для DHT11. На жаль, хоча документація не згадує обмежень на максимальну тривалість сигналу, DHT22 не хоче працювати, якщо цей сигнал триватиме кілька мілісекунд, тому слід реалізувати окремий інтервал для кожного із сенсорів.
- Після подачі команди MCU відпускає лінію (вона підтягнеться до 1) і починає слухати. (Не маючи осцилографа, не розібрався до кінця, але лінія чомусь піднімається доволі повільно, а найгірше -- нестабільно. Перехід від 0 до 1 займає від 8 до 30+ мкс!)
- Через 20-40 мкс пристрій відгукується, опускаючи лінію в нуль на 80 мкс -- повідомляє, що він тут.
- Потім теж відпускає лінію, на 80 мкс, після чого починає побітово передавати дані.
- Нульовий біт передається послідовністю із 50 мкс низького рівня та 26-28 мкс високого.
- Одиничний біт передається із тією ж паузою, 50 мкс низького рівня та 70 мкс високого.
- По завершенню обміну сенсор відпускає лінію.
Увага:
- Немає сенсу смикати DHT11 частіше, ніж раз в секунду, DHT22 -- частіше, ніж раз в дві секунди.
- Не можна подавати команду першу секунду після подачі живлення.
Логічний рівень
Отримавши команду, сенсора передає підтвердження, потім 40 біт даних, котрі діляться на 5 байт. В документації вони названі так:- Ціла частина вологості
- Десяткова частина вологості
- Ціла частина температури
- Десяткова частина температури
- Контрольна сума -- 8-бітна сума (іншими словами -- сума за модулем 256) попередніх чотирьох байт.
Однак, інтерпретація, що таке ціла, а що -- дробова частина, для сенсорів відрізняється.
Для DHT11 байт-0 (той, що прийшов першим) містить вологість, у відсотках, байт-2 -- температуру, у градусах Цельсія. Байти 1 та 3 -- завжди нульові.
Щоб отримати виміри для DHT22, слід взяти молодший байт (0 для тиску, 2 для температури), зсунути на 8 біт ліворуч (помножити на 256), відкинувши перед тим знак для від'ємної температури, додати молодший байт, повернути назад знак температури. Отримане число буде fixed-point числом, де остання цифра -- десяті виміру, решта -- ціла частина. В коді це може виглядати так:
temp_raw = ( (conf->buf[2] & 0x7F) << 8 ) + conf->buf[3];
temp_raw = (conf->buf[2] & 0x80) ? -temp_raw : temp_raw;
pres_raw = (conf->buf[0] << 8) + conf->buf[1];
temp_integer = temp_raw / 10;
temp_decimal = abs(temp_raw) % 10;
pres_integer = pres_raw / 10;
pres_decimal = pres_raw % 10;
Деякі бібліотеки для Arduino трішки хитрують -- зануляють біти, які гарантовано мають бути нульові, (знаковий біт тиску, який завжди додатній та температури для DHT11, яка у нього лише додатна), ігнорують нульові байти для DHT11, мотивуючи, що помилки в бітах знаку чи 1-го і 3-го байту для DHT11 можна проігнорувати без шкоди. Цитуючи: "these bits are always zero, masking them reduces errors.". Дискусійне твердження, насправді -- воно збільшує позірну "живучість" пристрою, ціною приховування помилок -- іноді краще вже таки "CRC Error" сказати. Якби я скористався таким "ignorance"-підходом, впустив би пару помилок у своєму коді.
Код
Традиційно, для Arduino є ряд бібліотек різної якості:- "Class for DHTxx sensors (xx = 11-21-22-33-44)"
- "A DHT11 Class for Arduino"
- "Interrupt driven DHT11 library"
- https://github.com/adafruit/DHT-sensor-library
Особливості експлуатації -- теорія
- Росу не любить. Так само як "хімічні" випари, які можуть взаємодіяти із чутливим елементом сенсора.
- Якщо тривалий час знаходився в умовах, які знаходять за межами робочих, сильно зростає похибка виміру вологості, доходячи до 3% (абсолютна похибка, % -- одиниця виміру відносної вологості). Після повернення до нормальних умова, потроху повертається до норми. Щоб прискорити цей процес, можна виконати наступну процедуру: потримати сенсор дві години при 50~60C та вологості менше <10%, потім -- 5 годин за температури 20~30С і вологості >70%.
- Сам сенсор не можна паяти при температурі більше за 260С, тривалість пайки при цій температурі -- не більше 10 секунд.
Особливості експлуатації -- практика
По перше, трапився в Інтернеті тест: "Testing Various Low-Cost Hygrometers". Там -- значно ретельніше дослідження, ніж тут у мене!
По друге, маючи під руками 5 різних сенсорів (два DHT22 і три DHT33) вирішив їх випробувати.
Перший сюрприз був таким -- перший же взятий DHT11 завищував виміри вологості майже вдвічі. Можливо, його десь таки "замочили", і сенсор сам по собі ще вологий. А може просто вийшов з ладу...
Другий. Живлення одного із із DHT11 я включив у протилежному напрямку: плюс на землю, землю на плюс, секунд на 5. Сюрприз в тому, що він вижив! Звичайні мікросхеми, навіть потужні, від такого виходять з ладу майже миттєво.
Для контролю виводяться також дані із BMP180 -- барометра із термометром, який, правда, температуру теж міряє із точністю "градус туди, градус сюди...".
Виглядає типовий результат так:
BMP180: T=25.0 p=98678
DHT11_1: RH=33.0% T=24.0C
DHT11_2: RH=18.0% T=25.0C
DHT11_3: RH=19.0% T=24.0C
DHT22_1: RH=20.1% T=25.0C
DHT22_2: RH=20.1% T=24.9C
DHT11_1 -- той, що "оптиміст", як його обізвав мій колега, завищує результати відносно інших майже вдвічі. DHT11_3 -- "недопідсмажений", віри йому немає, але ніби працює.
Стабільність послідовних вимірів -- нормальна, остання цифра може на 1-2 змінюватися туди-сюди (що природно!). Якщо подути чи прикласти палець -- покази чемно і менш-більш узгоджено ростуть, перестати/забрати -- повертаються до попередніх значень.
Залишив я прилад ввімкненим на ніч, із вимірюванням приблизно раз у п'ять секунд. Отримав наступне:
Виміри температури 5-ма різними пристроями. По вертикалі -- градуси Цельсія, по горизонталі -- умовні одиниці, ширина графіку відповідає приблизно 8 годин. |
- DHT22 дали результат, близький до того, що дає BMP180.
- Виміри обох DHT22 близькі між собою.
- Обидва DHT11 дають дещо нижчі результати. При тому, вимір "нормального" на півградуса вищі від того, що сильно завищує вологість. (Звідки взялося півградуса? Згідно графіку, вимір стрибає на градус туди-сюди. Але мінімальна зміна, яку здатен виразити DHT11 -- 1 градус. Тому, якщо виміряне значення було десь посередині між 22С і 23С, повернене ним число і мало б так стрибати).
- На жаль, не маю незалежних вимірів температури в кімнаті, але покази приладів точно залишалися стабільними.
Відносна вологість, у відсотках. Зверху датчик, який завищує виміри. |
- Один DHT11 таки показує дурниці. Ймовірно -- контактував із водою... При тому, виміри стрибають -- це явно не похибка дискретизації.
- Решта приладів дають схожі виміри, стабільність яких є високою.
- Різниця між DHT11 i DHT22 якраз у дискретизації, перший заокруглює виміри до цілого.
Тиск у паскалях. Зауважте діапазон по вертикалі. |
Тиск у паскалях. Зауважте діапазон по вертикалі. |
9 | 85 | 24 23 69 24 24 24 23 23 | 23 23 23 23 23 24 24 26 | 23 23 24 70 23 70 70 69 | 24 25 23 23 23 23 23 25 | 23 24 69 70 23 70 70 67 DHT11_1: RH=32.0% T=23.0C 9 | 87 | 23 24 23 71 24 24 71 70 | 24 23 24 25 23 23 25 24 | 23 24 24 71 70 25 24 23 | 24 24 24 24 23 23 25 24 | 25 24 69 25 69 25 69 68 DHT11_2: RH=19.0% T=24.0C 9 | 87 | 23 23 25 70 24 23 71 71 | 23 24 24 25 24 23 24 25 | 24 23 24 71 71 24 24 25 | 24 23 25 23 23 25 23 25 | 25 23 71 23 71 23 71 68 DHT11_3: RH=19.0% T=24.0C 19 | 79 | 26 25 27 28 25 26 26 25 | 74 74 27 27 75 26 74 26 | 26 26 26 27 27 27 26 25 | 74 74 74 74 27 74 73 74 | 74 74 26 27 27 25 26 73 DHT22_1: RH=20.2% T=24.7C
Або, якщо дивитися на послідовні звертання до того ж пристрою (DHT22_2 в даному випадку) :
19 | 79 | 26 25 27 28 25 26 26 25 | 74 74 27 27 75 26 74 26 | 26 26 26 27 27 27 26 25 | 74 74 74 74 27 74 73 74 | 74 74 26 27 27 25 26 73 23 | 79 | 26 26 27 27 27 27 27 26 | 75 75 27 27 26 25 26 73 | 26 25 26 26 26 26 25 26 | 73 73 73 74 25 73 74 25 | 73 26 74 73 26 74 73 72 49 | 81 | 27 26 26 26 26 26 25 25 | 73 26 74 73 73 73 27 73 | 27 27 27 27 27 27 27 26 | 74 75 74 74 25 73 74 24 | 73 26 73 73 26 25 73 72 23 | 80 | 26 26 27 27 27 27 27 26 | 75 27 75 75 73 26 26 72 | 26 26 26 26 26 26 26 25 | 73 73 74 74 25 73 26 72 | 73 26 73 26 74 73 73 24
Похибка складає порядку 1 мкс (дані спочатку буферизуються, потім виводяться, тому сам вивід не впливає на часові характеристики).
Спостереження наступні (числа заокругляю):
- Падіння сигналу може тривати 10-50 мкс.
- Це не слідує із наведеного вище, але тривалі спостереження показують, що для DHT11 коливання часу малі, а от DHT22 люблять "потанцювати".
- Нуль-підтвердження менш-більш стабільний, 80 мкс, хоча може доходити і до 90.
- Нульовий біть -- 23-27 мкс, одиничка -- 70-75 мкс. Відхилення бувають, але такі великі, щоб сплутати 1 і 0 -- ніби ні.
Якось так. Чудес від цих приладів очікувати не слід, а кожен екземпляр варто тестувати індивідуально, але, на загал -- цілком симпатичні. (У своєму класі, звичайно).
Наступним постом буде трішки коду, а поки --
Дякую за увагу!
Немає коментарів:
Дописати коментар