Рубрики
Проекты на ESP32

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

В этой статье мы рассмотрим как использовать датчики температуры и влажности DHT11 и DHT22 с платой ESP32 с помощью Arduino IDE. Мы рассмотрим краткое введение в эти датчики, их распиновку, схему подключения к ESP32 и программу для считывания с них данных.

Ранее мы уже подключали датчик DHT11 к модулю ESP32 в проекте веб-сервера на модуле ESP32 для измерения температуры и влажности. Но эта статья более подробная и охватывает больше нюансов подключения датчика DHT11/DHT22 к ESP32.

Также ранее на нашем сайте мы рассматривали подключение датчика DHT11 (создание метеостанции) к платам Raspberry Pi и Arduino, а также к модулю ESP8266.

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

  1. Модуль ESP32 (купить на AliExpress).
  2. Датчик температуры и влажности DHT11/DHT22 (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 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.

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

Объяснение работы кода

Сначала вам нужно импортировать библиотеку DHT:

Затем задайте цифровой контакт, к которому подключен контакт данных датчика DHT. В нашем случае он подключен к GPIO 4.

Затем вам нужно выбрать тип датчика DHT, который вы используете. Библиотека поддерживает DHT11, DHT22 и DHT21. Раскомментируйте тип датчика, который вы используете, и закомментируйте все остальные. В этом случае мы используем датчик DHT22.

Далее создадим DHT объект с именем dht на контакте, который мы задали ранее, и необходимым типом датчика.

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

Наконец, инициализируем датчик DHT.

Функция loop() начинается с задержки 2000 мс (2 секунды), поскольку максимальный период выборки DHT22 составляет 2 секунды. Таким образом, мы можем получать показания только каждые две секунды.

Температура и влажность возвращаются в формате float. Мы создаем переменные float ht и f для сохранения влажности, температуры в градусах Цельсия и температуры в градусах Фаренгейта соответственно.

Получить данные о влажности и температуре так же просто, как использовать методы readHumidity() и readTemperature() объекта dht, как показано в следующем фрагменте кода:

Если вы хотите получить температуру в градусах Фаренгейта, вам нужно передать параметр true как аргумент для метода readTemperature().

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

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

Наконец, распечатайте все показания на последовательном мониторе с помощью следующих команд:

Тестирование работы проекта

Загрузите код на плату 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:

  • Частота выборки: датчик DHT очень медленно получает показания (показания датчика могут занять до 2 секунд). В некоторых случаях увеличение времени между показаниями решает проблему.
  • Датчик DHT сгорел или сломался: к сожалению, эти дешевые датчики иногда выглядят совершенно нормально, но они сгорели/сломаны. Поэтому, даже если вы собрали правильную схему и код, он все равно не сможет получить показания. Попробуйте использовать другой датчик, чтобы посмотреть, решит ли это вашу проблему.
  • Неправильная скорость передачи данных или не удалось загрузить код: если вы ничего не видите в последовательном мониторе Arduino IDE, еще раз проверьте, правильно ли выбрана скорость передачи данных, COM-порт или успешно ли загружен код.

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

Фатальная ошибка с отсутствием файла Adafruit_Sensor.h

Также есть распространенная ошибка Fatal error: Adafruit_Sensor.h: No such file or directory (Фатальная ошибка: 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 В.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *