DHT22 и Arduino: схема подключения, библиотека и рабочий скетч
DHT22 меряет сразу две величины: температуру от минус сорока до восьмидесяти градусов и относительную влажность от нуля до ста процентов. Внутри белого пластикового корпуса стоит ёмкостный датчик влажности, термистор и маленький контроллер, который сам оцифровывает показания.
Отдавать данные датчик умеет только по своему собственному протоколу — одним проводом, длинными и короткими импульсами. Разбирать эти импульсы вручную незачем, за вас это сделает библиотека. От вас требуются три провода и одна строчка кода.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VCC | Питание. 3,3 или 5 В — датчик всеяден. |
| DATA | Данные. Любой цифровой пин, в примере седьмой. |
| NC | Не подключён. У голого датчика этот вывод просто не используется. |
| GND | Земля. |
Характеристики
- Диапазон температуры
- −40…+80 °C
- Точность температуры
- ±0,5 °C
- Диапазон влажности
- 0–100 %
- Точность влажности
- ±2–5 %
- Период опроса
- не чаще одного раза в 2 секунды
- Питание
- 3,3–6 В
Нужен ли резистор
Между проводом данных и питанием ставят подтягивающий резистор на 4,7 или 10 килоом. На модулях с готовой платой он уже впаян — посмотрите, есть ли рядом с датчиком маленький чёрный прямоугольник. Если у вас голый датчик на четыре ноги, резистор нужен обязательно, иначе линия останется в неопределённом состоянии и библиотека будет возвращать ошибку чтения.
Библиотека
DHT sensor library— Ставится через менеджер библиотек Arduino IDE, автор Adafruit. Вместе с ней попросит установить Adafruit Unified Sensor — соглашайтесь, без неё не соберётся.
Готовый скетч
#include <DHT.h>
#define DHTPIN 7 // провод данных на пин 7
#define DHTTYPE DHT22 // именно DHT22, а не DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
delay(2000); // датчику нужно 2 секунды между замерами
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// проверяем, что данные вообще пришли
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Датчик не отвечает");
return;
}
Serial.print("Влажность: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Температура: ");
Serial.print(temperature);
Serial.println(" C");
}Скетч собирается arduino-cli под Arduino UNO
Проверка на isnan — не перестраховка. Если провод отошёл или вы опрашиваете датчик слишком часто, придёт «не число», и без проверки вы увидите в мониторе порта странные значения вместо честной ошибки.
Частые ошибки
В мониторе порта одни ошибки чтения
Три причины по убыванию частоты: нет подтягивающего резистора, опрос чаще чем раз в две секунды, перепутаны питание и данные. Проверяйте в этом порядке.
Указан DHT11 вместо DHT22
Датчики похожи, но протокол разный: DHT11 голубой и грубее, DHT22 белый и точнее. Если в строке DHTTYPE стоит не та модель, библиотека соберётся, но данные будут мусорные.
Влажность всегда показывает сто процентов
Обычно это конденсат внутри корпуса — датчик полежал в холоде или рядом кипел чайник. Дайте ему высохнуть несколько часов при комнатной температуре.
Показания температуры завышены на два-три градуса
Датчик греется от собственной платы, особенно если модуль стоит вплотную к Arduino. Отнесите его на проводах подальше от платы и любых греющихся деталей.
Что понадобится
- Датчик DHT22 (AM2302)
- Резистор 4,7 кОм, если датчик без платы
- Arduino UNO
- Провода «папа-мама»