В данной статье мы рассмотрим как подключить датчик DHT22, широко используемый для получения текущих показаний температуры и влажности, к плате ESP32 с помощью ESP-IDF. Будет кратко описано устройство датчика, его подключение к плате ESP32, а также настройка проекта в VS Code с расширением ESP-IDF для сбора данных с датчика и их отображения как на консоли, так и на OLED-дисплее SSD1306.
Также ранее на нашем сайте мы рассматривали подключение датчика DHT22 к ESP32 с помощью Arduino IDE.
Датчик DHT22
Датчик DHT22 (AM2302) — это простой и недорогой датчик температуры и влажности, использующий емкостной датчик влажности и терморезистор для расчета данных об окружающей атмосфере. Это включает относительную влажность и температуру окружающей среды. Это предварительно откалиброванный датчик, выдающий откалиброванный цифровой сигнал по протоколу 1-Wire. Поэтому его легко подключать к микроконтроллерам, например, к платам разработки ESP32, используя один вывод GPIO.
На приведенной ниже схеме показана распиновка датчика 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 к ESP32
Для подключения платы ESP32 к датчику DHT22 нам понадобятся следующие компоненты.
- Плата ESP32.
- Датчик DHT22.
- Резистор 10 кОм (не требуется при использовании модуля датчика DHT22).
- Макетная плата.
- Соединительные провода.
Соединения между устройствами указаны в таблице ниже:
| Контакт 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 и 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:
На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’) («Создать проект, используя шаблон sample_project»).
Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».
Это откроет проект, который мы создали на вкладке «Проводник». Внутри папки проекта находится несколько папок. Это справедливо для каждого проекта, который вы будете создавать с помощью ESP-IDF Explorer.
- Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. Создайте новую папку с именем 'components/DHT22' и добавьте в неё следующие файлы:

CMakeLists.txt
|
1 2 |
idf_component_register(SRCS "DHT22.c" INCLUDE_DIRS "include") |
DHT22.h
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* DHT22 temperature sensor driver */ #ifndef DHT22_H_ #define DHT22_H_ #define DHT_OK 0 #define DHT_CHECKSUM_ERROR -1 #define DHT_TIMEOUT_ERROR -2 // == function prototypes ======================================= void setDHTgpio(int gpio); void errorHandler(int response); int readDHT(); float getHumidity(); float getTemperature(); int getSignalLevel( int usTimeOut, bool state ); #endif |
DHT22.c
|
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
/*------------------------------------------------------------------------------ DHT22 temperature & humidity sensor AM2302 (DHT22) driver for ESP32 Jun 2017: Ricardo Timmermann, new for DHT22 Code Based on Adafruit Industries and Sam Johnston and Coffe & Beer. Please help to improve this code. This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. PLEASE KEEP THIS CODE IN LESS THAN 0XFF LINES. EACH LINE MAY CONTAIN ONE BUG !!! ---------------------------------------------------------------------------------*/ #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE #include <stdio.h> #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "driver/gpio.h" #include "DHT22.h" // == global defines ============================================= static const char* TAG = "DHT"; int DHTgpio = 4; // my default DHT pin = 4 float humidity = 0.; float temperature = 0.; // == set the DHT used pin========================================= void setDHTgpio( int gpio ) { DHTgpio = gpio; } // == get temp & hum ============================================= float getHumidity() { return humidity; } float getTemperature() { return temperature; } // == error handler =============================================== void errorHandler(int response) { switch(response) { case DHT_TIMEOUT_ERROR : ESP_LOGE( TAG, "Sensor Timeout\n" ); break; case DHT_CHECKSUM_ERROR: ESP_LOGE( TAG, "CheckSum error\n" ); break; case DHT_OK: break; default : ESP_LOGE( TAG, "Unknown error\n" ); } } /*------------------------------------------------------------------------------- ; ; get next state ; ; I don't like this logic. It needs some interrupt blocking / priority ; to ensure it runs in realtime. ; ;--------------------------------------------------------------------------------*/ int getSignalLevel( int usTimeOut, bool state ) { int uSec = 0; while( gpio_get_level(DHTgpio)==state ) { if( uSec > usTimeOut ) return -1; ++uSec; ets_delay_us(1); // uSec delay } return uSec; } /*---------------------------------------------------------------------------- ; ; read DHT22 sensor copy/paste from AM2302/DHT22 Docu: DATA: Hum = 16 bits, Temp = 16 Bits, check-sum = 8 Bits Example: MCU has received 40 bits data from AM2302 as 0000 0010 1000 1100 0000 0001 0101 1111 1110 1110 16 bits RH data + 16 bits T data + check sum 1) we convert 16 bits RH data from binary system to decimal system, 0000 0010 1000 1100 → 652 Binary system Decimal system: RH=652/10=65.2%RH 2) we convert 16 bits T data from binary system to decimal system, 0000 0001 0101 1111 → 351 Binary system Decimal system: T=351/10=35.1°C When highest bit of temperature is 1, it means the temperature is below 0 degree Celsius. Example: 1000 0000 0110 0101, T= minus 10.1°C: 16 bits T data 3) Check Sum=0000 0010+1000 1100+0000 0001+0101 1111=1110 1110 Check-sum=the last 8 bits of Sum=11101110 Signal & Timings: The interval of whole process must be beyond 2 seconds. To request data from DHT: 1) Sent low pulse for > 1~10 ms (MILI SEC) 2) Sent high pulse for > 20~40 us (Micros). 3) When DHT detects the start signal, it will pull low the bus 80us as response signal, then the DHT pulls up 80us for preparation to send data. 4) When DHT is sending data to MCU, every bit's transmission begin with low-voltage-level that last 50us, the following high-voltage-level signal's length decide the bit is "1" or "0". 0: 26~28 us 1: 70 us ;----------------------------------------------------------------------------*/ #define MAXdhtData 5 // to complete 40 = 5*8 Bits int readDHT() { int uSec = 0; uint8_t dhtData[MAXdhtData]; uint8_t byteInx = 0; uint8_t bitInx = 7; for (int k = 0; k<MAXdhtData; k++) dhtData[k] = 0; // == Send start signal to DHT sensor =========== gpio_set_direction( DHTgpio, GPIO_MODE_OUTPUT ); // pull down for 3 ms for a smooth and nice wake up gpio_set_level( DHTgpio, 0 ); ets_delay_us( 3000 ); // pull up for 25 us for a gentile asking for data gpio_set_level( DHTgpio, 1 ); ets_delay_us( 25 ); gpio_set_direction( DHTgpio, GPIO_MODE_INPUT ); // change to input mode // == DHT will keep the line low for 80 us and then high for 80us ==== uSec = getSignalLevel( 85, 0 ); // ESP_LOGI( TAG, "Response = %d", uSec ); if( uSec<0 ) return DHT_TIMEOUT_ERROR; // -- 80us up ------------------------ uSec = getSignalLevel( 85, 1 ); // ESP_LOGI( TAG, "Response = %d", uSec ); if( uSec<0 ) return DHT_TIMEOUT_ERROR; // == No errors, read the 40 data bits ================ for( int k = 0; k < 40; k++ ) { // -- starts new data transmission with >50us low signal uSec = getSignalLevel( 56, 0 ); if( uSec<0 ) return DHT_TIMEOUT_ERROR; // -- check to see if after >70us rx data is a 0 or a 1 uSec = getSignalLevel( 75, 1 ); if( uSec<0 ) return DHT_TIMEOUT_ERROR; // add the current read to the output data // since all dhtData array where set to 0 at the start, // only look for "1" (>28us us) if (uSec > 40) { dhtData[ byteInx ] |= (1 << bitInx); } // index to next byte if (bitInx == 0) { bitInx = 7; ++byteInx; } else bitInx--; } // == get humidity from Data[0] and Data[1] ========================== humidity = dhtData[0]; humidity *= 0x100; // >> 8 humidity += dhtData[1]; humidity /= 10; // get the decimal // == get temp from Data[2] and Data[3] temperature = dhtData[2] & 0x7F; temperature *= 0x100; // >> 8 temperature += dhtData[3]; temperature /= 10; if( dhtData[2] & 0x80 ) // negative temp, brrr it's freezing temperature *= -1; // == verify if checksum is ok =========================================== // Checksum is the sum of Data 8 bits masked out 0xFF if (dhtData[4] == ((dhtData[0] + dhtData[1] + dhtData[2] + dhtData[3]) & 0xFF)) return DHT_OK; else return DHT_CHECKSUM_ERROR; } |
- Теперь перейдите к файлу main.c. В папке main находится исходный код, то есть файл main.c будет находиться здесь. Перейдите в папку main > main.c и откройте его. Скопируйте приведенный ниже код из этого файла и сохраните его.
Код ESP32 для работы с датчиком DHT22
|
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 |
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "rom/ets_sys.h" #include "nvs_flash.h" #include "driver/gpio.h" #include "sdkconfig.h" #include "DHT22.h" void DHT_reader_task(void *pvParameter) { setDHTgpio(GPIO_NUM_27); while(1) { printf("DHT Sensor Readings\n" ); int ret = readDHT(); errorHandler(ret); printf("Humidity %.2f %%\n", getHumidity()); printf("Temperature %.2f degC\n\n", getTemperature()); vTaskDelay(2000 / portTICK_RATE_MS); } } void app_main() { nvs_flash_init(); vTaskDelay(2000 / portTICK_RATE_MS); xTaskCreate(&DHT_reader_task, "DHT_reader_task", 2048, NULL, 5, NULL ); } |
Как работает код?
Для начала мы подключим необходимые библиотеки для этого проекта. Это включает драйвер GPIO, библиотеку DHT22 и библиотеки FreeRTOS. Мы будем использовать файл driver/gpio.h, поскольку используем вывод GPIO ESP32 для доступа к цифровому значению датчика. Библиотеки FreeRTOS будут использоваться для создания задержек и задач. Кроме того, API-интерфейсы DHT22.h будут использоваться для доступа к показаниям влажности и температуры.
|
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "rom/ets_sys.h" #include "nvs_flash.h" #include "driver/gpio.h" #include "sdkconfig.h" #include "DHT22.h" |
Внутри функции DHT_reader_task() сначала устанавливается контакт GPIO, подключенный к контакту данных, с помощью функции setDHTgpio(). Эта функция принимает один параметр — номер контакта GPIO ESP32, с которого будут выводиться данные датчика.
Затем внутри бесконечного цикла while мы начнем считывать данные с датчика DHT22 каждые 2 секунды, используя функцию readDHT(). Функция errorHandler() проверяет наличие ответа после считывания данных с DHT22. Для получения показаний влажности в процентах используется функция getHumidity(). Она возвращает показания влажности в виде числа с плавающей запятой. Аналогично, для получения показаний температуры в градусах Цельсия используется функция getTemperature(). Она также возвращает показания температуры в виде числа с плавающей запятой. Показания обоих датчиков считываются непрерывно с задержкой в 2 секунды. Обратите внимание, что частота дискретизации датчика DHT22 составляет 0,5 Гц, что означает, что он выдает новые показания каждые 2 секунды. Следовательно, задержка по времени имеет важное значение.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void DHT_reader_task(void *pvParameter) { setDHTgpio(GPIO_NUM_27); while(1) { printf("DHT Sensor Readings\n" ); int ret = readDHT(); errorHandler(ret); printf("Humidity %.2f %%\n", getHumidity()); printf("Temperature %.2f degC\n\n", getTemperature()); vTaskDelay(2000 / portTICK_RATE_MS); } } |
Внутри функции app_main() мы сначала инициализируем NVS, вызвав функцию nvs_flash_init(). Затем используем xTaskCreate() для создания задачи чтения DHT22, которая будет получать показания датчика DHT22 и выводить их в консоль каждые 3 секунды.
|
1 2 3 4 5 6 |
void app_main() { nvs_flash_init(); vTaskDelay(1000 / portTICK_RATE_MS); xTaskCreate(&DHT_reader_task, "DHT_reader_task", 2048, NULL, 5, NULL ); } |
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода вы сможете просматривать показания температуры и влажности на консоли, которые обновляются каждые 2 секунды.
Отображение показаний DHT22 на OLED-дисплее
Теперь давайте создадим ещё один проект, в котором мы запрограммируем нашу плату ESP32 для получения показаний датчика DHT22 и отображения их на 0,96-дюймовом OLED-дисплее SSD1306.
Создание проекта
Выполните все те же шаги для создания аналогичного проекта, что и раньше. Однако на этот раз нам также необходимо добавить библиотеку для OLED-дисплея.
- Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. После добавления библиотек DHT22 перейдём к добавлению библиотек ssd1306. В папке components создайте новую папку с именем 'ssd1306' и добавьте все файлы, доступные по этой ссылке . Это включает в себя все файлы, перечисленные ниже:

