Как работают датчики температуры и влажности DHT11 и DHT22, и их взаимодействие с Arduino

Добавлено 25 октября 2019 в 06:18

Датчики температуры и влажности DHT11 и DHT22/AM2302 от AOSONG довольно просты в использовании, недорогие и отлично подходят для любителей! Эти датчики предварительно откалиброваны и не требуют дополнительных компонентов, поэтому вы можете сразу начать измерение температуры и относительной влажности.

Как работают датчики температуры и влажности DHT11 и DHT22, и их взаимодействие с Arduino
Рисунок 1 – Как работают датчики температуры и влажности DHT11 и DHT22, и их взаимодействие с Arduino

Одна из важнейших функций, которую они предоставляют, заключается в том, что температура и влажность измеряются с точностью до десятых долей; то есть до одного десятичного знака. Единственным недостатком этого датчика является то, что вы можете получать с него новые данные с периодичностью только раз в одну или две секунды. Но, учитывая его производительность и цену, вы не можете жаловаться.

DHT11 против DHT22/AM2302

У нас есть две версии серии датчиков DHTxx. Они выглядят немного похоже и имеют одинаковую распиновку, но имеют разные характеристики. Вот подробности.

DHT22 является более дорогой версией, которая, очевидно, имеет лучшие характеристики. Диапазон измерения температуры составляет от -40°C до +80°C с точностью ±0,5 градуса, а диапазон температур DHT11 составляет от 0°C до 50°C с точностью ±2 градуса. Также датчик DHT22 имеет более широкий диапазон измерения влажности, от 0 до 100% с точностью 2-5%, в то время как диапазон измерения влажности DHT11 составляет от 20 до 80% с точностью 5%.

Сравнение спецификаций DHT11 и DHT22/AM2302
 DHT11DHT22
 DHT11DHT22
Рабочее напряжениеот 3 до 5 Вот 3 до 5 В
Максимальный рабочий ток2,5 мА макс2,5 мА макс
Диапазон измерения влажности20-80% / 5%0-100% / 2-5%
Диапазон измерения температуры0-50°C / ± 2°Cот -40 до 80°C / ± 0,5°C
Частота выборки1 Гц (чтение каждую секунду)0,5 Гц (чтение каждые 2 секунды)
Размер корпуса15,5 мм х 12 мм х 5,5 мм15,1 мм х 25 мм х 7,7 мм
ПреимуществоУльтра низкая стоимостьБолее точный

Хотя DHT22/AM2302 более точен и работает в большем диапазоне температур и влажности; есть три вещи, в которых DHT11 сильно превосходит DHT22. Он более дешевый, меньше по размеру и имеет более высокую частоту выборки. Частота выборки DHT11 составляет 1 Гц, то есть одно чтение каждую секунду, в то время как частота выборки DHT22 составляет 0,5 Гц, то есть одно чтение каждые две секунды.

Рабочее напряжение обоих датчиков составляет от 3 до 5 вольт, в то время как максимальный ток, используемый во время преобразования (при запросе данных), составляет 2,5 мА. И самое приятное, что датчики DHT11 и DHT22/AM2302 являются «взаимозаменяемыми», то есть, если вы создаете свой проект с одним датчиком, вы можете просто отключить его и использовать другой датчик. Ваш код, возможно, придется немного изменить, но, по крайней мере, схема не изменится!

Для получения более подробной информации обратитесь к техническим описаниям датчиков DHT11 и DHT22/AM2302.

Обзор аппаратного обеспечения

Теперь давайте перейдем к более интересным вещам. Давайте разберем оба датчика DHT11 и DHT22/AM2302 и посмотрим, что внутри.

Корпус состоит из двух частей, поэтому для его вскрытия достаточно просто достать острый нож и разделить корпус на части. Внутри корпуса на стороне датчиков находятся датчик влажности и датчик температуры NTC (термистор).

 

Рисунок 2 Внутренности датчиков температуры и влажности DHT11 DHT22/AM2302
Рисунок 2 – Внутренности датчиков температуры и влажности DHT11 DHT22/AM2302

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

Рисунок 3 Внутренняя структура датчика влажности в DHT11 и DHT22
Рисунок 3 – Внутренняя структура датчика влажности в DHT11 и DHT22

Кроме того, в этих датчиках для измерения температуры имеется датчик температуры NTC (термистор). Термистор – это терморезистор – резистор, который меняет свое сопротивление в зависимости от температуры. Технически все резисторы являются термисторами – их сопротивление слегка изменяется в зависимости от температуры, но обычно это изменение очень мало и его трудно измерить.

