ELECTRONICS

Библиотека DHT sensor library

менеджер: DHT sensor libraryAdafruitверсия 1.4.7

Датчики температуры и влажности DHT11 и DHT22: два числа за один вызов, без разбора однопроводного протокола.

DHT11 и DHT22 отдают данные по одному проводу своим протоколом с микросекундными импульсами. Библиотека Adafruit разбирает его и возвращает температуру и влажность обычными числами. Вместе с ней менеджер предложит поставить Adafruit Unified Sensor — соглашайтесь, без неё не соберётся.

Датчик медленный: DHT11 нельзя опрашивать чаще раза в секунду, DHT22 — раза в две секунды. Между опросами библиотека отдаёт прошлое значение.

Установка и подключение

В менеджере библиотек ищите DHT sensor library автора Adafruit. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.

#include <DHT.h>

Создание объекта — обычно до setup():

#define DHTPIN 2
#define DHTTYPE DHT22          // или DHT11
DHT dht(DHTPIN, DHTTYPE);
dht.begin();                   // в setup()

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 1.4.7.

begin()
Подготовить вывод. В setup().
readTemperature()
Температура в °C как float. NaN, если датчик не ответил.
readTemperature(true)
То же в °F.
readHumidity()
Влажность в процентах, float. NaN при ошибке.
computeHeatIndex(t, h, false)
«Ощущаемая» температура по температуре и влажности; false — в °C.
read(bool force)
Принудительно опросить датчик, не дожидаясь двух секунд. Возвращает true при удаче.
isnan(value)
Не метод библиотеки, а проверка из math.h: так узнают, что чтение не удалось.

Пример

#include <DHT.h>

#define DHTPIN  2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  delay(2000);                          // DHT22 не отвечает чаще
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Датчик не ответил");
    return;
  }
  Serial.print(t, 1); Serial.print(" C, ");
  Serial.print(h, 0); Serial.println(" %");
}

Проверка на NaN обязательна: при плохом контакте датчик отвечает через раз, и без неё в лог полетят «nan».

На чём попадаются

Всегда NaN

Нет подтягивающего резистора 10 кОм между данными и питанием (у модулей на плате он есть, у голого датчика — нет), либо в DHTTYPE указан не тот датчик.

Не компилируется: Adafruit_Sensor.h not found

Не поставлена зависимость Adafruit Unified Sensor. Ставится через тот же менеджер.

Значения скачут

Слишком частый опрос или длинный провод. Опрашивайте реже, провод короче метра, питание 5 В.

Где используется на сайте

Что дальше