- PVSM.RU - https://www.pvsm.ru -

В IoT системах роль терминала чаще всего выполняет смартфон или компьютер. Но иногда и в умном доме удобно иметь автономную операторскую панель
На сайте Makerfabs в разделе OpenHardware появились интеллектуальные дисплеи Sunton 4.3″, 5″ и 7″ [1] на базе ESP32S3. Из них и герой обзора — панель ESP32-8048S070, купленная на Алиэкспресс за 3000 руб. вместе с доставкой [2].



Свел в табличку доступные аналогичные дисплеи. Первые два, Nextion и DWIN, программируются своим специализированным софтом и работают только с внешним контроллером по UART интерфейсу. Вывести на них произвольную картинку из интернета не так и просто.
Дисплей от ELECROW очень близок к обозреваемому по схемотехнике и функционалу. Только при покупке на Алиэкспресс дороже почти в полтора раза. И использует другую библиотеку LovyanGFX.
| Производитель | NEXTION | DWIN | ELECROW | MAKERFABS |
| Марка | NX8048T070 [3] | DMG80480C070 [4] | DIS06043H [5] | ESP32-8048S070 [6] |
| Экран |
TFT 800x600
|
|||
| Интерфейс | RGB565 16бит | RGB666 18бит | RGB565 16бит | RGB565 16бит |
| Сенсор | Резистивный | Емкостной | Емкостной | Емкостной |
| MPU | STM32 | T5L ASIC | ESP32S3 N4R8 | ESP32S3 N16R8 |
| Программирование | Nextion Editor | DWIN UI Designer | LVGL, LovyanGFX | LVGL, Arduino GFX |
| Цена на Али (*) | 9137,59 [7] | 3427,80 [8] | 4466,73 [9] | 3151,68 [2] |
(*) — Цена с доставкой в Пермь на момент написания статьи



Отдельного WYSISYG редактора интерфейса, как у NEXTION, у данного дисплея нет. Хотя можно использовать Squareline Studio [12], генерирующий код для фреймвока LVGL. Вместо этого предлагается программирование в среде Arduino IDE. В магазине есть ссылка на папку на гугл-диске с файлами для всей линейки дисплеев данного производителя [13].
В данном архиве кроме руководства и схем имеются бинарники прошивки, драйвера и библиотеки с примерами, к слову, довольно старые.
Последние версии ставятся из менеджера библиотек Arduino IDE

