Подключение датчиков DHT11 и DHT22 к Arduino

Хотите отслеживать климат в вашей теплице, создать систему управления хьюмидором или мониторить температуру и влажность для проекта метеостанции? Датчик температуры и влажности DHT11 или DHT22 может идеально подойти для этой задачи!

Эти датчики поставляются готовыми к использованию прямо из коробки — они уже откалиброваны на заводе, поэтому вам не нужно добавлять дополнительные компоненты для их работы. Вам просто нужно выполнить несколько простых проводных соединений с Arduino и добавить базовый код. После этого вы можете сразу начать измерять как температуру, так и относительную влажность.

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

DHT11 и DHT22

DHT11 и DHT22 — два самых популярных датчика в семействе DHTxx. Хотя они выглядят очень похоже и имеют одинаковую распиновку, между ними есть важные различия в возможностях.

DHT22 стоит дороже DHT11, но не зря. DHT22 может измерять температуру от -40°C до +125°C с точностью до половины градуса (±0,5°C). DHT11, с другой стороны, работает только в диапазоне от 0°C до 50°C и может отклоняться до 2 градусов (±2°C).

Что касается измерения влажности (содержания влаги в воздухе), DHT22 может определять от 0% до 100% влажности с точностью 2–5%, тогда как DHT11 измеряет только от 20% до 80% влажности и может отклоняться на 5%.

Вот технические характеристики:

DHT11

DHT22

Рабочее напряжение

3 to 5V

3 to 5V

Макс. рабочий ток

2.5mA max

2.5mA max

Диапазон влажности

20-80% / 5%

0-100% / 2-5%

Диапазон температур

0-50°C / ± 2°C

-40 to 80°C / ± 0.5°C

Частота выборки

1 Hz (одно считывание в секунду)

0.5 Hz (одно считывание каждые 2 секунды)

Размер корпуса

15.5mm x 12mm x 5.5mm

15.1mm x 25mm x 7.7mm

Преимущество

Очень низкая стоимость

Более высокая точность

Несмотря на то что DHT22 явно более точный и работает в более экстремальных условиях, DHT11 имеет три больших преимущества: он дешевле, меньше по размеру и может выполнять измерения чаще. DHT11 может давать новое показание каждую секунду (частота выборки 1 Гц), а DHT22 обновляется только каждые две секунды (частота выборки 0,5 Гц).

Несмотря на эти различия, оба датчика работают с одинаковым напряжением (от 3 до 5 вольт) и потребляют максимум 2,5 мА тока при измерении. Пожалуй, лучшее в этих датчиках — это то, что вы можете легко менять их местами в ваших проектах без изменения проводки! Вам нужно внести небольшие изменения в код, но в остальном замена одного на другой очень проста!

DHT11 Fritzing DHT22 Fritzing

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

Если вы откроете датчик DHT11 или DHT22, сняв его корпус, вы обнаружите внутри два основных компонента: NTC-термистор и ёмкостный элемент для измерения влажности.

Interfacing DHT11 and DHT22 Sensors with Arduino

Часть, отвечающая за измерение влажности, имеет простую, но умную конструкцию. Она состоит из двух металлических электродов со специальным влагопоглощающим материалом (обычно соль или проводящий пластиковый полимер), расположенным между ними. Когда воздух становится более влажным, этот материал поглощает водяной пар из воздуха. По мере поглощения воды он высвобождает крошечные заряженные частицы — ионы. Эти ионы изменяют диэлектрическую постоянную материала (то, как материал реагирует на электричество), что изменяет ёмкость между электродами. Чем влажнее воздух, тем больше изменяется эта ёмкость. Измеряя это изменение, датчик может определить относительную влажность воздуха.

Interfacing DHT11 and DHT22 Sensors with Arduino

Для измерения температуры датчик использует NTC-термистор. Термистор — это, по сути, особый тип резистора, сопротивление которого значительно изменяется при изменении температуры. Обычные резисторы тоже немного меняют своё сопротивление с температурой, но эти изменения слишком малы, чтобы быть полезными. Термисторы же специально разработаны для больших изменений сопротивления при изменении температуры — часто на 100 Ом и более на каждый градус.

Буквы «NTC» в NTC-термисторе означают «Negative Temperature Coefficient» (отрицательный температурный коэффициент). Это значит, что при повышении температуры сопротивление уменьшается.

Interfacing DHT11 and DHT22 Sensors with Arduino

