Полное руководство по датчику температуры и влажности DHT11/DHT22 с Arduino

Эта статья является руководством по популярным датчикам температуры и влажности DHT11 и DHT22 с Arduino. Мы объясним, как они работают, покажем некоторые их характеристики и поделимся примером проекта для Arduino, который вы можете модифицировать для использования в своих проектах.

DHT11 DHT22 датчик температуры и влажности с Arduino

Другие руководства по популярным датчикам смотрите в нашей подборке из более чем 60 проектов и руководств по Arduino: 60+ проектов и руководств по Arduino.

Знакомство с датчиками DHT11 и DHT22

Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди мейкеров и любителей электроники.

Датчик температуры и влажности DHT11/DHT22 с Arduino IDE

Эти датчики содержат микросхему, которая выполняет аналого-цифровое преобразование и выдает цифровой сигнал с данными о температуре и влажности. Это делает их очень простыми в использовании с любым микроконтроллером.

Внутреннее устройство датчика влажности

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 секунды

Цена

от $1 до $5

от $4 до $10

Где купить

Проверить цены

Проверить цены

Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и вы можете запрашивать показания только с интервалом в 2 секунды.

Датчик DHT11 имеет меньший диапазон и менее точен. Однако вы можете запрашивать показания датчика каждую секунду. Он также немного дешевле.

Несмотря на различия, они работают одинаково, и вы можете использовать один и тот же код для чтения температуры и влажности. Вам просто нужно выбрать в коде тип датчика, который вы используете.

Распиновка DHT

Датчики DHT имеют четыре контакта, как показано на следующем рисунке. Однако, если вы приобрели датчик DHT на отладочной плате, он поставляется только с тремя контактами и с внутренним подтягивающим резистором на контакте 2.

Распиновка датчика температуры и влажности DHT22 для Arduino IDE

В следующей таблице показана распиновка DHT22 и DHT11. Когда датчик обращен к вам, нумерация контактов начинается с 1 слева направо:

Контакт DHT

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

1

5V

2

Любой цифровой GPIO; также подключите подтягивающий резистор 10 кОм

3

Не подключать

4

GND

Где купить?

Вы можете посетить страницу Maker Advisor Tools и найти лучшую цену на эти модули:

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

В этом разделе мы создадим простой проект с Arduino, который считывает температуру и влажность и отображает результаты в мониторе последовательного порта (Serial Monitor).

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Следуйте приведенной ниже схеме для подключения датчика температуры и влажности DHT11 (или DHT22) к Arduino.

Схема подключения Arduino с датчиком DHT11

Вот подключения (слева направо):

Контакт DHT

Arduino

Контакт 1

5V

Контакт 2

D2 или любой другой цифровой пин

Контакт 3

не подключать

Контакт 4

GND

Примечание

Если вы используете модуль с датчиком DHT, он обычно поставляется только с тремя контактами. Контакты должны быть подписаны, чтобы вы знали, как их подключить. Кроме того, многие из этих модулей уже имеют встроенный подтягивающий резистор, поэтому вам не нужно добавлять его в схему.

Установка библиотек

Для чтения данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для использования этой библиотеки вам также необходимо установить библиотеку Adafruit Unified Sensor. Выполните следующие шаги для установки этих библиотек.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.

Установка библиотеки Adafruit DHT

После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз до конца, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor driver

После установки библиотек перезапустите Arduino IDE.

Код

После установки необходимых библиотек вы можете загрузить пример кода из библиотеки.

В Arduino IDE перейдите в File > Examples > DHT Sensor library > DHTtester

Следующий код должен загрузиться. Он считывает температуру и влажность и отображает результаты в мониторе последовательного порта.

// 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:

#include "DHT.h"

Затем вы определяете пин, к которому подключен датчик DHT. В данном случае он подключен к цифровому пину 2.

#define DHTPIN 2 // what digital pin we're connected to

Далее вам нужно определить тип используемого датчика DHT. В нашем примере мы используем DHT11.

#define DHTTYPE DHT11 // DHT 11

Если вы используете другой датчик DHT, вам нужно закомментировать предыдущую строку и раскомментировать одну из следующих:

//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

Затем инициализируйте объект DHT с именем dht с пином и типом, которые вы определили ранее:

DHT dht(DHTPIN, DHTTYPE);

В setup() инициализируйте монитор последовательного порта на скорости 9600 бод для отладки.

Serial.begin(9600);
Serial.println("DHTxx test!");

Инициализируйте датчик DHT с помощью метода .begin().

dht.begin();

В loop() в начале есть задержка в 2 секунды. Эта задержка необходима, чтобы дать датчику достаточно времени для выполнения измерений. Максимальная частота опроса составляет две секунды для DHT22 и одну секунду для DHT11.

delay(2000);

Чтение температуры и влажности очень просто. Чтобы получить влажность, вам просто нужно использовать метод readHumidity() для объекта dht. В данном случае мы сохраняем влажность в переменной h. Обратите внимание, что метод readHumidity() возвращает значение типа float.

