Подключение датчика DHT22 к ESP32 с помощью ESP-IDF


В данной статье мы рассмотрим как подключить датчик DHT22, широко используемый для получения текущих показаний температуры и влажности, к плате ESP32 с помощью ESP-IDF. Будет кратко описано устройство датчика, его подключение к плате ESP32, а также настройка проекта в VS Code с расширением ESP-IDF для сбора данных с датчика и их отображения как на консоли, так и на OLED-дисплее SSD1306.

Также ранее на нашем сайте мы рассматривали подключение датчика DHT22 к ESP32 с помощью Arduino IDE.

Датчик DHT22

Датчик DHT22 (AM2302) — это простой и недорогой датчик температуры и влажности, использующий емкостной датчик влажности и терморезистор для расчета данных об окружающей атмосфере. Это включает относительную влажность и температуру окружающей среды. Это предварительно откалиброванный датчик, выдающий откалиброванный цифровой сигнал по протоколу 1-Wire. Поэтому его легко подключать к микроконтроллерам, например, к платам разработки ESP32, используя один вывод GPIO.

На приведенной ниже схеме показана распиновка датчика DHT22.

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

Типичный датчик DHT имеет четыре контакта, из которых два являются контактами питания (VCC и GND), один — контактом данных, а третий контакт не используется. Обратите внимание, что номер контакта считывается слева направо, если держать датчик за переднюю часть.

Контакт DHT22 Описание
1 (VCC) Это контакт питания, к которому подключается напряжение 3,3-5,0 В.
2 (Data Out) Второй вывод — это вывод данных (Data Out), который обеспечивает цифровой выходной сигнал. Он выводит значения измеренной температуры и влажности в виде последовательных данных.
3 (NC) Третий контакт не подключен.
4 (GND) Это контакт заземления.

При использовании датчика DHT22 вывод данных подключается к выводу GPIO микроконтроллера через подтягивающий резистор. Подтягивающий резистор отвечает за поддержание высокого уровня сигнала на выводе данных для обеспечения успешной связи между датчиком и микроконтроллером.

Однако модуль DHT22 содержит всего три контакта: VCC, Data и GND. В этом случае второй контакт, являющийся контактом данных, внутренне соединен с подтягивающим резистором 10 кОм, поэтому нет необходимости добавлять внешний резистор при подключении его к контакту GPIO ESP32.

Модуль датчика DHT22

Подключение датчика DHT22 к ESP32

Для подключения платы ESP32 к датчику DHT22 нам понадобятся следующие компоненты.

  1. Плата ESP32.
  2. Датчик DHT22.
  3. Резистор 10 кОм (не требуется при использовании модуля датчика DHT22).
  4. Макетная плата.
  5. Соединительные провода.

Соединения между устройствами указаны в таблице ниже:

Контакт DHT22 ESP32
1 (Vcc) Контакт VCC будет соединен с контактом 3,3 В или Vin платы ESP32.
2 (Data Out) Любой вывод GPIO платы ESP32 вместе с подтягивающим резистором 10 кОм. Мы используем GPIO27 для подключения к выводу 2 вместе с подтягивающим резистором.
3 (NC) Этот контакт не используется.
4 (GND) Общая земля с ESP32

Подключите датчик DHT22 к плате разработки ESP32, как показано на принципиальной схеме ниже:

Принципиальная схема подключения датчика DHT22 к плате ESP32

Измерение показаний DHT22 с помощью ESP32 и ESP-IDF

Мы создадим проект в VS Code с расширением ESP-IDF. Код будет считывать показания температуры и влажности с помощью библиотеки DHT22. Мы будем использовать библиотеку DHT22, предоставленную Andrey-m на GitHub.

Создание примера проекта

Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «DHT22». Для платы ESP-IDF мы выбрали опцию custom board («пользовательская плата»). В качестве целевого модуля ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

В разделе «Расширение» выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон sample_project»).

Создание проекта с использованием шаблона sample_project

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это откроет проект, который мы создали на вкладке «Проводник». Внутри папки проекта находится несколько папок. Это справедливо для каждого проекта, который вы будете создавать с помощью ESP-IDF Explorer.

  • Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. Создайте новую папку с именем 'components/DHT22' и добавьте в неё следующие файлы:

Файлы, необходимые для считывания показаний с датчика DHT22

