Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они бьют все рекорды по продажам и очень популярны среди любителей электроники.
В этих датчиках находится микросхема, которая выполняет аналого-цифровое преобразование и выдает цифровой сигнал с температурой и влажностью. Это делает их очень простыми в использовании с любым микроконтроллером.
Разница между DHT11 и DHT22
DHT11 и DHT22 очень похожи, но различаются по своим характеристикам. В таблице ниже сравниваются некоторые из наиболее важных характеристик датчиков температуры и влажности DHT11 и DHT22. Для более глубокого анализа этих датчиков смотрите их техническое описание.
DHT11 | DHT22 | |
![]() |
![]() |
|
Диапазон температур | От 0 до 50 ºC +/- 2 ºC | От -40 до 80 ºC +/- 0,5ºC |
Диапазон влажности | От 20 до 90% +/- 5% | От 0 до 100% +/- 2% |
Точность измерения | Влажность: 1% Температура: 1ºC |
Влажность: 0,1% Температура: 0,1ºC |
Диапазон напряжения | 3 — 5,5 В постоянного тока | 3-6 В постоянного тока |
Сила тока | 0,5 — 2,5 мА | 1 — 1,5 мА |
Период обработки данных | 1 секунда | 2 секунды |
Цена | От 55 рублей | От 250 рублей |
Где купить | Посмотреть цену | Посмотреть цену |
Датчик DHT22 имеет большую точность в измерении и более широкий диапазон измерения температуры и влажности. Однако он стоит намного дороже, а запрашивать показания вы сможете только с интервалом в 2 секунды.
Датчик DHT11 имеет меньший диапазон измерений и он менее точен. За то вы можете запрашивать показания датчика каждую секунду. Также он стоит намного дешевле.
Несмотря на их различия, они работают почти одинаково, и значит, вы можете использовать один и тот же код для считывания температуры и влажности. Вам просто нужно вставить в код тип датчика, который вы будете используете.
Распиновка DHT
Датчики DHT имеют четыре контакта, как показано на рисунке ниже. Однако, если вы устанавливаете датчик DHT в коммутационной плате, то вам нужно использовать только три контакта. На контакте 2 нет встроенного резистора.
В следующей таблице показана распиновка DHT22 и DHT11. Если смотреть прямо на датчик, то нумерация контактов начинается слева направо.
1 | 5В |
2 | Любой цифровой GPIO, вывод данных |
3 | Не подключаем |
4 | GND (земля) |
Подключение датчика температуры и влажности DHT11 к Arduino
В этой части статьи мы создадим простой проект на Arduino, который сможет считывать температуру и влажность и отображать результаты на экране монитора с помощью Монитор порта.
Требуемые детали:
Для выполнения этого проекта вам потребуются следующие компоненты:
- Плата Arduino UNO
- Датчик температуры и влажности DHT11
- Макетная плата
- Резистор 4,7 кОм
- Набор проводов
Схема
Следуйте следующей принципиальной схеме, чтобы подключить датчик температуры и влажности DHT11 (или DHT22) к Arduino.
Все соединения (слева направо):
Пины DHT | Ардуино |
Пин 1 | 5В |
Пин 2 | D2 или любой другой цифровой пин |
Пин 3 | Не подключаем |
Пин 4 | GND (земля) |
Если вы используете модуль с датчиком DHT, то он обычно имеет только три контакта. Контакты помечены для их правильного подключения. Кроме того, многие из этих модулей уже оснащены внутренним резистором, поэтому вам не нужно добавлять его в схему. |
Установка библиотек
Для считывания показаний с датчика DHT мы воспользуемся библиотекой DHT от Adafruit. Чтобы использовать эту библиотеку, вам необходимо установить библиотеку Adafruit Unified Sensor. Выполните следующие шаги, чтобы установить эти библиотеки.
Откройте свою Arduino IDE и перейдите в Скетч > Подключить библиотеку > Управлять библиотеками. Должен открыться менеджер библиотеки.
Найдите « DHT » в поле поиска и установите библиотеку DHT от Adafruit.
После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите до конца, чтобы найти библиотеку и установить ее.
После установки библиотек перезапустите программу Arduino IDE.
Код
После установки необходимых библиотек вы можете загрузить пример кода из библиотеки.
Перейдите в Файл > Примеры > Библиотека датчиков DHT > DHTtester.
Должен загрузиться следующий код. Он считывает температуру и влажность и отображает результаты через Монитор порта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Initialize DHT sensor for normal 16mhz Arduino DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index // Must send in temp in Fahrenheit! float hi = dht.computeHeatIndex(f, h); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hi); Serial.println(" *F"); } |
Как работает код
Все начинается с включения DHT библиотеки:
1 |
#include "DHT.h" |
Затем определяем контакт, к которому подключен датчик DHT. В этом случае он подключен к цифровому выводу 2.
1 |
#define DHTPIN 2 // what digital pin we're connected to |
Затем нужно определить тип датчика DHT, который вы используете. В нашем примере мы используем DHT11.
1 |
#define DHTTYPE DHT11 // DHT 11 |
Если вы используете другой датчик DHT, вам нужно прокомментировать предыдущую строку и прокомментировать следующую:
1 2 |
//#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
Затем инициализируйте DHT объект под названием dht, которые вы определили ранее:
1 |
DHT dht(DHTPIN, DHTTYPE); |
В Setup(), инициализируйте Монитор порта на скорости 9600 бод для отладки
1 2 |
erial.begin(9600); Serial.println("DHTxx test!"); |
Инициализируйте датчик DHT с помощью .begin()
1 |
dht.begin(); |
В Loop(), вначале задержка составляет 2 секунды. Эта задержка необходима для того, чтобы датчик мог снять показания. Максимальная частота дискретизации составляет две секунды для DHT22 и одну секунду для DHT11.
1 |
delay(2000); |
Считывать температуру и влажность очень просто. Чтобы получить влажность, вам просто нужно использовать readHumidity () на dht объект. В этом случае мы сохраняем измерение влажности в час. Обратите внимание, что readHumidity () возвращает значение типа float.
1 |
float h = dht.readHumidity(); |
Аналогичным образом, чтобы узнать температуру, используйте readTemperature ()
1 |
float t = dht.readTemperature(); |
В этой библиотеке также есть методы для вычисления индекса тепла в градусах Фаренгейта и Цельсия:
1 2 3 4 |
// Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); |
Наконец, все показания отображаются на экране монитора через Монитор порта.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); |
Что получилось
После загрузки кода в Arduino откройте Монитор порта со скоростью 9600 бод. Вы должны получать показания датчика каждые две секунды. Вот что вы должны увидеть на своем мониторе.
Устранение неполадок
Если вы пытаетесь считать температуру и влажность с датчика DHT11 / DHT22 и получаете сообщение об ошибке, выполните следующие действия, чтобы узнать, сможете ли вы заставить свой датчик работать.
Failed to read from DHT sensor!
Если ваш датчик DHT возвращает сообщение об ошибке «Не удалось считать с датчика DHT!» или показания DHT возвращают «Nan»:
Попробуйте воспользоваться одним из следующих советов по устранению неполадок:
- Провода: когда вы создаете проект, вам необходимо дважды проверить контакты проводов или их назначение. После проверки и тестирования правильности подключения вашей цепи она по-прежнему не работает, продолжайте читать следующие советы по устранению неполадок.
- Питание: датчик DHT имеет рабочий диапазон от 3 В до 5,5 В (DHT11) или от 3 В до 6 В (DHT22). Если вы запитываете датчик от вывода 3,3 В, то в некоторых случаях питание DHT с помощью 5 В решает проблему.
- Не исправен USB-порт или USB-кабель: иногда недостаточно питания Arduino напрямую от USB-порта. Попробуйте подключить его к USB с питанием от внешнего источника питания. Также может помочь замена USB-кабеля на более качественный или более короткий. Наличие USB-порта, обеспечивающего достаточное количество энергии, или использования хорошего USB-кабеля часто решает эту проблему.
- Источник питания: как упоминалось в предыдущем совете, ваш Arduino может не подавать достаточно энергии для правильного считывания данных с датчика DHT. В некоторых случаях вам может потребоваться подключения Arduino к источнику питания, обеспечивающему больший ток.
- Тип датчика: дважды проверьте, что вы прокомментировали в коде нужный датчик. В этом примере мы использовали DHT11:
1 2 3 |
//#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
- Частота дискретизации: датчик DHT очень медленно получает показания (считывание показаний датчика может занять более 2 секунд). В некоторых случаях проблему решает увеличение времени между считыванием.
- Датчик DHT не исправен: к сожалению, эти дешевые датчики иногда выглядят совершенно нормально, но они могут просто не работать. Таким образом, даже если вы собрали правильную схему и написали правильный код, он все равно не сможет получить показания. Попробуйте использовать другой датчик, чтобы посмотреть, решит ли он вашу проблему.
- Неверная скорость передачи данных или не удалось загрузить код: если вы не видите показания на экране, дважды проверьте, что вы выбрали правильную скорость передачи данных.
При создании наших проектов мы сталкивались с аналогичными проблемами с DHT, и они всегда решались одним из методов, описанных ранее.
Fatal error: Adafruit_Sensor.h: No such file or directory
Также существует распространенная ошибка, возникающая при попытке скомпилировать код. Если вы получили следующую ошибку:
1 2 |
fatal error: Adafruit_Sensor.h: No such file or directory #include <Adafruit_Sensor.h> |
То вам необходимо установить библиотеку драйверов Adafruit Unified Sensor. В вашей Arduino IDE введите в поле поиска « Adafruit Unified Sensor», прокрутите до конца, чтобы найти библиотеку и установите ее.
После установки библиотеки перезапустите IDE Arduino, и код должен скомпилироваться без сообщения об ошибке.
Вывод
Датчики DHT11 и DHT22 предоставляют простой и недорогой способ измерения температуры и влажности с помощью Arduino. Подключение очень простое — вам просто нужно подключить контакты от DHT к цифровым выводам Arduino.
Написание кода для получения температуры и влажности также не составит труда благодаря DHTбиблиотеки. И не забудьте использовать методы readTemperature () и readHumidity () .
С Уважением, МониторБанк