ELECTRONICS

DHT22 и Arduino: схема подключения, библиотека и рабочий скетч

Датчики температуры и влажностиСкетч проверен компиляцией

DHT22 меряет сразу две величины: температуру от минус сорока до восьмидесяти градусов и относительную влажность от нуля до ста процентов. Внутри белого пластикового корпуса стоит ёмкостный датчик влажности, термистор и маленький контроллер, который сам оцифровывает показания.

Отдавать данные датчик умеет только по своему собственному протоколу — одним проводом, длинными и короткими импульсами. Разбирать эти импульсы вручную незачем, за вас это сделает библиотека. От вас требуются три провода и одна строчка кода.

Схема подключения

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
VCCПитание. 3,3 или 5 В — датчик всеяден.
DATAДанные. Любой цифровой пин, в примере седьмой.
NCНе подключён. У голого датчика этот вывод просто не используется.
GNDЗемля.

Характеристики

Диапазон температуры
−40…+80 °C
Точность температуры
±0,5 °C
Диапазон влажности
0–100 %
Точность влажности
±2–5 %
Период опроса
не чаще одного раза в 2 секунды
Питание
3,3–6 В

Нужен ли резистор

Между проводом данных и питанием ставят подтягивающий резистор на 4,7 или 10 килоом. На модулях с готовой платой он уже впаян — посмотрите, есть ли рядом с датчиком маленький чёрный прямоугольник. Если у вас голый датчик на четыре ноги, резистор нужен обязательно, иначе линия останется в неопределённом состоянии и библиотека будет возвращать ошибку чтения.

Библиотека

DHT sensor libraryСтавится через менеджер библиотек Arduino IDE, автор Adafruit. Вместе с ней попросит установить Adafruit Unified Sensor — соглашайтесь, без неё не соберётся.

Готовый скетч

#include <DHT.h>

#define DHTPIN 7        // провод данных на пин 7
#define DHTTYPE DHT22   // именно DHT22, а не DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  delay(2000);        // датчику нужно 2 секунды между замерами

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // проверяем, что данные вообще пришли
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Датчик не отвечает");
    return;
  }

  Serial.print("Влажность: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("Температура: ");
  Serial.print(temperature);
  Serial.println(" C");
}

Скетч собирается arduino-cli под Arduino UNO

Проверка на isnan — не перестраховка. Если провод отошёл или вы опрашиваете датчик слишком часто, придёт «не число», и без проверки вы увидите в мониторе порта странные значения вместо честной ошибки.

Частые ошибки

В мониторе порта одни ошибки чтения

Три причины по убыванию частоты: нет подтягивающего резистора, опрос чаще чем раз в две секунды, перепутаны питание и данные. Проверяйте в этом порядке.

Указан DHT11 вместо DHT22

Датчики похожи, но протокол разный: DHT11 голубой и грубее, DHT22 белый и точнее. Если в строке DHTTYPE стоит не та модель, библиотека соберётся, но данные будут мусорные.

Влажность всегда показывает сто процентов

Обычно это конденсат внутри корпуса — датчик полежал в холоде или рядом кипел чайник. Дайте ему высохнуть несколько часов при комнатной температуре.

Показания температуры завышены на два-три градуса

Датчик греется от собственной платы, особенно если модуль стоит вплотную к Arduino. Отнесите его на проводах подальше от платы и любых греющихся деталей.

Что понадобится