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

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

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

Узнайте, как отображать показания температуры и влажности на веб-сервере с помощью плат ESP32 или ESP8266:

Датчики температуры и влажности DHT11 и DHT22

Датчики DHT11 и DHT22 используются для измерения температуры и относительной влажности. Они очень популярны среди мейкеров и любителей электроники.

Датчики температуры и влажности DHT11 и DHT22

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

Если вы хотите использовать эти датчики с платой Arduino, вы можете прочитать следующее руководство:

DHT11 и DHT22: сравнение

Датчики DHT11 и DHT22 очень похожи, но различаются по своим характеристикам. В следующей таблице сравниваются некоторые из наиболее важных характеристик датчиков температуры и влажности DHT11 и DHT22. Для более подробного анализа этих датчиков обратитесь к техническим описаниям (datasheet) датчиков.

Параметр

DHT11

DHT22

Внешний вид

DHT11 DHT22

Диапазон температур

от 0 до 50 °C ±2 °C

от -40 до 80 °C ±0,5 °C

Диапазон влажности

от 20 до 90% ±5%

от 0 до 100% ±2%

Разрешение

Влажность: 1%, Температура: 1 °C

Влажность: 0,1%, Температура: 0,1 °C

Рабочее напряжение

3 – 5,5 В DC

3 – 6 В DC

Потребляемый ток

0,5 – 2,5 мА

1 – 1,5 мА

Период опроса

1 секунда

2 секунды

Цена

$1 – $5

$4 – $10

Где купить

Проверить цены

Проверить цены

Датчик DHT22 имеет лучшее разрешение и более широкий диапазон измерения температуры и влажности. Однако он немного дороже, и запрашивать показания можно только с интервалом в 2 секунды.

Датчик DHT11 имеет меньший диапазон и менее точен. Однако вы можете запрашивать показания датчика каждую секунду. Он также немного дешевле.

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

Распиновка DHT

Датчики DHT имеют четыре вывода, как показано на следующем рисунке. Однако если вы приобрели датчик DHT на плате расширения (breakout board), он имеет только три вывода и встроенный подтягивающий резистор на выводе 2.

Распиновка датчика DHT22

В следующей таблице показана распиновка DHT22/DHT11. Когда датчик обращен к вам лицевой стороной, нумерация выводов начинается с 1 слева направо.

Вывод DHT

Подключение

1

3,3 В

2

Любой цифровой GPIO; также подключите подтягивающий резистор 10 кОм

3

Не подключать

4

GND

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

Для выполнения этого руководства вам нужно подключить датчик температуры DHT11 или DHT22 к ESP32. Необходимо использовать подтягивающий резистор на 10 кОм.

Вот список компонентов, необходимых для сборки схемы:

Вы можете использовать приведенные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Подключите датчик DHT22 или DHT11 к плате разработки ESP32, как показано на следующей схеме.

Схема подключения ESP32 с датчиком DHT11/DHT22

В этом примере мы подключаем вывод данных DHT к GPIO 4. Однако вы можете использовать любой другой подходящий цифровой вывод.

Узнайте, как использовать выводы GPIO ESP32, из нашего руководства: ESP32 Pinout Reference: Which GPIO pins should you use?

Установка библиотек

Для чтения данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для использования этой библиотеки также необходимо установить библиотеку Adafruit Unified Sensor. Выполните следующие шаги для установки этих библиотек.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.

Установка библиотеки Adafruit DHT

После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, найдите библиотеку и установите её.

Установка библиотеки Adafruit Unified Sensor

После установки библиотек перезапустите Arduino IDE.

Скетч для чтения температуры и влажности на ESP32

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

// 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:

#include "DHT.h"

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

#define DHTPIN 4     // Digital pin connected to the DHT sensor

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

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

Создайте объект DHT с именем dht на указанном выводе и с заданным типом датчика.

DHT dht(DHTPIN, DHTTYPE);

В функции setup() инициализируйте отладочный Serial-порт на скорости 9600 бод и выведите сообщение в Serial Monitor.

Serial.begin(9600);
Serial.println(F("DHTxx test!"));

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

dht.begin();

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

delay(2000);

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

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

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();

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

float f = dht.readTemperature(true);

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