Термисторы сделаны так, чтобы их сопротивление резко изменялось при изменении температуры, и изменение на один градус может составлять 100 Ом или более! Термин «NTC» означает «Negative Temperature Coefficient» (отрицательный температурный коэффициент), что означает, что с ростом температуры сопротивление уменьшается.

Рисунок 4 График зависимости сопротивления NTC термистора от температуры
Рисунок 4 – График зависимости сопротивления NTC термистора от температуры

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

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

Датчики DHT11 и DHT22/AM2302 довольно легко подключаются. У них есть четыре вывода:

Рисунок 5 Распиновка датчиков температуры и влажности DHT11 DHT22/AM2302
Рисунок 5 – Распиновка датчиков температуры и влажности DHT11 и DHT22/AM2302
  • Вывод VCC обеспечивает питание датчика. Хотя допускается напряжение питания в диапазоне от 3,3 до 5,5 В, рекомендуется питание 5 В. В случае источника питания 5 В, вы можете держать датчик на расстоянии до 20 метров от источника питания. Однако при напряжении питания 3,3 В длина кабеля не должна превышать 1 метра. В противном случае падение напряжения в линии приведет к ошибкам измерения.
  • Вывод Data используется для связи между датчиком и микроконтроллером.
  • NC не подключен
  • GND должен быть подключен к земле Arduino.

Подключение DHT11 и DHT22/AM2302 к Arduino UNO

Теперь, когда у нас есть полное понимание того, как работает датчик DHT, мы можем начать подключать его к нашей плате Arduino!

К счастью, подключение датчиков DHT11, DHT22/AM2302 к Arduino довольно тривиально. У них довольно длинные выводы с шагом 0,1 дюйма (2,54 м), поэтому вы можете легко вставить их в любую макетную плату. Подайте на датчик питание 5 В и подключите землю. Наконец, подключите вывод данных к цифровому выводу 2 на Arduino.

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

Рисунок 6 Подключение DHT11 к Arduino UNO
Рисунок 6 – Подключение DHT11 к Arduino UNO
Рисунок 7 Подключение DHT22/AM2302 к Arduino UNO
Рисунок 7 – Подключение DHT22/AM2302 к Arduino UNO

Теперь вы готовы загрузить в Arduino код и заставить ее работать.

Код Arduino. Вывод значений на монитор последовательного порта

Как обсуждалось ранее, датчики DHT11 и DHT22/AM2302 имеют собственный однопроводный протокол, используемый для передачи данных. Этот протокол требует точной синхронизации. К счастью, нам не нужно беспокоиться об этом, потому что мы собираемся использовать библиотеку DHT, которая позаботится почти обо всем.

Сначала скачайте библиотеку, посетив репозиторий на GitHub, или просто нажмите эту кнопку, чтобы скачать архив:

Чтобы установить библиотеку, откройте Arduino IDE, перейдите в «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку» и выберите только что загруженный zip-архив DHTlib.

После установки библиотеки вы можете скопировать следующий скетч в IDE Arduino. Данный скетч выводит значения температуры и относительной влажности в монитор последовательного порта. Попробуйте скетч в работе; а затем мы рассмотрим его подробнее.

#include <dht.h>
#define dataPin 8 // Определяет номер вывода, к которому подключен датчик
dht DHT;          // Создает объект DHT

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

void loop() 
{
  // Раскомментируйте нужную строку, в зависимости от используемого вами датчика
  int readData = DHT.read22(dataPin);   // DHT22/AM2302
  //int readData = DHT.read11(dataPin); // DHT11

  float t = DHT.temperature; // Получить значение температуры 
  float h = DHT.humidity;    // Получить значение относительной влажности

  // Вывод результатов в монитор последовательного порта
  Serial.print("Temperature = ");
  Serial.print(t);
  Serial.print(" ");
  Serial.print((char)176);  // Вывод символа градусов
  Serial.print("C | ");
  Serial.print((t * 9.0) / 5.0 + 32.0); // Вывод температуры в Фаренгейтах
  Serial.print(" ");
  Serial.print((char)176);  // Вывод символа градусов
  Serial.println("F ");
  Serial.print("Humidity = ");
  Serial.print(h);
  Serial.println(" % ");
  Serial.println("");

 delay(2000); // Задержка 2 секунды
}