CMakeLists.txt

DHT22.h

DHT22.c

  • Теперь перейдите к файлу main.c. В папке main находится исходный код, то есть файл main.c будет находиться здесь. Перейдите в папку  main > main.c  и откройте его. Скопируйте приведенный ниже код из этого файла и сохраните его.

Код ESP32 для работы с датчиком DHT22

Как работает код?

Для начала мы подключим необходимые библиотеки для этого проекта. Это включает драйвер GPIO, библиотеку DHT22 и библиотеки FreeRTOS. Мы будем использовать файл driver/gpio.h, поскольку используем вывод GPIO ESP32 для доступа к цифровому значению датчика. Библиотеки FreeRTOS будут использоваться для создания задержек и задач. Кроме того, API-интерфейсы DHT22.h будут использоваться для доступа к показаниям влажности и температуры.

Внутри функции DHT_reader_task() сначала устанавливается контакт GPIO, подключенный к контакту данных, с помощью функции setDHTgpio(). Эта функция принимает один параметр — номер контакта GPIO ESP32, с которого будут выводиться данные датчика.

Затем внутри бесконечного цикла while мы начнем считывать данные с датчика DHT22 каждые 2 секунды, используя функцию readDHT(). Функция errorHandler() проверяет наличие ответа после считывания данных с DHT22. Для получения показаний влажности в процентах используется функция getHumidity(). Она возвращает показания влажности в виде числа с плавающей запятой. Аналогично, для получения показаний температуры в градусах Цельсия используется функция getTemperature(). Она также возвращает показания температуры в виде числа с плавающей запятой. Показания обоих датчиков считываются непрерывно с задержкой в ​​2 секунды. Обратите внимание, что частота дискретизации датчика DHT22 составляет 0,5 Гц, что означает, что он выдает новые показания каждые 2 секунды. Следовательно, задержка по времени имеет важное значение.

Внутри функции app_main() мы сначала инициализируем NVS, вызвав функцию nvs_flash_init(). Затем используем xTaskCreate() для создания задачи чтения DHT22, которая будет получать показания датчика DHT22 и выводить их в консоль каждые 3 секунды.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

После успешной прошивки кода вы сможете просматривать показания температуры и влажности на консоли, которые обновляются каждые 2 секунды.

Тестирование работы проекта считывания показаний датчика DHT22 в окне терминала

Отображение показаний DHT22 на OLED-дисплее

Теперь давайте создадим ещё один проект, в котором мы запрограммируем нашу плату ESP32 для получения показаний датчика DHT22 и отображения их на 0,96-дюймовом OLED-дисплее SSD1306.

Создание проекта

Выполните все те же шаги для создания аналогичного проекта, что и раньше. Однако на этот раз нам также необходимо добавить библиотеку для OLED-дисплея.

  • Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. После добавления библиотек DHT22 перейдём к добавлению библиотек ssd1306. В папке components создайте новую папку с именем 'ssd1306' и добавьте все файлы, доступные по этой ссылке . Это включает в себя все файлы, перечисленные ниже:

Файлы, необходимые для работы с OLED-дисплеем

Настройки MenuConfig для работы с OLED дисплеем

Для начала перейдем к menuconfig. Откройте редактор конфигурации ESP-IDF SDK. Прокрутите вниз и откройте раздел конфигурации SSD1306. Здесь мы можем установить параметры конфигурации SSD1306 в соответствии с нашими потребностями. Это включает в себя интерфейс UART, тип панели, контакты SCL GPIO, SDA GPIO и контакт сброса GPIO. Здесь вы можете увидеть, что по умолчанию ESP-IDF использует интерфейс I2C, тип панели 128×64, контакт SCL GPIO 22, контакт SDA GPIO 21 и контакт сброса GPIO 33. Вы можете изменить эти параметры в соответствии с вашим OLED-дисплеем, а затем нажать кнопку «Сохранить» вверху. Мы оставим настройки конфигурации по умолчанию, поскольку они соответствуют нашему модулю.

Настройки MenuConfig для работы с OLED дисплеем

  • Теперь перейдите к файлу main.c. В папке main находится исходный код, то есть файл main.c будет находиться здесь. Перейдите в папку  main > main.c  и откройте его. Скопируйте приведенный ниже код из этого файла и сохраните его.

