В этой статье мы рассмотрим как использовать датчики температуры и влажности DHT11 и DHT22 с платой ESP32 с помощью Arduino IDE. Мы рассмотрим краткое введение в эти датчики, их распиновку, схему подключения к ESP32 и программу для считывания с них данных.
Ранее мы уже подключали датчик DHT11 к модулю ESP32 в проекте веб-сервера на модуле ESP32 для измерения температуры и влажности. Но эта статья более подробная и охватывает больше нюансов подключения датчика DHT11/DHT22 к ESP32.
Также ранее на нашем сайте мы рассматривали подключение датчика DHT11 (создание метеостанции) к платам Raspberry Pi и Arduino, а также к модулю ESP8266.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик температуры и влажности DHT11/DHT22 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Датчики температуры и влажности DHT11 и DHT22
Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди производителей и любителей электроники.
Эти датчики содержат чип, который выполняет аналого-цифровое преобразование и выдает цифровой сигнал с температурой и влажностью. Это делает их очень простыми в использовании с любым микроконтроллером.
DHT11 против DHT22
Датчики DHT11 и DHT22 очень похожи, но отличаются по своим характеристикам. В следующей таблице сравниваются некоторые из наиболее важных характеристик датчиков температуры и влажности DHT11 и DHT22. Для более глубокого анализа этих датчиков, пожалуйста, проверьте технические характеристики датчиков.
| DHT11 | DHT22 | |
| Диапазон температур | от 0 до 50 ºС +/-2 ºС | -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/DHT11. Когда датчик обращен к вам, нумерация контактов начинается с 1 слева направо.
| Контакт датчика | Подключается к |
| 1 | 3.3В |
| 2 | Любой цифровой GPIO; также подключите подтягивающий резистор 10 кОм |
| 3 | Не подключайте |
| 4 | Земля |
Как видите, назначение контактов датчиков интуитивно понятно.
Принципиальная схема
Подключите датчик DHT22 или DHT11 к плате разработки ESP32, как показано на следующей принципиальной схеме.
В этом примере мы подключаем контакт данных датчика DHT к контакту GPIO 4 платы ESP32. Однако вы можете использовать любой другой подходящий цифровой контакт платы.
Установка библиотек
Для считывания данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для использования этой библиотеки вам также необходимо установить библиотеку Adafruit Unified Sensor. Выполните следующие шаги для установки этих библиотек.
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.
После установки библиотеки DHT от Adafruit введите в поле поиска «Adafruit Unified Sensor». Прокрутите страницу до конца, чтобы найти библиотеку и установить ее.
После установки библиотек перезапустите Arduino IDE.
Исходный код программы
Для считывания температуры и влажности с датчика DHT мы будем использовать пример на основе библиотеки Adafruit DHT. Скопируйте следующий код в Arduino IDE.
|
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
// Example testing sketch for various DHT humidity/temperature sensors written by ladyada // REQUIRES the following Arduino libraries: // - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library // - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor #include "DHT.h" #define DHTPIN 4 // Digital pin connected to the DHT sensor // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- // Pin 15 can work but DHT must be disconnected during program upload. // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println(F("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 (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) 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(F("Failed to read from DHT sensor!")); return; } // 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(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C ")); Serial.print(f); Serial.print(F("°F Heat index: ")); Serial.print(hic); Serial.print(F("°C ")); Serial.print(hif); Serial.println(F("°F")); } |
В коде много комментариев с полезной информацией, которые помогут лучше вам понять как он работает, но можете прочитать и объяснение работы кода ниже.
Объяснение работы кода
Сначала вам нужно импортировать библиотеку DHT:
|
1 |
#include "DHT.h" |
Затем задайте цифровой контакт, к которому подключен контакт данных датчика DHT. В нашем случае он подключен к GPIO 4.
|
1 |
#define DHTPIN 4 // Digital pin connected to the DHT sensor |
Затем вам нужно выбрать тип датчика DHT, который вы используете. Библиотека поддерживает DHT11, DHT22 и DHT21. Раскомментируйте тип датчика, который вы используете, и закомментируйте все остальные. В этом случае мы используем датчик DHT22.
|
1 2 3 |
//#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
Далее создадим DHT объект с именем dht на контакте, который мы задали ранее, и необходимым типом датчика.
|
1 |
DHT dht(DHTPIN, DHTTYPE); |
В функции setup() инициализируем последовательную связь со скоростью 9600 бод и выведем сообщение в последовательном мониторе.
|
1 2 |
Serial.begin(9600); Serial.println(F("DHTxx test!")); |
Наконец, инициализируем датчик DHT.
|
1 |
dht.begin(); |
Функция loop() начинается с задержки 2000 мс (2 секунды), поскольку максимальный период выборки DHT22 составляет 2 секунды. Таким образом, мы можем получать показания только каждые две секунды.
Температура и влажность возвращаются в формате float. Мы создаем переменные float h, t и f для сохранения влажности, температуры в градусах Цельсия и температуры в градусах Фаренгейта соответственно.
Получить данные о влажности и температуре так же просто, как использовать методы readHumidity() и readTemperature() объекта dht, как показано в следующем фрагменте кода:
|
1 2 3 |
float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); |
Если вы хотите получить температуру в градусах Фаренгейта, вам нужно передать параметр true как аргумент для метода readTemperature().
|
1 |
float f = dht.readTemperature(true); |
Также имеется оператор if, который проверяет, вернул ли датчик действительные показания температуры и влажности.
|
1 2 3 |
if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F("Failed to read from DHT sensor!")); return; |
После получения влажности и температуры библиотека имеет метод, который вычисляет индекс тепла. Вы можете получить индекс тепла как в градусах Цельсия, так и в градусах Фаренгейта, как показано ниже:
|
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 |
Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C ")); Serial.print(f); Serial.print(F("°F Heat index: ")); Serial.print(hic); Serial.print(F("°C ")); Serial.print(hif); Serial.println(F("°F")); |
Тестирование работы проекта
Загрузите код на плату ESP32. Убедитесь, что в настройках Arduino IDE выбраны правильная плата и COM-порт.
После загрузки кода откройте последовательный монитор на скорости передачи данных 9600 бод. Вы должны получать последние показания температуры и влажности в последовательном мониторе каждые две секунды.
Если ваш датчик DHT возвращает сообщение об ошибке “Failed to read from DHT sensor!” («Не удалось прочитать данные датчика DHT!») или показания DHT возвращают «Nan»:
Попробуйте воспользоваться одним из следующих советов по устранению этой ошибки:
- Проводка: когда вы создаете электронный проект, вам нужно дважды проверить проводку или назначение контактов. После проверки и тестирования того, что ваша схема правильно подключена, если она все еще не работает, продолжайте читать следующие советы по устранению неполадок.
- Питание: датчик DHT имеет рабочий диапазон от 3 В до 5,5 В (DHT11) или от 3 В до 6 В (DHT22). Если вы питаете датчик от контакта ESP32 3,3 В, в некоторых случаях питание DHT напряжением 5 В решает проблему.
- Неисправный USB-порт или USB-кабель: иногда питания ESP32 напрямую от USB-порта ПК недостаточно. Попробуйте подключить его к USB-концентратору, работающему от внешнего источника питания. Также может помочь замена USB-кабеля на лучший или более короткий. Наличие USB-порта, обеспечивающего достаточное питание, или использование хорошего USB-кабеля часто решает эту проблему.
- Источник питания: как упоминалось в предыдущем совете, ваш ESP может не обеспечивать достаточно мощности для правильного считывания с датчика DHT. В некоторых случаях вам может потребоваться питание ESP от источника питания, который обеспечивает больший ток.
- Тип датчика: дважды проверьте, что вы раскомментировали/закомментировали в коде нужный датчик для вашего проекта. В этом проекте мы использовали DHT22:
|
1 2 3 |
//#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, и они всегда решались одним из описанных ранее методов.
Фатальная ошибка с отсутствием файла Adafruit_Sensor.h
Также есть распространенная ошибка Fatal error: Adafruit_Sensor.h: No such file or directory (Фатальная ошибка: Adafruit_Sensor.h: такого файла или каталога нет), которая происходит при попытке компиляции кода. Если вы получаете следующую ошибку:
|
1 2 |
fatal error: Adafruit_Sensor.h: No such file or directory #include <Adafruit_Sensor.h> |
Вам необходимо установить библиотеку драйвера Adafruit Unified Sensor. В Arduino IDE введите в поле поиска «Adafruit Unified Sensor», прокрутите страницу до конца, чтобы найти библиотеку и установить ее.
После установки библиотеки перезапустите Arduino IDE, и код должен скомпилироваться без сообщения об ошибке.
Подведение итогов
С помощью этого руководства вы узнали, как получать показания температуры и влажности с датчика DHT11 или DHT22 с помощью ESP32 и Arduino IDE. Получение показаний температуры и влажности с помощью библиотеки Adafruit DHT очень просто, вы просто используете методы readTemperature() и readHumidity() объекта dht.
Теперь вы можете вывести этот проект на новый уровень и отображать показания датчиков на веб-сервере, к которому можно обращаться с помощью браузера смартфона.