Для программирования нужно взять последнюю ESP32 Core for Arduino IDE с поддержкой новых модулей ESP32S2, ESP32S3 и ESP32C3
Если взять библиотеки из архива, то в принципе, примеры собираются и работают. Но когда я поставил последнюю версию библиотеки Arduino_GFX от Moononournatio, выяснилось, что формат функций работы с шиной RGB 16 bit поменялся. Можно конечно было остаться на старой библиотеке, но есть вероятность рано или поздно получить несовместимость. И придется программировать в старой IDE со старым набором библиотек. Лучше разобраться.
Итак, в старой версии мы имеем такое определение шины и экземпляра GFX с пинами нашего дисплея:
Arduino_ESP32RGBPanel *bus = new Arduino_ESP32RGBPanel(
GFX_NOT_DEFINED /* CS */, GFX_NOT_DEFINED /* SCK */, GFX_NOT_DEFINED /* SDA */,
41 /* DE */, 40 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */,
14 /* R0 */, 21 /* R1 */, 47 /* R2 */, 48 /* R3 */, 45 /* R4 */,
9 /* G0 */, 46 /* G1 */, 3 /* G2 */, 8 /* G3 */, 16 /* G4 */, 1 /* G5 */,
15 /* B0 */, 7 /* B1 */, 6 /* B2 */, 5 /* B3 */, 4 /* B4 */
);
// option 1:
// 7寸 50PIN 800*480
Arduino_RPi_DPI_RGBPanel *gfx = new Arduino_RPi_DPI_RGBPanel(
bus,
800 /* width */, 0 /* hsync_polarity */, 210 /* hsync_front_porch */, 30 /* hsync_pulse_width */, 16 /* hsync_back_porch */,
480 /* height */, 0 /* vsync_polarity */, 22 /* vsync_front_porch */, 13 /* vsync_pulse_width */, 10 /* vsync_back_porch */,
1 /* pclk_active_neg */, 16000000 /* prefer_speed */, true /* auto_flush */);
В документации по нашему интерфейсу [19] видим новый формат конструктора Arduino_ESP32RGBPanel. Ну и вместо класса Arduino_RPi_DPI_RGBPanel, используемого во всех примерах, нужно теперь применять Arduino_RGB_Display. Итоговое объявление получилось
таким:
Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel(
41 /* DE */, 40 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */,
14 /* R0 */, 21 /* R1 */, 47 /* R2 */, 48 /* R3 */, 45 /* R4 */,
9 /* G0 */, 46 /* G1 */, 3 /* G2 */, 8 /* G3 */, 16 /* G4 */, 1 /* G5 */,
15 /* B0 */, 7 /* B1 */, 6 /* B2 */, 5 /* B3 */, 4 /* B4 */,
0 /* hsync_polarity */, 210 /* hsync_front_porch */, 30 /* hsync_pulse_width */, 16 /* hsync_back_porch */,
0 /* vsync_polarity */, 22 /* vsync_front_porch */, 13 /* vsync_pulse_width */, 10 /* vsync_back_porch */);
Arduino_RGB_Display *gfx = new Arduino_RGB_Display(800, 480, rgbpanel);
Теперь любой пример можно собрать заменив параметры конструктора класса дисплея.
Для сборки всех скетчев Arduino для данного дисплея нужно выбрать в менеджере плат ESP32S3 Dev Module, а в меню модуля выбрать Flash Size — 16MB (128Mb) и PSRAM — OPI PSRAM
Примеры и LvglWidgets и lvgl_music_gt911_7.0 собираются только после того как папка demos библиотеки LVGL помещается внутрь src. Ну и файл lv_cinfig.h из каталога с примером нужно поместить в корневой каталог всех библиотек Arduino


Для начала нужно преобразовать саму картинку в двухмерную матрицу (768000 байт на картинку 800х460 16бит/пиксел). Для этого рyководство AdafruitGFX отсылает на онлайновый сервис Image2Cpp.

Полученный результат нужно вставить в файл Img.h И положить его рядом с файлом скетча. Сам скетч предельно простой
#include <Arduino_GFX_Library.h>
#include "Img.h" //Файл с картинкой
#define TFT_BL 2
Arduino_ESP32RGBPanel *rgbpanel;
Arduino_RGB_Display *gfx;
void setup() {
Serial.begin(115200);
delay(1000);
// Инициализация дисплея
rgbpanel = new Arduino_ESP32RGBPanel(
41 /* DE */, 40 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */,
14 /* R0 */, 21 /* R1 */, 47 /* R2 */, 48 /* R3 */, 45 /* R4 */,
9 /* G0 */, 46 /* G1 */, 3 /* G2 */, 8 /* G3 */, 16 /* G4 */, 1 /* G5 */,
15 /* B0 */, 7 /* B1 */, 6 /* B2 */, 5 /* B3 */, 4 /* B4 */,
0 /* hsync_polarity */, 210 /* hsync_front_porch */, 30 /* hsync_pulse_width */, 16 /* hsync_back_porch */,
0 /* vsync_polarity */, 22 /* vsync_front_porch */, 13 /* vsync_pulse_width */, 10 /* vsync_back_porch */);
gfx = new Arduino_RGB_Display(800, 480, rgbpanel);
gfx->begin();
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
gfx->fillScreen(BLACK);
// Выдача картинки с подсчетом затраченного времени
uint32_t ms = millis();
gfx->draw16bitRGBBitmap(0,0,(uint16_t *)sav001,800,480);
ms = millis() - ms;
Serial.printf("Load IMG %ld msn",ms);
}
void loop() {
delay(1000);
}
Выдача картинки записанной флэш-памяти ESP32 происходит за 61мс, что дает скорость выдачи примерно 12 кадров/сек