Код ESP32 для отображения показаний датчика DHT22 на OLED-дисплее 

Как работает код?

Большая часть кода идентична коду предыдущего проекта, где мы получали показания датчика DHT22 каждые 2 секунды. Однако на этот раз вместо отображения показаний на терминале ESP-IDF мы стремимся вывести их на OLED-дисплей. Давайте рассмотрим части кода, где мы используем OLED-дисплей. Остальные функции для получения показаний температуры и влажности от датчика DHT22 остались прежними.

Внутри функции DHT_Oled_task() мы сначала инициализируем интерфейс I2C. Интерфейс I2C будет сконфигурирован путем вызова функции i2c_master_init() и передачи в качестве параметров адреса структуры SSD1306_t, выводов SDA, SCL и Reset. Это настроит ведущее устройство ESP32 на прослушивание ведомых устройств на шине I2C.

После этого мы инициализируем OLED-дисплей, вызвав функцию ssd1306_init(). Она принимает три параметра. Первый параметр — это адрес структуры SSD1306_t, второй — ширина, а третий — высота дисплея в пикселях. Мы используем дисплей 128×64, поэтому ширина равна 128, а высота — 64.

Давайте очистим экран OLED-дисплея с помощью функции ssd1306_clear_screen(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — переменная типа invert, которая имеет значение false. Это означает, что фон будет темным, а текст будет отображаться белым.

Во-вторых, контрастность экрана устанавливается с помощью функции ssd1306_contrast(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — значение контрастности, которое представляет собой целочисленную переменную. Оно устанавливается равным 0xff.

После этого считываются данные с датчика DHT, а показания влажности получаются с помощью функции getHumidity(), а значение температуры — с помощью функции getTemperature(). Эти функции возвращают значения в формате float. Сначала мы преобразуем данные типа float в массив символов, округлим до двух десятичных знаков и добавим единицы измерения для каждого показания. Затем отобразим показания датчика на OLED-дисплее.

Для отображения показаний каждого датчика на OLED-экране мы вызовем функцию ssd1306_display_text. Она принимает пять параметров. Первый параметр — это адрес структуры SSD1306_t. Второй параметр — это номер страницы данных о составе, который устанавливается как '0' для показаний влажности и '2' для показаний температуры. Третий параметр — это текст, который мы хотим отобразить. Это массив символов для каждого показания датчика. Четвертый параметр — это длина текста. Наконец, пятый параметр — это переменная типа invert, которая является логической переменной. Она устанавливается в значение false. Это означает, что у нас темный фон, и текст будет отображаться белым цветом. Эта функция будет вызываться отдельно для каждого показания датчика и будет обновляться каждые две секунды.

Внутри функции app_main() мы вызовем xTaskCreate() для создания задачи DHT OLED, которая будет получать показания датчика DHT22 и выводить их на OLED-дисплей каждые две секунды.

Аппаратная конфигурация: OLED-дисплей, ESP32, датчик DHT22

Теперь давайте соберем нашу схему, подключив плату разработки ESP32 к OLED-дисплею и датчику DHT22.

Для работы OLED-дисплея требуется рабочее напряжение 3,3-5 В, поэтому вывод VCC OLED-дисплея можно подключить либо к выводу 3,3 В, либо к выводу Vin модуля ESP32. Выводы GND будут общими. Для подключения выводов I2C мы будем использовать стандартные выводы I2C платы ESP32. По умолчанию в ESP32 вывод GPIO22 настроен как вывод SCL, а вывод GPIO21 — как вывод SDA. Поэтому мы подключим вывод SDA дисплея к GPIO21, а вывод SCL дисплея — к GPIO22.

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

OLED-дисплей ESP32
VCC 3.3V
GND GND
SCL GPIO22
SDA GPIO21
ESP32 DHT22
VCC VCC
GND GND
GPIO27 Data

Соберите схему, как показано на принципиальной схеме ниже:

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

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

После успешной прошивки кода вы сможете увидеть в терминале ESP-IDF, что OLED-дисплей успешно сконфигурирован.

Сообщения в терминале ESP-IDF, свидетельствующие об успешной конфигурации OLED-дисплея

На OLED-экране начнут отображаться показания датчика DHT22, включая температуру в градусах Цельсия и влажность в процентах.

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

(Проголосуй первым!)
Загрузка...
9 просмотров

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

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