03.04.2013

Температура и влажность (2)

У датчика измерения температуры и влажности DHT-11 (о его возможностях и стыковке с Arduino я подробно писал в предыдущей статье) есть "старший брат", сенсор DHT-22 (часто под этим названием фигурирует AM2302, производимый фирмой AOSONG):



Несколько проигрывая DHT11 по габаритам, этот датчик имеет более широкий диапазон измеряемых величин и обладает большей точностью. Ранние версии даташитов объясняют, что измерением температуры занимается встроенный DS18B20, однако в последних вариантах его заменили на термистор.

Сравнительная таблица из предыдущей статьи должна быть дополнена так:

ПоказательDS18B20DHT11DHT22
Допустимый диапазон t,°C-55..+1250..+50-40..+80
Погрешность измерения t, min±0.5°C@-10..+85°C±2°C@0..+50°C±0.5°C@+15..+55°C
Погрешность измерения t, max±2°C±2°C±1°C
Разрешение шкалы t,°C0.5/0.25/0.125,/0.062510.1
Допустимый диапазон RH, %-20..950..99.9
Погрешность измерения RH, min-±4% +25°C±2% +25°C
Погрешность измерения RH, max-±5%±4%
Разрешение шкалы RH, %-10.1

Точность измерения относительной влажности возрастает для значений меньших 12% и больших 90%, а также имеет некоторый гистерезис. Считывание очередного значения возможно не чаще, чем один раз в 2 секунды. Более подробно можно прочесть в документации: AM2302.pdf.

Подключение DHT22 к Arduino выглядит аналогично DHT11. Пины имеют идентичное назначение, схема подключения не отличается, да и протокол общения с датчиком, по сути, тот же.




Отличия начинаются в трактовке считываемых значений. Мы по-прежнему получаем от сенсора по 40 бит:
  1. Старшая часть значения влажности;
  2. Младшая часть значения влажности;
  3. Старшая часть значения температуры;
  4. Младшая часть значения температуры;
  5. Контрольная сумма.
Значение относительной влажности и температуры выдаются в десятых долях, например: если прочитано 010Dh, то эту цифру надо перевести в десятичный формат (269), а затем разделить на 10 - получится 26,9. И, кстати, отрицательные значения температуры кодируются единицей в старшем разряде считываемого 16-битного значения: 1000 0000 0110 0101 означает -10,1 °C.


Существует несколько вариантов библиотек для Arduino (и вы можете написать свой собственный!), вот наиболее известные:
В примере ниже я использую именно последний вариант, он простой и универсальный (работает не только с DHT22, но и с DHT11).  Архив с библиотекой надо распаковать в каталог sketchbook/libraries и перед загрузкой скетча в Arduino не забыть исправить значение константы DHT22_PIN на номер пина, к которому подключен вывод DATA датчика:

#include <dht.h>

dht DHT;

#define DHT22_PIN 6

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT22, \t");
  int chk = DHT.read22(DHT22_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}


После старта программы надо вызвать окно Serial Monitor-а (Ctrl+Shift+M):



Датчик можно применять в системах вентиляции и кондиционирования, осушителях, климатических камерах, автомобильных поделках, даталоггерах, регуляторах влажности, метеорологических станциях и тому подобном - тут уж как подскажет ваша фантазия. 

Диапазон питания датчика составляет +3.3...+5.5В, поэтому его можно с успехом использовать с трехвольтовыми Arduino и конструировать довольно компактные и малопотребляющие конструкции - например, при помощи Freeduino Pro Mini.  Рекомендуемая длина кабеля, соединяющего DHT22 с MCU при питании от 3.3В не должна превышать 100 см

Ссылки по теме:

2 комментария:

  1. Очень полезные ваши статьи ) нравится
    а не подскажите этот датчик тоже нельзя использовать в одной сети с DS18B20
    может быть если по очереди их опрашивать будет срабатывать ?
    в общем буду пробовать

    ОтветитьУдалить
    Ответы
    1. Да, с DHT-22 та же ситуация, что и с DHT-11 - они не имеют собственного внутреннего уникального идентификатора (как у DS18B20), на подключение каждого такого датчика надо потратить один пин Arduino.

      Удалить