Записки дилетанта

Содержание

Так вийшло що я цікавлюся безліччю речей, але так ні в чому не став професіоналом. Однак впорядкувати думки та поділитися ними з друзями та знайомими іноді хочеться.

понеділок, 23 січня 2017 р.

Гігрометри 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 сильно відрізняються в робочих інтервалах, трохи — в точності вимірів. Однак, способи роботи із ними співпадають, відрізняються хіба часові параметри сигналів.

Принцип дії наступний: вимірюється опір через певний гігроскопічний матеріал, (якусь сіль чи провідний полімер). Температуру вимірює термістор.

  • DHT11 = RHT01
  • DHT22 = RHT03 = AM2302
  • Також, є третій, близько споріднений із ними: DHT21 = RHT02= AM2301 = HM2301 та більш нові, DHT33 = RHT04 = AM2303; DHT44 = RHT05 (дані взято тут), але з ними я не працював, в руках не тримав.

Підключення

  1. Живлення.
  2. Дані.
  3. Не під’єднано і не використовується.
  4. Земля.

Пін "Дані" (Signal на зображенні вище) повинен бути підтягнутий до напруги живлення резистором на 5-10кОм. (Рекомендується 5кОм, якщо лінія коротша за 20 метрів, і підбирати в міру сил, якщо довша.) Модуль для Arduino вже містить цей резистор, тому не потребує додаткових елементів. Підключення самого сенсора виглядає так:

Взято із: "Temperature and Humidity using the DHT22 sensor".

Обмін даними

Фізичний рівень

Алгоритму обміну даними однаковий для обох сенсорів, відрізняються лише часові параметри ініціалізації:

  1. Так як сигнальна лінія притягнута до живлення, в "стані спокою" на ній логічна одиничка.
  2. Мікроконтролер (MCU) повідомляє сенсор, що йому потрібні дані, притягнувши лінію до 0 на час порядку 500 мкс для DHT22, 18 мс = 18 000 мкс для DHT11. На жаль, хоча документація не згадує обмежень на максимальну тривалість сигналу, DHT22 не хоче працювати, якщо цей сигнал триватиме кілька мілісекунд, тому слід реалізувати окремий інтервал для кожного із сенсорів.
  3. Після подачі команди MCU відпускає лінію (вона підтягнеться до 1) і починає слухати. (Не маючи осцилографа, не розібрався до кінця, але лінія чомусь піднімається доволі повільно, а найгірше — нестабільно. Перехід від 0 до 1 займає від 8 до 30+ мкс!)
  4. Через 20-40 мкс пристрій відгукується, опускаючи лінію в нуль на 80 мкс — повідомляє, що він тут.
  5. Потім теж відпускає лінію, на 80 мкс, після чого починає побітово передавати дані.
  6. Нульовий біт передається послідовністю із 50 мкс низького рівня та 26-28 мкс високого.
  7. Одиничний біт передається із тією ж паузою, 50 мкс низького рівня та 70 мкс високого.
  8. По завершенню обміну сенсор відпускає лінію.
  • Немає сенсу смикати DHT11 частіше, ніж раз в секунду, DHT22 — частіше, ніж раз в дві секунди.
  • Не можна подавати команду першу секунду після подачі живлення.

Логічний рівень

  1. Ціла частина вологості
  2. Десяткова частина вологості
  3. Ціла частина температури
  4. Десяткова частина температури
  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;

Особливості експлуатації — теорія

  • Росу не любить. Так само як "хімічні" випари, які можуть взаємодіяти із чутливим елементом сенсора.
  • Якщо тривалий час знаходився в умовах, які знаходять за межами робочих, сильно зростає похибка виміру вологості, доходячи до 3% (абсолютна похибка, % — одиниця виміру відносної вологості). Після повернення до нормальних умова, потроху повертається до норми. Щоб прискорити цей процес, можна виконати наступну процедуру: потримати сенсор дві години при 50

60C та вологості менше 10%, потім — 5 годин за температури 20

Детальна таблиця із документації:

Характеристики DHT11.
Характеристики DHT22.

Особливості експлуатації — практика

По перше, трапився в Інтернеті тест: "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 змінюватися туди-сюди (що природно!). Якщо подути чи прикласти палець — покази чемно і менш-більш узгоджено ростуть, перестати/забрати — повертаються до попередніх значень.

  • DHT22 дали результат, близький до того, що дає BMP180.
  • Виміри обох DHT22 близькі між собою.
  • Обидва DHT11 дають дещо нижчі результати. При тому, вимір "нормального" на півградуса вищі від того, що сильно завищує вологість. (Звідки взялося півградуса? Згідно графіку, вимір стрибає на градус туди-сюди. Але мінімальна зміна, яку здатен виразити DHT11 — 1 градус. Тому, якщо виміряне значення було десь посередині між 22С і 23С, повернене ним число і мало б так стрибати).
  • На жаль, не маю незалежних вимірів температури в кімнаті, але покази приладів точно залишалися стабільними.
  • Один DHT11 таки показує дурниці. Ймовірно — контактував із водою. При тому, виміри стрибають — це явно не похибка дискретизації.
  • Решта приладів дають схожі виміри, стабільність яких є високою.
  • Різниця між DHT11 i DHT22 якраз у дискретизації, перший заокруглює виміри до цілого.

Або, якщо дивитися на послідовні звертання до того ж пристрою (DHT22_2 в даному випадку) :

Похибка складає порядку 1 мкс (дані спочатку буферизуються, потім виводяться, тому сам вивід не впливає на часові характеристики).


Источник: indrekis2.blogspot.com