Датчик также содержит крошечный чип (или ASIC — специализированную интегральную схему, если вы предпочитаете технический термин). Этот маленький, но мощный чип выполняет несколько важных задач: он измеряет сигналы от компонентов влажности и температуры, применяет калибровочные настройки (которые помогают сделать показания точными), преобразует аналоговые электрические сигналы в цифровые данные и, наконец, выдаёт цифровой сигнал, который ваш микроконтроллер может понять.

Распиновка DHT11 и DHT22

Датчики DHT11 и DHT22 имеют похожую распиновку и обычно поставляются с четырьмя выводами:

Interfacing DHT11 and DHT22 Sensors with Arduino

Вывод VCC подаёт питание на датчик. Хотя эти датчики могут работать с напряжением от 3,3 В до 5,5 В, лучше по возможности использовать 5 В. При питании 5 В вы можете разместить датчик на расстоянии до 20 метров (около 65 футов) от микроконтроллера. При использовании 3,3 В держите датчик в пределах 1 метра (около 3 футов) от микроконтроллера. Это важно, потому что длинные провода могут вызвать падение напряжения, что может сделать показания температуры и влажности менее точными.

Вывод Data выдаёт цифровой сигнал с информацией о температуре и влажности. Чтобы связь работала правильно, обычно нужно добавить подтягивающий резистор 10 кОм между этим выводом и выводом VCC. Этот резистор обеспечивает правильные уровни сигнала.

Вывод NC означает «Not Connected» (не подключён). Как следует из названия, этот вывод ни к чему не подключается, и в вашем проекте его можно оставить свободным.

GND — это вывод заземления.

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

Теперь пришло время подключить датчик к Arduino!

Подключение датчика DHT11 или DHT22 к Arduino простое и понятное. Эти датчики имеют довольно длинные выводы с расстоянием 0,1 дюйма между ними, что делает их идеальными для установки непосредственно в любую стандартную макетную плату. И поскольку DHT11 и DHT22 имеют одинаковое расположение выводов, вы можете следовать тем же шагам независимо от того, какой датчик используете.

Сначала подключите вывод VCC датчика к выходу 5V на Arduino. Затем подключите вывод GND (земля) датчика к любому выводу заземления на Arduino. Далее подключите вывод Data к цифровому выводу #8 на Arduino — это вывод, который будет принимать всю информацию о температуре и влажности. Чтобы сигнал данных был сильным и чистым, нужно добавить подтягивающий резистор 10 кОм между выводом Data и выводом VCC. Однако, если вы приобрели модуль на плате, вы можете пропустить добавление этого резистора, так как он уже встроен.

Вот краткая справочная таблица подключений:

DHTxxArduinoNotes
VCC5V
GNDGND
Data8pulled up by 10kΩ

На изображении ниже показано, как подключить DHT11:

Interfacing DHT11 and DHT22 Sensors with Arduino

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

А вот как подключить DHT22:

Interfacing DHT11 and DHT22 Sensors with Arduino

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

После выполнения всех подключений вы готовы загрузить код и начать измерять температуру и влажность!

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

Датчики DHTxx используют уникальный однопроводной протокол связи для передачи данных о температуре и влажности. Хотя этот протокол не является стандартным, он похож на `протокол Dallas 1-Wire `_ и в значительной степени зависит от очень точной синхронизации.

Хорошая новость в том, что вам не нужно разбираться во всех технических деталях работы этого протокола! Существует полезная библиотека `DHTlib `_, которая берёт на себя почти всё.

Для установки библиотеки:

  1. Сначала откройте вашу программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.

  2. Введите «dhtlib» в поле поиска для фильтрации результатов.

  3. Найдите библиотеку «DHTlib», созданную Rob Tillaart.

  4. Нажмите кнопку Install, чтобы добавить её в вашу Arduino IDE.

Interfacing DHT11 and DHT22 Sensors with Arduino

Пример Arduino 1 — Отображение показаний в мониторе последовательного порта

После установки библиотеки скопируйте и вставьте этот скетч в Arduino IDE.

Этот тестовый скетч выведет значения температуры и относительной влажности в монитор последовательного порта. Попробуйте его, а затем мы вместе разберём, как он работает.

#include <dht.h>
#define dataPin 8  // Defines pin number to which the sensor is connected
dht DHT;           // Creates a DHT object

void setup() {
  Serial.begin(9600);
}
void loop() {
  //Uncomment whatever type you're using!
  int readData = DHT.read22(dataPin); // DHT22/AM2302
  //int readData = DHT.read11(dataPin);  // DHT11

  float t = DHT.temperature;  // Gets the values of the temperature
  float h = DHT.humidity;     // Gets the values of the humidity

  // Printing the results on the serial monitor
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" °C | ");
  Serial.print((t * 9.0) / 5.0 + 32.0);  //print the temperature in Fahrenheit
  Serial.println(" °F ");
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.println(" % ");
  Serial.println("");

  delay(2000);  // Delays 2 secods
}

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

