ELECTRONICS

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

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

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

Датчик бывает голым, на четыре ножки, и на плате-модуле с тремя. У модуля подтягивающий резистор уже стоит; у голого его надо добавить — 10 кОм между DATA и питанием.

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

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

Распиновка

ПроводКуда и зачем
VCC3,3–5,5 В.
DATAСигнал на любой цифровой вывод. Подтяжка 10 кОм к VCC.
NCНе подключается. У модулей на три вывода этой ножки нет.
GNDЗемля.

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

Температура
0…+50 °C, ±2 °C
Влажность
20–90 %, ±5 %
Частота опроса
не чаще раза в секунду
Питание
3–5,5 В
Ток
до 2,5 мА при замере
Интерфейс
однопроводный, свой протокол

DHT11 или DHT22

Корпус и подключение у них одинаковые, библиотека одна, различается одна строка в коде. DHT22 меряет от −40 до +80 с точностью в полградуса и влажность 0–100 % с точностью 2 %, отвечает раз в две секунды. Стоит вдвое-втрое дороже.

Для комнатного термометра и «включить вентилятор при 28 градусах» DHT11 достаточно. Для теплицы, инкубатора, улицы зимой — только DHT22.

Библиотека

DHT sensor library (Adafruit)Тянет Adafruit Unified Sensor. В строке DHT dht(PIN, DHT11) тип меняется на DHT22 при замене датчика.

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

#include <DHT.h>

const int DHT_PIN = 2;
DHT dht(DHT_PIN, DHT11);          // для DHT22 — просто DHT22

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

void loop() {
  delay(2000);                    // DHT11 не любит частых опросов
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Ошибка чтения — проверьте провод и подтяжку");
    return;
  }
  Serial.print("Температура: ");
  Serial.print(t, 0);
  Serial.print(" °C   Влажность: ");
  Serial.print(h, 0);
  Serial.println(" %");
}

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

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

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

Читается nan

Нет подтягивающего резистора на голом датчике или перепутаны ножки. Нумерация слева направо при решётке к себе: VCC, DATA, NC, GND.

Показания не меняются

Опрос чаще раза в секунду — датчик отдаёт прошлое значение. delay между чтениями не меньше 1000, а лучше 2000.

Температура на два градуса выше комнатной

Это его точность, плюс нагрев от платы рядом. Отнесите датчик на проводах от Arduino.

Влажность 95 % в сухой комнате

Датчик отсырел при хранении. Сутки на батарее приводят его в чувство; если нет — брак, они бывают.

Не работает на длинном проводе

Однопроводный протокол чувствителен к длине. До пяти метров — уменьшите подтяжку до 4,7 кОм; дальше — датчик с I2C, например AHT20.

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