Данный скетч реализует пять простейших экранных кнопок с фиксацией нажатия
#include <Arduino_GFX_Library.h>
#include <Wire.h>
#include <TAMC_GT911.h>
#define TFT_BL 2
#define BTN_HEIGHT 100
#define BTN_WIDTH 150
struct btn_t {
int x;
int y;
char text[10];
bool enable;
} btns[] = {
{0,100,"BTN01",false},
{160,100,"BTN02",false},
{320,100,"BTN03",false},
{480,100,"BTN04",false},
{640,100,"BTN05",false}
};
int btn_n = 5;
Arduino_ESP32RGBPanel *rgbpanel;
Arduino_RGB_Display *gfx;
TAMC_GT911 tp(19, 20, -1, 38, 800, 480);
void setup() {
Serial.begin(115200); //Инициализация порта отладки
delay(1000);
tp.begin(); // Инициализация сенсорного экрана
tp.setRotation(ROTATION_INVERTED);
// Инициализация дисплея
rgbpanel = new Arduino_ESP32RGBPanel(
41 /* DE */, 40 /* VSYNC */, 39 /* HSYNC */, 42 /* PCLK */,
14 /* R0 */, 21 /* R1 */, 47 /* R2 */, 48 /* R3 */, 45 /* R4 */,
9 /* G0 */, 46 /* G1 */, 3 /* G2 */, 8 /* G3 */, 16 /* G4 */, 1 /* G5 */,
15 /* B0 */, 7 /* B1 */, 6 /* B2 */, 5 /* B3 */, 4 /* B4 */,
0 /* hsync_polarity */, 210 /* hsync_front_porch */, 30 /* hsync_pulse_width */, 16 /* hsync_back_porch */,
0 /* vsync_polarity */, 22 /* vsync_front_porch */, 13 /* vsync_pulse_width */, 10 /* vsync_back_porch */);
gfx = new Arduino_RGB_Display(800, 480, rgbpanel);
gfx->begin();
pinMode(TFT_BL, OUTPUT); //Включение дисплея
digitalWrite(TFT_BL, HIGH);
gfx->fillScreen(BLACK);
for( int i=0; i<btn_n; i++)displayBTN(i); //Начальная отрисовка кнопок
}
uint32_t ms0 = 0;
void loop() {
uint32_t ms = millis();
tp.read();
if( ms0 == 0 || ms - ms0 > 500 ){ // Убираем дребезг виртуальных кнопок (задержка 0.5 сек)
if (tp.isTouched){
ms0 = ms;
int x = tp.points[0].x;
int y = tp.points[0].y;
int n_new = -1;
int n_old = -1;
for( int i=0; i<btn_n; i++){
if( btns[i].enable )n_old = i;
if( x > btns[i].x && x < btns[i].x+BTN_WIDTH && y > btns[i].y && y < btns[i].y+BTN_HEIGHT )n_new = i;
}
Serial.printf("x=%d y=%d old=%d new=%d ms=%ldn",x,y,n_old,n_new,ms0);
if( n_new >= 0 && n_old == n_new ){ //Если нажата та же кнопка, инвертируем состояние
btns[n_new].enable = !btns[n_new].enable;
displayBTN(n_new);
}
else if( n_new >=0 ){ //Фиксируем нажатую кнопку
btns[n_new].enable = true;
displayBTN(n_new);
if( n_old >= 0 ){ //Убираем предыдущую кнопку
btns[n_old].enable = false;
displayBTN(n_old);
}
}
}
}
}
// Отображение одной кнопки из структуры
void displayBTN(int i){
if( i<0 || i>= btn_n )return;
struct btn_t btn = btns[i];
uint16_t color_back = BLACK, color_border = LIGHTGREY, color_text = DARKGREEN;
if( btn.enable ){
color_back = DARKGREEN;
color_border = LIGHTGREY;
color_text = WHITE;
}
gfx->fillRect(btn.x,btn.y,BTN_WIDTH,BTN_HEIGHT,color_back);
gfx->drawRect(btn.x,btn.y,BTN_WIDTH,BTN_HEIGHT,color_border);
gfx->drawRect(btn.x+1,btn.y+1,BTN_WIDTH-2,BTN_HEIGHT-2,color_border);
gfx->setCursor(btn.x+20, btn.y+30);
gfx->setTextSize(4);
gfx->setTextColor(color_text);
gfx->print(btn.text);
}

