Библиотека DHT sensor library
Датчики температуры и влажности 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 В.