DHT11: подключение к ESP32 и Arduino

Цифровой датчик температуры и влажности

Самый дешёвый датчик температуры и влажности: один провод данных, целые градусы и проценты. Подходит для комнатных измерений, где не нужна точность.

Как работает

DHT11 общается по одному проводу: датчик отвечает на стартовый импульс 40 битами — влажность, температура и контрольная сумма. Библиотека DHT скрывает это за двумя вызовами: readTemperature() и readHumidity().

По сравнению с DHT22 датчик грубее: целые градусы (0–50 °C, ±2 °C) и проценты (20–90 %, ±5 %), опрос не чаще раза в секунду. Если нужны отрицательные температуры и десятые доли, берите DHT22.

Выводы

ВыводНазначение
DATAлиния данных, подтяжка к питанию 4,7–10 кОм
VCCпитание 3,3–5,5 В
GNDобщий провод

Подключение к ESP32

DHT11ESP32
DATAGPIO15
VCC3V3
GNDGND

Схема из примера «DHT11: температура и влажность целыми числами».

DHT11: температура и влажность целыми числами

Открыть пример целиком
Код скетча
#include <DHT.h>

// DHT11: целые градусы (0–50 °C) и проценты влажности (20–90 %).
// Точность скромная — около ±2 °C и ±5 %, зато датчик дешёвый.

#define DHTPIN 15
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Отвалившийся провод ошибки не даёт: библиотека возвращает NaN.
  if (isnan(h) || isnan(t)) {
    Serial.println("датчик не ответил");
  } else {
    Serial.printf("%.0f °C   %.0f %%\n", t, h);
  }
  delay(2000);   // DHT11 отвечает не чаще раза в секунду; берём с запасом
}

Подключение к Arduino Uno

DHT11Arduino Uno
DATAD4
VCC5V
GNDGND

Схема из примера «Arduino Uno: датчик DHT11».

Arduino Uno: датчик DHT11

Открыть пример целиком
Код скетча
#include <DHT.h>

// DHT11 на выводе 4. Обмен идёт по одному проводу импульсами разной
// длины, всю работу делает библиотека. Датчик отдаёт целые градусы и
// проценты и опрашивается не чаще раза в секунду.

#define DHTPIN 4
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println(F("датчик не ответил"));
    delay(2000);
    return;
  }

  Serial.print("t:");
  Serial.print(t, 0);
  Serial.print(" h:");
  Serial.println(h, 0);

  delay(2000);
}

В железе

У готового модуля с тремя выводами подтяжка линии данных уже распаяна. У голого датчика с четырьмя выводами подтяжку 4,7–10 кОм между DATA и VCC ставят сами, а третий вывод не используется. Порядок выводов у разных модулей отличается: сверяйтесь с надписью на плате.

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

Другие детали