4 ответа к “Подключение датчика температуры и влажности DHT11/DHT22 к ESP32”
Влияет ли повышение до 5В напряжения питания датчика DHT22 на уровень его цифрового сигнала?
Это не повредит ESP32?
Да, повышение питания до 5 В повышает уровень цифрового сигнала (логической «1») до примерно 5 В, что может повредить ESP32, если не принять меры согласования уровней.
1. Уровень сигнала зависит от питания
Датчики DHT22 (и DHT11) не имеют отдельного входа для питания логики. Их вывод DATA (сигнальный) выдает уровень «1», приблизительно равный напряжению питания (VCC). То есть:
При питании 3,3 В → сигнал «1» ≈ 3,3 В.
При питании 5 В → сигнал «1» ≈ 5 В.
2. ESP32 не 5-вольтовая
Платы ESP32 рассчитаны на 3,3 В логику. Контакты GPIO (входы/выходы) не являются 5-вольто-терпимыми. Подача на них напряжения 5 В может привести к:
— Некорректной работе (высокий уровень может не распознаться или распознаваться с ошибками).
— Повреждению контроллера со временем или мгновенному выходу из строя.
— Увеличению тока утечки и энергопотребления.
Что делать, если нужно питать DHT22 от 5 В?
1. Самый безопасный вариант: Питать датчик от 3,3 В вывода ESP32 (пин 3V3). Этого достаточно для DHT22 (минимум 3 В). Потери в точности не будет.
2. Если 5 В необходимо (например, из-за длинных проводов или требований других устройств на линии), обязательно используйте преобразователь уровней.
— Схема с делителем напряжения: Самый простой способ — поставить резисторный делитель 2:1 на линии DATA (например, 10 кОм к земле и 20 кОм последовательно с сигналом, или два резистора по 10 кОм — один на землю, другой между DATA датчика и DATA ESP32). Но учтите: из-за низкого выходного тока DHT это может нарушить тайминги протокола.
— Рекомендуемый способ: Использовать готовый модуль преобразователя уровней (например, на MOSFET BSS138) или микросхему (например, 74LVC245, 74AHCT125). Это даст стабильную работу.
— Подтягивающий резистор: В любом случае, на линии DATA обязательно должен быть подтягивающий резистор 4,7 – 10 кОм к тому напряжению, которым питается ESP32 (3,3 В). Это обеспечит безопасный уровень «1». Если подтянуть к 5 В, это усугубит проблему.
Итог
Влияет: Да, при питании 5 В сигнал DATA также становится около 5 В.
Опасно для ESP32: Да, если не согласовать уровни.
Простое решение: Питайте DHT22 от 3,3 В ESP32. Это работает для большинства проектов.
Если нужно 5 В: Обязательно используйте согласование уровней с подтяжкой линии DATA к 3,3 В.
Настоятельно рекомендуется следовать официальной распиновке из приведенной статьи — питание 3,3 В. Это избавит от головной боли с преобразованием уровней.
Чтобы не «нагружать» ESP32 обеспечением питанием датчиков, дисплеев, пр., возможен ли такой вариант:
— запитывать их от отдельного источника 3.3 В, соединив их земли с землёй микроконтроллера?
Да, такой вариант полностью возможен и часто используется на практике. Главное условие — обязательно соединить «землю» (GND) внешнего источника питания с «землёй» ESP32. Без этого общего провода цепь не замкнётся, и сигналы между устройствами передаваться не будут.
Что важно учесть при таком подключении:
1. Общая «земля» — обязательна
Соедините проводником вывод GND вашего отдельного источника 3.3 В с любым выводом GND на ESP32. Это создаст единую точку отсчёта напряжения для всех сигналов.
2. Питание датчиков — от внешнего источника 3.3 В
Подавайте +3.3 В с внешнего источника на вывод VCC (или «+») датчика/дисплея.
Пример для DHT22: внешний +3.3 В → на пин 1 датчика, внешний GND → на пин 4 датчика, а сигнальный провод (пин 2) → на любой GPIO ESP32 (например, GPIO4).
3. Напряжение сигналов
Если внешний источник выдаёт ровно 3.3 В, то уровни логических сигналов будут безопасны для ESP32 (её GPIO рассчитаны на 3.3 В).
Важное предупреждение: если вы решите использовать источник 5 В (например, для питания дисплея), то сигнальные линии (DATA, SDA, SCL и т.д.) также могут оказаться с уровнем ~5 В. Это повредит ESP32! В таком случае придётся ставить преобразователи уровней (например, на BSS138 или делители напряжения).
4. Подтягивающие резисторы
Для датчиков типа DHT22, если вы используете отдельное питание, подтягивающий резистор на линии данных (обычно 4.7–10 кОм) должен вести к напряжению питания ESP32 (3.3 В), а не к внешнему источнику. Это гарантирует, что высокий уровень сигнала не превысит 3.3 В.