В интернете ходит выражение «Что вы вы не делали из ESP, получится метеостанция» )))
Вот и у меня получилась метеостанция. Корпус на 3Д принтере:

и скетч выдающий на экран время, дату, пробки в городе, температуру в комнате, за окном и прогноз. Приводить его здесь не буду, так как все это завязано на IoT систему ThingBoard (открывается только через VPN или Proxy) [20], на которой у меня крутится «умный дом». «Но это уже совсем другая история © [21]» которая выходит за рамки обзора данной панели.

Но в целом панель просто огонь по соотношению возможности и цены. Пусть пока повисит в качестве метеостанции, но в дальнейшем планирую ей место пульта управления в умном доме.
Автор:
sav13
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/385999
Ссылки в тексте:
[1] Makerfabs в разделе OpenHardware появились интеллектуальные дисплеи Sunton 4.3″, 5″ и 7″: https://www.makerfabs.com/cooperator.html
[2] купленная на Алиэкспресс за 3000 руб. вместе с доставкой: https://aliexpress.ru/item/1005004952726089.html
[3] NX8048T070: https://nextion.tech/datasheets/nx8048t070/
[4] DMG80480C070: https://www.dwin-global.com/7-0-inch-function-evaluation-board-with-t5l-asic-2-product/
[5] DIS06043H: https://www.elecrow.com/esp32-display-7-inch-hmi-display-rgb-tft-lcd-touch-screen-support-lvgl.html
[6] ESP32-8048S070: https://www.makerfabs.com/sunton-esp32-s3-7-inch-tn-display-with-touch.html
[7] 9137,59: https://aliexpress.ru/item/1005005415750265.html
[8] 3427,80: https://aliexpress.ru/item/1005003379434413.html
[9] 4466,73: https://aliexpress.ru/item/1005005760925482.html
[10] ESP32-S3-WROOM-1-N16R8 (16Мб flash + 8Мб PSRAM): https://www.espressif.com/sites/default/files/documentation/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf
[11] емкостной пятиточечный GT911: https://www.distec.de/fileadmin/pdf/produkte/Touchcontroller/DDGroup/GT911_Datasheet.pdf
[12] использовать Squareline Studio: https://squareline.io/
[13] ссылка на папку на гугл-диске с файлами для всей линейки дисплеев данного производителя: https://drive.google.com/drive/folders/1S9Joi5JY6v9B5mvOLreeGPJ5nowEc1zA?spm=a2g2w.detail.0.1.227f64418iKj7f
[14] Графическая библиотека RGB Parallel 16 bit Arduino_GFX от Moononournatio: https://github.com/moononournation/Arduino_GFX
[15] TAMC_GT911: https://github.com/TAMCTec/gt911-arduino
[16] GT911 Touch library: https://github.com/alex-code/GT911
[17] Библиотека для работы с ЦАП MAX98357 ESP32-audioI2S: https://github.com/schreibfaul1/ESP32-audioI2S
[18] Ну и очень мощный фреймворк для разработки пользовательского интерфейса LVGL: https://github.com/lvgl/lvgl
[19] В документации по нашему интерфейсу: https://github.com/moononournation/Arduino_GFX/wiki/Data-Bus-Class#rgb-interface
[20] ThingBoard (открывается только через VPN или Proxy): https://thingsboard.io/
[21] Но это уже совсем другая история ©: https://otvet.mail.ru/question/188919793
[22] Данная статья в моем блоге: http://samopal.pro/lvgl_esp32_1/
[23] Источник: https://habr.com/ru/articles/748198/?utm_source=habrahabr&utm_medium=rss&utm_campaign=748198
Нажмите здесь для печати.