В этом проекте рассмотрим, как подключить плату ESP8266 NodeMCU к TFT-дисплею ST7789 SPI и цифровому датчику влажности и температуры DHT22 (AM2302 — RHT03). Значения температуры и относительной влажности печатаются на TFT-дисплее ST7789 соответственно в °C и rH%.
TFT-модуль ST7789 содержит одноименный контроллер дисплея: ST7789. Это цветной дисплей, использующий протокол SPI и требующий 3, 4 или 5 управляющих контактов, недорогой и простой в использовании.
Это IPS-дисплей, он бывает разных размеров (1,3″, 1,54″…), но все они должны иметь одинаковое разрешение 240×240 пикселей. Этот модуль работает только с 3,3 В и не поддерживает 5 В.
О датчике DHT22
Датчик DHT22 имеет следующие характеристики:
- Диапазон измерения влажности: 0 ~ 100% относительной влажности
- Точность измерения влажности: ±2% (макс. ±5%)
- Диапазон измерения температуры: -40 ~ 80 °C
- Точность измерения температуры: ± 0,5 ° C
- Рабочее напряжение: 3,3 В ~ 5,5 В
Требуемое оборудование:
- Плата ESP8266 NodeMCU
- Модуль дисплея ST7789 TFT
- Датчик влажности и температуры DHT22
- Резистор 4,7 кОм
- Кабель Micro USB (для программирования и питания всей схемы)
- Макетная плата
- Перемычки