Настройки 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-дисплеем, а затем нажать кнопку «Сохранить» вверху. Мы оставим настройки конфигурации по умолчанию, поскольку они соответствуют нашему модулю.
- Теперь перейдите к файлу main.c. В папке main находится исходный код, то есть файл main.c будет находиться здесь. Перейдите в папку main > main.c и откройте его. Скопируйте приведенный ниже код из этого файла и сохраните его.
Код ESP32 для отображения показаний датчика DHT22 на OLED-дисплее
|
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 |
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "rom/ets_sys.h" #include "nvs_flash.h" #include "driver/gpio.h" #include "sdkconfig.h" #include "driver/i2c.h" #include "esp_err.h" #include "DHT22.h" #include "ssd1306.h" void DHT_Oled_task(void *pvParameter) { setDHTgpio(GPIO_NUM_27); SSD1306_t dev; i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); ssd1306_init(&dev, 128, 64); ssd1306_clear_screen(&dev, false); ssd1306_contrast(&dev, 0xff); while(1) { int ret = readDHT(); errorHandler(ret); float hum = getHumidity(); char humidity[8]; sprintf(humidity, "%.2f %%", hum); float temp = getTemperature(); char temperature[12]; sprintf(temperature, "%.2f degC", temp); ssd1306_display_text(&dev, 0, humidity, 8, false); ssd1306_display_text(&dev, 2, temperature, 12, false); vTaskDelay(2000 / portTICK_RATE_MS); } } void app_main() { nvs_flash_init(); vTaskDelay(2000 / portTICK_RATE_MS); xTaskCreate(&DHT_Oled_task, "DHT_Oled_task", 2048*2, NULL, 5, NULL ); } |
Как работает код?
Большая часть кода идентична коду предыдущего проекта, где мы получали показания датчика DHT22 каждые 2 секунды. Однако на этот раз вместо отображения показаний на терминале ESP-IDF мы стремимся вывести их на OLED-дисплей. Давайте рассмотрим части кода, где мы используем OLED-дисплей. Остальные функции для получения показаний температуры и влажности от датчика DHT22 остались прежними.
Внутри функции DHT_Oled_task() мы сначала инициализируем интерфейс I2C. Интерфейс I2C будет сконфигурирован путем вызова функции i2c_master_init() и передачи в качестве параметров адреса структуры SSD1306_t, выводов SDA, SCL и Reset. Это настроит ведущее устройство ESP32 на прослушивание ведомых устройств на шине I2C.
|
1 2 |
SSD1306_t dev; i2c_master_init(&dev, CONFIG_SDA_GPIO, CONFIG_SCL_GPIO, CONFIG_RESET_GPIO); |
После этого мы инициализируем OLED-дисплей, вызвав функцию ssd1306_init(). Она принимает три параметра. Первый параметр — это адрес структуры SSD1306_t, второй — ширина, а третий — высота дисплея в пикселях. Мы используем дисплей 128×64, поэтому ширина равна 128, а высота — 64.
|
1 |
ssd1306_init(&dev, 128, 64); |
Давайте очистим экран OLED-дисплея с помощью функции ssd1306_clear_screen(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — переменная типа invert, которая имеет значение false. Это означает, что фон будет темным, а текст будет отображаться белым.
|
1 |
ssd1306_clear_screen(&dev, false); |
Во-вторых, контрастность экрана устанавливается с помощью функции ssd1306_contrast(). Эта функция принимает два параметра. Первый — это адрес структуры SSD1306_t, а второй — значение контрастности, которое представляет собой целочисленную переменную. Оно устанавливается равным 0xff.
|
1 |
ssd1306_contrast(&dev, 0xff); |
После этого считываются данные с датчика DHT, а показания влажности получаются с помощью функции getHumidity(), а значение температуры — с помощью функции getTemperature(). Эти функции возвращают значения в формате float. Сначала мы преобразуем данные типа float в массив символов, округлим до двух десятичных знаков и добавим единицы измерения для каждого показания. Затем отобразим показания датчика на OLED-дисплее.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
while(1) { int ret = readDHT(); errorHandler(ret); float hum = getHumidity(); char humidity[8]; sprintf(humidity, "%.2f %%", hum); float temp = getTemperature(); char temperature[12]; sprintf(temperature, "%.2f degC", temp); ssd1306_display_text(&dev, 0, humidity, 8, false); ssd1306_display_text(&dev, 2, temperature, 12, false); vTaskDelay(2000 / portTICK_RATE_MS); } |
Для отображения показаний каждого датчика на OLED-экране мы вызовем функцию ssd1306_display_text. Она принимает пять параметров. Первый параметр — это адрес структуры SSD1306_t. Второй параметр — это номер страницы данных о составе, который устанавливается как '0' для показаний влажности и '2' для показаний температуры. Третий параметр — это текст, который мы хотим отобразить. Это массив символов для каждого показания датчика. Четвертый параметр — это длина текста. Наконец, пятый параметр — это переменная типа invert, которая является логической переменной. Она устанавливается в значение false. Это означает, что у нас темный фон, и текст будет отображаться белым цветом. Эта функция будет вызываться отдельно для каждого показания датчика и будет обновляться каждые две секунды.
|
1 2 3 4 |
ssd1306_display_text(&dev, 0, humidity, 8, false); ssd1306_display_text(&dev, 2, temperature, 12, false); vTaskDelay(2000 / portTICK_RATE_MS); |
Внутри функции app_main() мы вызовем xTaskCreate() для создания задачи DHT OLED, которая будет получать показания датчика DHT22 и выводить их на OLED-дисплей каждые две секунды.
|
1 2 3 4 5 6 |
void app_main() { nvs_flash_init(); vTaskDelay(2000 / portTICK_RATE_MS); xTaskCreate(&DHT_Oled_task, "DHT_Oled_task", 2048*2, NULL, 5, NULL ); } |
Аппаратная конфигурация: 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 |
Соберите схему, как показано на принципиальной схеме ниже:
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода вы сможете увидеть в терминале ESP-IDF, что OLED-дисплей успешно сконфигурирован.
На OLED-экране начнут отображаться показания датчика DHT22, включая температуру в градусах Цельсия и влажность в процентах.
7 просмотров