if (isnan(h) || isnan(t) || isnan(f)) {
   Serial.println(F("Failed to read from DHT sensor!"));
   return;

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

// 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 Monitor с помощью следующих команд:

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-порт.

После загрузки кода откройте Serial Monitor на скорости 9600 бод. Вы должны видеть последние показания температуры и влажности в Serial Monitor каждые две секунды.

Показания температуры и влажности датчика DHT в Serial Monitor ESP32

Устранение неполадок – Failed to read from DHT sensor

Если вы пытаетесь прочитать температуру и влажность с датчика DHT11/DHT22 и получаете сообщение об ошибке в Serial Monitor, выполните следующие шаги, чтобы попробовать заставить датчик работать (или прочитайте специальное руководство по устранению неполадок DHT).

«Failed to read from DHT sensor!» или показания Nan

Если ваш датчик DHT возвращает сообщение об ошибке «Failed to read from DHT sensor!» или показания DHT возвращают «Nan»:

Ошибка Failed to read from DHT sensor! или показания Nan

Попробуйте один из следующих советов по устранению неполадок:

  • Проводка: при сборке электронного проекта необходимо дважды проверить проводку или назначение выводов. После проверки и тестирования правильности подключения схемы, если она по-прежнему не работает, продолжайте читать следующие советы по устранению неполадок.

  • Питание: датчик DHT имеет рабочий диапазон от 3 В до 5,5 В (DHT11) или от 3 В до 6 В (DHT22). Если вы питаете датчик от вывода 3,3 В ESP32, в некоторых случаях питание DHT от 5 В решает проблему.

  • Неисправный USB-порт или USB-кабель: иногда питания непосредственно от USB-порта ПК недостаточно для ESP32. Попробуйте подключить его к USB-хабу с внешним питанием. Также может помочь замена USB-кабеля на более качественный или короткий. Наличие USB-порта, обеспечивающего достаточную мощность, или использование хорошего USB-кабеля часто решает эту проблему.

  • Источник питания: как упоминалось в предыдущем совете, ваш ESP может не обеспечивать достаточное питание для корректного чтения данных с датчика DHT. В некоторых случаях может потребоваться питание ESP от источника с большим током.

  • Тип датчика: убедитесь, что в вашем коде раскомментирован/закомментирован правильный датчик для вашего проекта. В этом проекте мы использовали DHT22:

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
  • Частота опроса: датчик DHT очень медленно получает показания (считывание данных может занимать до 2 секунд). В некоторых случаях увеличение времени между считываниями решает проблему.

  • Датчик DHT сгорел или сломан: к сожалению, эти дешевые датчики иногда выглядят совершенно нормально, но при этом сгоревшие/сломанные. Поэтому, даже если вы собрали правильную схему и код, получить показания всё равно не удастся. Попробуйте использовать другой датчик, чтобы проверить, решит ли это вашу проблему.

  • Неправильная скорость передачи или ошибка загрузки кода: если вы ничего не видите в Serial Monitor Arduino IDE, убедитесь, что выбрана правильная скорость передачи (baud rate), COM-порт, или что код был успешно загружен.

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

Fatal error: Adafruit_Sensor.h: No such file or directory

Существует также распространенная ошибка, которая возникает при попытке компиляции кода. Если вы получаете следующую ошибку:

fatal error: Adafruit_Sensor.h: No such file or directory
#include <Adafruit_Sensor.h>

Вам необходимо установить библиотеку драйвера Adafruit Unified Sensor. В Arduino IDE введите в поле поиска «Adafruit Unified Sensor», прокрутите вниз, найдите библиотеку и установите её.

Установка библиотеки драйвера Adafruit Unified Sensor

После установки библиотеки перезапустите Arduino IDE, и код должен скомпилироваться без сообщения об ошибке.

Заключение

В этом руководстве вы узнали, как получать показания температуры и влажности с датчика DHT11 или DHT22 с помощью ESP32 в Arduino IDE. Получение показаний температуры и влажности с помощью библиотеки Adafruit DHT очень просто – достаточно использовать методы readTemperature() и readHumidity() для объекта DHT.

Теперь вы можете вывести этот проект на следующий уровень и отображать показания датчиков на веб-сервере, к которому можно обращаться через браузер смартфона. Узнайте, как создать веб-сервер на ESP32 для отображения показаний датчиков: ESP32 DHT11/DHT22 Web Server – Temperature and Humidity using Arduino IDE.

Если вам интересен ESP32, вам также могут понравиться следующие ресурсы:

Надеемся, что это руководство оказалось полезным.

Спасибо за чтение.


Источник: ESP32 with DHT11/DHT22 Temperature and Humidity Sensor using Arduino IDE