NodeMCU со схемой датчика ST7789 TFT и DHT22 (AM2302)
Принципиальная схема проекта показана ниже.
Датчик DHT22 (AM2302) имеет 4 контакта (слева направо):
- контакт 1 — это контакт питания, подключенный к контакту NodeMCU 3V3,
- контакт 2 — это контакт вывода данных, подключенный к контакту D2 NodeMCU,
- контакт 3 — это контакт не подключен,
- контакт 4 — это контакт GND (земля), подключенный к контакту GND NodeMCU.
Так же необходим подтягивающий резистор 4,7 кОм, поскольку датчик DHT22 имеет выход с открытым стоком.
Модуль дисплея ST7789 , приведенный на принципиальной схеме, имеет 7 контактов: (справа налево):
- GND (земля),
- VCC (питание),
- SCL,
- SDA ,
- RES (сброс),
- DC,
- BLK (подсветка).
Модуль ST7789 TFT-дисплея подключается к плате NodeMCU следующим образом:
- GND подключен к контакту GND платы NodeMCU,
- VCC и BL подключен к контакту 3V3,
- SCL подключен к D5 (ESP8266EX GPIO14),
- SDA подключен к D7 (ESP8266EX GPIO13),
- RES подключен к D4 (ESP8266EX GPIO2),
- DC подключен к D3 (ESP8266EX GPIO0).
Если дисплейный модуль имеет контакт CS (выбор чипа), то его следует подключить к контакту D8 NodeMCU (GPIO15).
Подключение контакта BLK не является обязательным. Подсветка выключается, когда контакт BLK подключается к земле (GND).
Контакты D5 (GPIO14) и D7 (GPIO13) являются контактами аппаратного SPI микроконтроллера ESP8266EX.
Код
Для следующего кода потребуются 3 библиотеки от Adafruit Industries:
Первая библиотека — это драйвер для TFT-дисплея ST7789, который можно установить из диспетчера библиотек Arduino IDE (Sketch -> Include Library — > Управление библиотеками…, в поле поиска напишите «st7789» и установите ту, что от Adafruit).
Вторая библиотека — это графическая библиотека Adafruit GFX, которую также можно установить из менеджера библиотек Arduino IDE.
Третья библиотека предназначена для датчика DHT22, ее можно установить с помощью менеджера библиотек (в поле поиска напишите «dht» и выберите ту, что от Adafruit).
Возможно, вам потребуется установить библиотеку Adafruit Unified Sensor, если она еще не установлена.
Описание кода
Все три библиотеки включены в основной код следующим образом:
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <DHT.h> // Adafruit DHT library code
Соединение TFT-дисплея ST7789 с NodeMCU показано ниже, где дисплей подключен к аппаратному SPI-модулю NodeMCU (контакты: SCK и MOSI):
// ST7789 TFT module connections #define TFT_DC D3 // TFT DC pin is connected to NodeMCU pin D3 (GPIO0) #define TFT_RST D4 // TFT RST pin is connected to NodeMCU pin D4 (GPIO2) #define TFT_CS D8 // TFT CS pin is connected to NodeMCU pin D8 (GPIO15) // initialize ST7789 TFT library with hardware SPI module // SCK (CLK) ---> NodeMCU pin D5 (GPIO14) // MOSI(DIN) ---> NodeMCU pin D7 (GPIO13) Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
TFT-дисплей инициализируется с помощью следующей команды:
// if the display has CS pin try with SPI_MODE0 tft.init(240, 240, SPI_MODE2); // init ST7789 display 240x240 pixel
Определение типа датчика, подключение его контакта данных и инициализация библиотеки DHT:
#define DHTPIN D2 // DHT22 data pin is connected to NodeMCU pin D2 (GPIO4) #define DHTTYPE DHT22 // DHT22 sensor is used DHT dht22(DHTPIN, DHTTYPE); // configure DHT library
Полный код Ардуино:
/************************************************************************** * * Interfacing ESP8266 NodeMCU (ESP-12E) with ST7789 TFT display and * DHT22 (AM2302) digital humidity & temperature sensor. * This is a free software with NO WARRANTY. * https://simple-circuit.com/ * *************************************************************************/ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <DHT.h> // Adafruit DHT library code // ST7789 TFT module connections #define TFT_DC D3 // TFT DC pin is connected to NodeMCU pin D3 (GPIO0) #define TFT_RST D4 // TFT RST pin is connected to NodeMCU pin D4 (GPIO2) #define TFT_CS D8 // TFT CS pin is connected to NodeMCU pin D8 (GPIO15) // initialize ST7789 TFT library with hardware SPI module // SCK (CLK) ---> NodeMCU pin D5 (GPIO14) // MOSI(DIN) ---> NodeMCU pin D7 (GPIO13) Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); #define DHTPIN D2 // DHT22 data pin is connected to NodeMCU pin D2 (GPIO4) #define DHTTYPE DHT22 // DHT22 sensor is used DHT dht22(DHTPIN, DHTTYPE); // configure DHT library void setup(void) { // if the display has CS pin try with SPI_MODE0 tft.init(240, 240, SPI_MODE2); // init ST7789 display 240x240 pixel // if the screen is flipped, remove this command tft.setRotation(2); // fill the screen with black color tft.fillScreen(ST77XX_BLACK); tft.setTextWrap(false); // turn off text wrap option tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK); // set text color to green and black background tft.setTextSize(3); // text size = 3 tft.setCursor(15, 40); // move cursor to position (15, 27) pixel tft.print("TEMPERATURE:"); tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK); // set text color to yellow and black background tft.setCursor(43, 140); // move cursor to position (15, 27) pixel tft.print("HUMIDITY:"); tft.setTextSize(4); // text size = 4 // print °C tft.drawCircle(161, 77, 4, ST77XX_RED); // print degree symbol ( ° ) tft.drawCircle(161, 77, 5, ST77XX_RED); tft.setCursor(170, 71); tft.setTextColor(ST77XX_RED, ST77XX_BLACK); // set text color to red with black background tft.print("C"); // initialize DHT22 sensor dht22.begin(); } // main loop void loop() { delay(1000); // wait a second // read humidity in rH% int Humi = dht22.readHumidity() * 10; // read temperature in degrees Celsius int Temp = dht22.readTemperature() * 10; // print temperature (in °C) tft.setCursor(26, 71); tft.setTextColor(ST77XX_RED, ST77XX_BLACK); // set text color to red with black background if(Temp < 0) // if temperature < 0 tft.printf("-%02u.%1u", (abs(Temp)/10)%100, abs(Temp) % 10); else // temperature >= 0 tft.printf(" %02u.%1u", (Temp/10)%100, Temp % 10); // print humidity (in %) tft.setCursor(50, 171); tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK); // set text color to cyan and black background tft.printf("%02u.%1u %%", (Humi/10)%100, Humi % 10); } // end of code.