В этой статье мы рассмотрим как использовать датчики температуры и влажности 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.
Теперь вы можете вывести этот проект на новый уровень и отображать показания датчиков на веб-сервере, к которому можно обращаться с помощью браузера смартфона.