Interfacing DHT11 and DHT22 Sensors with Arduino

Объяснение кода:

Давайте разберём, как работает эта программа, шаг за шагом:

Сначала мы подключаем библиотеку DHT, которая предоставляет команды для связи с датчиком DHT. Затем мы определяем, к какому выводу Arduino подключён провод данных датчика (в данном случае вывод 8), и создаём объект DHT, который представляет наш датчик в коде.

#include <dht.h>
#define dataPin 8 // Defines pin number to which the sensor is connected
dht DHT;          // Creates a DHT object

В разделе setup мы запускаем последовательную связь на скорости 9600 бод. Это позволяет Arduino отправлять информацию на компьютер, чтобы вы могли видеть показания.

void setup() {
  Serial.begin(9600);
}

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

//Uncomment whatever type you're using!
int readData = DHT.read22(dataPin); // DHT22/AM2302
//int readData = DHT.read11(dataPin); // DHT11

После считывания данных значения влажности и температуры извлекаются из объекта DHT с помощью оператора точки ..

float t = DHT.temperature; // Gets the values of the temperature
float h = DHT.humidity;    // Gets the values of the humidity

Затем мы выводим эти значения в монитор последовательного порта в удобном формате, показывая температуру как в градусах Цельсия, так и в Фаренгейта.

Serial.print("Temperature = ");
Serial.print(t);
Serial.print(" °C | ");
Serial.print((t * 9.0) / 5.0 + 32.0); //print the temperature in Fahrenheit
Serial.println(" °F ");
Serial.print("Humidity = ");
Serial.print(h);
Serial.println(" % ");
Serial.println("");

Температура от датчика по умолчанию приходит в градусах Цельсия (°C), но программа также преобразует её в Фаренгейт по формуле:

T(°F) = T(°C) × 9/5 + 32

//print the temperature in Fahrenheit
Serial.print((t * 9.0) / 5.0 + 32.0);

Наконец, мы ждём 2 секунды перед следующим считыванием. Эта задержка важна, так как датчику нужно время между считываниями для получения точных результатов.

delay(2000);

Пример Arduino 2 — Отображение показаний на LCD

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

И что может быть лучше для этого, чем символьный LCD-дисплей 16×2? Давайте посмотрим, как подключить к Arduino и LCD, и датчик DHT.

Вот как будет выглядеть итоговый вывод на LCD:

Interfacing DHT11 and DHT22 Sensors with Arduino

Если вы ранее не работали с символьными LCD-дисплеями 16×2, вам может пригодиться это полезное руководство:

Подключение символьного ЖК-дисплея 16×2 к Arduino
Подключение символьного ЖК-дисплея 16×2 к Arduino

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

Теперь подключим LCD к Arduino, как показано на этой схеме:

Interfacing DHT11 and DHT22 Sensors with Arduino

Схема подключения DHT11 и символьного LCD 16×2 к Arduino UNO

Interfacing DHT11 and DHT22 Sensors with Arduino

Схема подключения DHT22 и символьного LCD 16×2 к Arduino UNO

Код Arduino

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

#include <LiquidCrystal.h>  // includes the LiquidCrystal Library
#include <dht.h>

#define dataPin 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
dht DHT;
bool showcelciusorfarenheit = false;

void setup() {
  lcd.begin(16, 2);  // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
}

void loop() {
  int readData = DHT.read22(dataPin);
  float t = DHT.temperature;
  float h = DHT.humidity;
  lcd.setCursor(0, 0);   // Sets the location at which subsequent text written to the LCD will be displayed
  lcd.print("Temp.: ");  // Prints string "Temp." on the LCD

  //Print temperature value in Celcius and Fahrenheit every alternate cycle
  if (showcelciusorfarenheit) {
    lcd.print(t);  // Prints the temperature value from the sensor
    lcd.print(" ");
    lcd.print((char)223);  //shows degrees character
    lcd.print("C");
    showcelciusorfarenheit = false;
  } else {
    lcd.print((t * 9.0) / 5.0 + 32.0);  // print the temperature in Fahrenheit
    lcd.print(" ");
    lcd.print((char)223);  //shows degrees character
    lcd.print("F");
    showcelciusorfarenheit = true;
  }

  lcd.setCursor(0, 1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");
  delay(5000);
}