Скетч начинается с включения библиотеки DHT. Затем нам нужно определить номер вывода Arduino, к которому подключен вывод данных нашего датчика, и создать объект DHT. Так мы сможем получить доступ к специальным функциям, связанным с библиотекой.

#include <dht.h>
#define dataPin 8 // Определяет номер вывода, к которому подключен датчик
dht DHT;          // Создает объект DHT

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

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

В функции loop() мы будем использовать функцию read22(), которая считывает данные с DHT22/AM2302. В качестве параметра она принимает номер вывода данных датчика. Если вы работаете с DHT11, вам нужно использовать функцию read11(). Вы можете сделать это, раскомментировав вторую строку.

// Раскомментируйте нужную строку, в зависимости от используемого вами датчика
int readData = DHT.read22(dataPin);   // DHT22/AM2302
//int readData = DHT.read11(dataPin); // DHT11

После расчета значений влажности и температуры мы можем получить к ним доступ:

float t = DHT.temperature; // Получить значение температуры 
float h = DHT.humidity;    // Получить значение относительной влажности

Объект DHT возвращает значение температуры в градусах Цельсия (°C). Его можно преобразовать в градусы Фаренгейта (°F) по простой формуле:

\[T_{^\circ F} = T_{^\circ C} \times 9/5 +32\]

Serial.print((t * 9.0) / 5.0 + 32.0); // Вывод температуры в Фаренгейтах

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

Рисунок 8 Вывод в мониторе последовательного порта показаний датчика DHT11 или DHT22/AM2302
Рисунок 8 – Вывод в мониторе последовательного порта показаний датчика DHT11 или DHT22/AM2302

Код Arduino. Использование DHT11 и DHT22/AM2302 с LCD дисплеем

Иногда может возникнуть идея, контролировать температуру и влажность в инкубаторе. Тогда для отображения условий в инкубаторе вам, вероятно, понадобится символьный LCD дисплей 16×2 вместо монитора последовательного порта. Итак, в этом примере вместе с датчиком DHT11 или DHT22/AM2302 мы подключим к Arduino LCD дисплей.

Если вы не знакомы с LCD дисплеями на 16×2 символов, взгляните на статью «Взаимодействие Arduino с символьным LCD дисплеем».

Далее нам нужно подключиться к LCD дисплею, как показано ниже.

Рисунок 9 Подключение к Arduino символьного LCD дисплея 16x2 и DHT11
Рисунок 9 – Подключение к Arduino символьного LCD дисплея 16x2 и DHT11
Рисунок 10 Подключение к Arduino символьного LCD дисплея 16x2 и DHT22
Рисунок 10 – Подключение к Arduino символьного LCD дисплея 16x2 и DHT22

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

#include <LiquidCrystal.h> // Включает библиотеку LiquidCrystal
#include <dht.h>
#define dataPin 8

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Создает объект LCD. Параметры: (rs, enable, d4, d5, d6, d7)
dht DHT;
bool showcelciusorfarenheit = false;

void setup() 
{
  // Инициализирует интерфейс LCD дисплея и указывает разрешение (ширину и высоту) дисплея
  lcd.begin(16,2); 
}

void loop() 
{
  int readData = DHT.read22(dataPin);
  float t = DHT.temperature;
  float h = DHT.humidity;
  lcd.setCursor(0,0);   // Устанавливает положение, где будет отображен текст, который будет напечатан
  lcd.print("Temp.: "); // Печатает строку "Temp." на LCD

  // Печатает значение температуры в Цельсиях и Фаренгейтах поочередно
  if(showcelciusorfarenheit)
  {
    lcd.print(t); // Печатает значение температуры с датчика
    lcd.print(" ");
    lcd.print((char)223);// показывает символ градусов
    lcd.print("C");
    showcelciusorfarenheit = false;
  }
  else
  {
    lcd.print((t * 9.0) / 5.0 + 32.0); // Печатает температуру в Фаренгейтах
    lcd.print(" ");
    lcd.print((char)223);//показывает символ градусов
    lcd.print("F");
    showcelciusorfarenheit = true;
  }

  lcd.setCursor(0,1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");
  delay(5000);
}
Рисунок 11 Показания температуры и влажности на LCD дисплее
Рисунок 11 – Показания температуры и влажности на LCD дисплее

Теги

ArduinoArduino UnoDHT11DHT22/AM2302LCD дисплейДатчикДатчик температурыИзмерениеИзмерение температурыТемпература

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2022-12-10Даллер

    Скеч на lsd дисплей выходит ошибка компиляции