DHT22 (AM2302): подключение к ESP32 и Arduino

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

Температура от −40 до 80 °C и влажность 0–100 % по одному проводу. Медленный, но простой: библиотека делает всю работу, от вас — один вывод и пауза между чтениями.

Как работает

DHT22 передаёт данные по собственному однопроводному протоколу: контроллер опускает линию, датчик отвечает сорока битами — влажность, температура и контрольная сумма. Длительность каждого бита решает, ноль это или единица, поэтому читать протокол руками неудобно — берут библиотеку DHT sensor library (Adafruit): dht.readTemperature() и dht.readHumidity().

DHT11 — младший брат: хуже точность (±2 °C, ±5 %), только положительные температуры, но тот же протокол и та же библиотека.

Выводы

ВыводНазначение
NCне подключается
SDAлиния данных (в документации — DATA); нужна подтяжка 10 кОм к питанию
VCCпитание 3,3–5 В
GNDобщий провод

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

DHT22 (AM2302)ESP32
SDAGPIO15
VCC3V3
GNDGND

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

DHT22: температура и влажность

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

#define DHTPIN 15
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

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

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

  if (isnan(t) || isnan(h)) {
    Serial.println("датчик не ответил");
  } else {
    Serial.printf("%.1f °C   %.1f %%\n", t, h);
  }
  delay(2000);   // чаще DHT22 опрашивать нельзя
}

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

DHT22 (AM2302)Arduino Uno
SDAD4
VCC5V
GNDGND

Схема из примера «Arduino Uno: датчик DHT22 на одном проводе».

Arduino Uno: датчик DHT22 на одном проводе

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

// DHT22 на выводе 4. Шины здесь нет вовсе: обмен идёт по одной линии,
// импульсами разной длины, и всю работу делает библиотека.
//
// Датчик медленный, и это не библиотека тормозит. Внутри он измеряет
// около двух секунд, а между опросами ему нужен покой: спросите чаще —
// получите прошлое значение или NaN. Отсюда delay в конце цикла.
//
// Проверка на NaN обязательна. Отвалившийся провод не даёт ни ошибки,
// ни исключения: возвращается «не число», и любая арифметика с ним
// тихо превращается в бессмыслицу.

#define DHTPIN 4
#define DHTTYPE DHT22

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, 1);
  Serial.print(" h:");
  Serial.println(h, 1);

  delay(2000);
}

В железе

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

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

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