DHT22: подключение к Arduino — схема, библиотека DHT, код с примером
DHT22, он же AM2302, это датчик температуры и влажности в перфорированной пластиковой коробочке. В два раза дороже DHT11, и разница не за бренд: диапазон −40…+80 °C, точность ±0,5 °C и десятые доли градуса в показаниях вместо целых. Метеостанция на подоконнике, контроль климата в теплице, инкубатор, термостат тёплого пола: везде, где «примерно плюс-минус два градуса» не годится, берут именно его.
Ниже распиновка, схема на три провода, скетч на библиотеке DHT и таблица отличий от DHT11, чтобы вы платили больше осознанно. Код можно запустить без железа в симуляторе: виртуальный DHT отзывается так же, как настоящий, а карта остальных сенсоров в справочнике датчиков.
Отдельные разделы ниже отвечают на вопросы, которые возникают после первой установки: почему влажность застревает на 99 процентах, что делать с конденсатом внутри корпуса, какие показания датчику нельзя доверять вообще и как проверить модуль по семи шагам.
Распиновка DHT22: четыре пина, один лишний
| Пин | Название | Куда подключать |
|---|---|---|
| 1 | VCC | Питание 3.3–5.5 В, на пин 5V Arduino |
| 2 | DATA | Данные на любой цифровой пин, в примерах обычно D2 |
| 3 | NC | Не подключён никуда: оставьте висеть в воздухе |
| 4 | GND | Земля на GND Arduino |
Схема подключения к Arduino
- VCC на 5V: сенсор живёт и от 3.3 В, это режим для ESP32, но тогда и подтяжку ставьте на 3.3 В
- DATA на D2: годится любой цифровой пин, D2 это просто привычка из примеров
- GND на GND: земля общая с Arduino
- Провода до 1 м любой шлейф, длиннее только экранированный кабель, почему в разделе граблей ниже
Библиотека DHT и скетч
Arduino из коробки не разговаривает с DHT: протокол однопроводной, с микросекундными таймингами, и повторять его руками незачем. Ставьте из менеджера библиотек «DHT sensor library» от Adafruit, она подтянет зависимость «Adafruit Unified Sensor». Дальше вся работа умещается в три вызова.
#include <DHT.h> #define DHTPIN 2 // DATA сенсора#define DHTTYPE DHT22 // именно DHT22: константа задаёт протокол DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); // старт сенсора} void loop() { float t = dht.readTemperature(); // температура float h = dht.readHumidity(); // влажность if (isnan(t) || isnan(h)) { // nan = сенсор не ответил Serial.println("Ne chitaetsya"); delay(2000); return; } Serial.print("T: "); Serial.print(t); Serial.print(" C H: "); Serial.print(h); Serial.println(" %"); delay(2000); // даташит: не чаще раза в 2 с}Обратите внимание на проверку isnan: она ловит неудачное чтение и не даёт вывести «nan» в данные. Ещё одна деталь, о которой забывают: datasheet требует секунду прогрева после подачи питания, и первое чтение сразу после включения может быть недостоверным. Практически это означает, что в setup() стоит поставить задержку, а в рабочем коде не использовать самое первое значение без проверки.
DHT11 vs DHT22: за что платим вдвое больше
| Параметр | DHT11 | DHT22 (AM2302) |
|---|---|---|
| Диапазон температур | 0…+50 °C | −40…+80 °C |
| Точность по температуре | ±2 °C | ±0.5 °C |
| Влажность | 20–80 %, точность ±5 % | 0–100 %, точность ±2–5 % |
| Шаг показаний | 1 °C и 1 % | 0.1 °C и 0.1 % |
| Минимальный интервал опроса | 1 с | 2 с |
| Питание | 3–5.5 В | 3.3–5.5 В |
| Ток в момент измерения | около 0.3 мА | 1–1.5 мА |
| Ориентир цены | 100–150 руб. | 200–300 руб. |
Практическое правило: DHT11 для учебных скетчей и задачи «показать цифру», DHT22 для всего, что будет жить в реальном мире. Уличную температуру зимой DHT11 не измерит в принципе, ниже нуля он вне диапазона. А на порогах и разнице показаний построен целый приём: термостат с гистерезисом, и чем точнее датчик, тем реже щёлкает реле.
Частые грабли
Тупик: влажность застряла на 99 процентах
Показания были такими: температура меняется разумно, а влажность постоянно 99 или 100 процентов и не двигается, сколько бы мы ни проветривали комнату. Мы грешили на сам датчик, меняли модуль на заведомо рабочий, переставляли провода и в какой-то момент решили, что в комнате просто очень влажно.
Дело оказалось в подтягивающем резисторе: он оказался слишком большого номинала, и линия данных не поднималась до полного уровня логической единицы. Датчик при этом отвечал, поэтому библиотека возвращала не nan, а вполне правдоподобное значение, просто неверное. Мы заменили резистор на 4,7 кОм, и показания сразу стали живыми. Второй случай с той же картиной: модуль был установлен рядом со стеной и трубой, и внутри корпуса образовался конденсат, который датчик честно и видел как стопроцентентную влажность. Помогает корпус с вентиляционной щелью или хотя бы свободное пространство вокруг датчика.
Личный опыт: датчик в уличном боксе
Мы ставили DHT22 в герметичный бокс на улице, и показания испортились за несколько дней. Температура ещё кое-как читалась, а влажность показывала 100 процентов постоянно. Вскрыли бокс: внутри корпуса датчика стояла капля воды, а пластиковый фильтр, который защищает чувствительный элемент, её удерживал.
С этого момента правило простое: DHT22 не герметичен, и в закрытом боксе он конденсирует внутри себя влагу из воздуха, что бы вы ни делали. Два рабочих решения. Первое: не запирать датчик в коробку, а оставить его в защищённом от осадков месте с продувом, где воздух свободно ходит. Второе: если коробка всё-таки нужна, ставить датчик в отдельный открытый отсек, а не в общий объём. Отдельно мы выяснили, что DHT22 показывает температуру воздуха рядом с собой, а не температуру платы, и когда модуль стоял прямо над Arduino, показания уползали вверх на пару градусов. Вынос датчика на отдельную ножку решил и это.
Авторская позиция: какой датчик климата взять
Мы советуем начинать с DHT11 только ради экономии: он почти всегда уже есть в наборе, и он прощает ошибки, потому что недорогой и легко заменяемый. Как только в проекте появляется решение, зависящее от показаний, мы переходим на DHT22 или вовсе на BME280.
Причина в том, что DHT11 не умеет ничего, кроме температуры и влажности, и выдаёт их целыми числами с погрешностью в пару градусов. BME280 даёт то же самое плюс атмосферное давление, работает по I2C, не занимает отдельный пин с подтяжкой и заметно лучше ведёт себя на длинных проводах. Для учебного термостата внутри комнаты DHT11 достаточно, для погодной станции на улице мы берём BME280 в защищённом корпусе. Отдельно про DS18B20: он меряет только температуру, зато в герметичном корпусе и с точностью около половины градуса, поэтому в воде или в холодильнике он лучше любого DHT.