Подключение датчиков 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 мА тока при измерении. Пожалуй, лучшее в этих датчиках — это то, что вы можете легко менять их местами в ваших проектах без изменения проводки! Вам нужно внести небольшие изменения в код, но в остальном замена одного на другой очень проста!
Внутреннее устройство датчика DHT
Если вы откроете датчик DHT11 или DHT22, сняв его корпус, вы обнаружите внутри два основных компонента: NTC-термистор и ёмкостный элемент для измерения влажности.
Часть, отвечающая за измерение влажности, имеет простую, но умную конструкцию. Она состоит из двух металлических электродов со специальным влагопоглощающим материалом (обычно соль или проводящий пластиковый полимер), расположенным между ними. Когда воздух становится более влажным, этот материал поглощает водяной пар из воздуха. По мере поглощения воды он высвобождает крошечные заряженные частицы — ионы. Эти ионы изменяют диэлектрическую постоянную материала (то, как материал реагирует на электричество), что изменяет ёмкость между электродами. Чем влажнее воздух, тем больше изменяется эта ёмкость. Измеряя это изменение, датчик может определить относительную влажность воздуха.
Для измерения температуры датчик использует NTC-термистор. Термистор — это, по сути, особый тип резистора, сопротивление которого значительно изменяется при изменении температуры. Обычные резисторы тоже немного меняют своё сопротивление с температурой, но эти изменения слишком малы, чтобы быть полезными. Термисторы же специально разработаны для больших изменений сопротивления при изменении температуры — часто на 100 Ом и более на каждый градус.
Буквы «NTC» в NTC-термисторе означают «Negative Temperature Coefficient» (отрицательный температурный коэффициент). Это значит, что при повышении температуры сопротивление уменьшается.
Датчик также содержит крошечный чип (или ASIC — специализированную интегральную схему, если вы предпочитаете технический термин). Этот маленький, но мощный чип выполняет несколько важных задач: он измеряет сигналы от компонентов влажности и температуры, применяет калибровочные настройки (которые помогают сделать показания точными), преобразует аналоговые электрические сигналы в цифровые данные и, наконец, выдаёт цифровой сигнал, который ваш микроконтроллер может понять.
Распиновка DHT11 и DHT22
Датчики DHT11 и DHT22 имеют похожую распиновку и обычно поставляются с четырьмя выводами:
Вывод 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. Однако, если вы приобрели модуль на плате, вы можете пропустить добавление этого резистора, так как он уже встроен.
Вот краткая справочная таблица подключений:
| DHTxx | Arduino | Notes | |
| VCC | 5V | – | |
| GND | GND | – | |
| Data | 8 | pulled up by 10kΩ |
На изображении ниже показано, как подключить DHT11:
Схема подключения DHT11 к Arduino UNO
А вот как подключить DHT22:
Схема подключения DHT22 к Arduino UNO
После выполнения всех подключений вы готовы загрузить код и начать измерять температуру и влажность!
Установка библиотеки
Датчики DHTxx используют уникальный однопроводной протокол связи для передачи данных о температуре и влажности. Хотя этот протокол не является стандартным, он похож на `протокол Dallas 1-Wire `_ и в значительной степени зависит от очень точной синхронизации.
Хорошая новость в том, что вам не нужно разбираться во всех технических деталях работы этого протокола! Существует полезная библиотека `DHTlib `_, которая берёт на себя почти всё.
Для установки библиотеки:
Сначала откройте вашу программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «dhtlib» в поле поиска для фильтрации результатов.
Найдите библиотеку «DHTlib», созданную Rob Tillaart.
Нажмите кнопку Install, чтобы добавить её в вашу Arduino IDE.
Пример 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 вы должны увидеть показания температуры и влажности в мониторе последовательного порта.
Объяснение кода:
Давайте разберём, как работает эта программа, шаг за шагом:
Сначала мы подключаем библиотеку 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:
Если вы ранее не работали с символьными LCD-дисплеями 16×2, вам может пригодиться это полезное руководство:
Схема подключения
Теперь подключим LCD к Arduino, как показано на этой схеме:
Схема подключения DHT11 и символьного LCD 16×2 к Arduino UNO
Схема подключения 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);
}