float h = dht.readHumidity();

Аналогично, для чтения температуры используйте метод readTemperature().

float t = dht.readTemperature();

Чтобы получить температуру в градусах Фаренгейта, просто передайте true в метод readTemperature() следующим образом:

float f = dht.readTemperature(true);

Эта библиотека также содержит методы для вычисления индекса жары (heat index) в градусах Фаренгейта и Цельсия:

// 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);

Наконец, все показания отображаются в мониторе последовательного порта.

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 бод. Вы должны получать показания датчика каждые две секунды. Вот что вы должны увидеть в мониторе последовательного порта Arduino IDE.

Показания датчика DHT в мониторе последовательного порта Arduino

Устранение неполадок – Failed to read from DHT sensor

Если вы пытаетесь прочитать температуру и влажность с датчика DHT11/DHT22 и получаете сообщение об ошибке в мониторе последовательного порта, выполните следующие шаги, чтобы попытаться заставить датчик работать (или прочитайте специальное руководство по устранению неполадок DHT).

«Failed to read from DHT sensor!» или показания Nan

Если ваш датчик DHT возвращает сообщение об ошибке «Failed to read from DHT sensor!» или показания DHT возвращают «Nan»:

Устранение неполадок DHT11 DHT22 AM2302 AM2301 Failed to read from DHT sensor! или Nan

Попробуйте один из следующих советов по устранению неполадок:

  • Проводка: при создании электронного проекта необходимо дважды проверить проводку или назначение контактов. После проверки и тестирования правильности подключения вашей схемы, если она по-прежнему не работает, продолжайте читать следующие советы по устранению неполадок.

  • Питание: датчик DHT имеет рабочий диапазон от 3 до 5.5 В (DHT11) или от 3 до 6 В (DHT22). Если вы питаете датчик от контакта 3.3 В, в некоторых случаях питание DHT от 5 В решает проблему.

  • Плохой USB-порт или USB-кабель: иногда питания от USB-порта ПК напрямую недостаточно для Arduino. Попробуйте подключить его к USB-хабу с внешним источником питания. Также может помочь замена USB-кабеля на более качественный или короткий. Наличие USB-порта, обеспечивающего достаточное питание, или использование хорошего USB-кабеля часто решает эту проблему.

  • Источник питания: как упоминалось в предыдущем совете, ваш Arduino может не обеспечивать достаточное питание для правильного чтения данных с датчика DHT. В некоторых случаях вам может потребоваться питать Arduino от источника питания, обеспечивающего больший ток.

  • Тип датчика: дважды проверьте, что вы раскомментировали/закомментировали в коде правильный датчик для вашего проекта. В этом проекте мы использовали DHT22:

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
  • Частота опроса: датчик DHT работает очень медленно при получении показаний (считывание показаний датчика может занять до 2 секунд). В некоторых случаях увеличение времени между считываниями решает проблему.

  • Датчик DHT вышел из строя или сломан: к сожалению, эти дешевые датчики иногда выглядят совершенно нормально, но они сгорели/сломаны. Поэтому, даже если вы собрали правильную схему и код, чтение показаний все равно будет неудачным. Попробуйте использовать другой датчик, чтобы проверить, решит ли это вашу проблему.

  • Неправильная скорость передачи или ошибка загрузки кода: если вы ничего не видите в мониторе последовательного порта Arduino IDE, дважды проверьте, что вы выбрали правильную скорость передачи данных (бод), COM-порт или что вы успешно загрузили код.

При создании наших проектов мы сталкивались с подобными проблемами с DHT, и они всегда решались одним из описанных выше методов.

Fatal error: Adafruit_Sensor.h: No such file or directory

Также существует распространенная ошибка, которая возникает при попытке скомпилировать код. Если вы получите следующую ошибку:

fatal error: Adafruit_Sensor.h: No such file or directory
#include <Adafruit_Sensor.h>

Вам необходимо установить библиотеку Adafruit Unified Sensor driver. В вашей Arduino IDE введите в поле поиска «Adafruit Unified Sensor», прокрутите вниз до конца, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor driver

После установки библиотеки перезапустите Arduino IDE, и код должен скомпилироваться без сообщения об ошибке.

Заключение

Датчики DHT11 и DHT22 обеспечивают простой и недорогой способ получения измерений температуры и влажности с помощью Arduino. Подключение очень простое – вам просто нужно подключить контакт данных DHT к цифровому контакту Arduino.

Написание кода для получения температуры и влажности также просто благодаря библиотеке DHT. Получение показаний температуры и влажности так же просто, как использование методов readTemperature() и readHumidity().

Надеемся, что это руководство было для вас полезным. Другие руководства с датчиком температуры и влажности DHT11/DHT22:

Если вам нравится Arduino, вам также могут понравиться следующие ресурсы:

Спасибо за чтение.