ГрафичСский интСрфСйс Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… пСрСстал Π±Ρ‹Ρ‚ΡŒ Ρ€ΠΎΡΠΊΠΎΡˆΡŒΡŽ β€” с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ LVGL (Light and Versatile Graphics Library) Π΄Π°ΠΆΠ΅ Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π½Ρ‹Π΅ ESP32 способны ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈ слоТныС элСмСнты управлСния. Но интСграция LVGL с Arduino IDE часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ вопросы: ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ дисплСй, ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π΅ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти? Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ.

ΠœΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡƒΡŽ установку, Π½ΠΎ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ ускорСния LVGL Π½Π° ESP32 Π·Π° счёт Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… особСнностСй Ρ‡ΠΈΠΏΠ° β€” ΠΎΡ‚ использования Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ядра Π΄ΠΎ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройки Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π°. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ стандартныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· рСпозитория LVGL тормозят Π½Π° ESP32, ΠΈ ΠΊΠ°ΠΊ это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±Π΅Π· ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½ΠΎΠ³ΠΎ ΠΆΠ΅Π»Π΅Π·Π°. А Π΅Ρ‰Ρ‘ β€” Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ схСмы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для популярных дисплССв (ILI9341, ST7789, SSD1306) с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ особСнностСй ΠΈΡ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ².

1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ LVGL Π½Π° ESP32 β€” Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€?

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ESP32 с Π΅Π³ΠΎ Π΄Π²ΡƒΡ…ΡŠΡΠ΄Π΅Ρ€Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΈ 520 ΠšΠ‘ SRAM каТСтся идСальной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ для LVGL. Однако Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вносит ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:

  • πŸ”‹ ΠŸΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти: LVGL ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ выдСляСт Π±ΡƒΡ„Π΅Ρ€ ΠΊΠ°Π΄Ρ€Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ с экран, Ρ‡Ρ‚ΠΎ ΡΡŠΠ΅Π΄Π°Π΅Ρ‚ Π΄ΠΎ 30% доступной SRAM Π½Π° дисплСях с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ 320Γ—240.
  • ⚑ ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ слоТных Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, lv_chart ΠΈΠ»ΠΈ lv_anim) ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄ΠΎ 50 мс Π½Π° ΠΊΠ°Π΄Ρ€, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ Π»Π°Π³Π°ΠΌ.
  • πŸ”Œ ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ SPI/DMA: НС всС дисплСи ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ DMA-ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ CPU Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ врСмя Π½Π° Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ пиксСлСй.

ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€” Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚: LVGL Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»Π°ΡΡŒ для систСм с ОБ (Linux, FreeRTOS), Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ управлСния Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. На Π³ΠΎΠ»ΠΎΠΌ ESP32 Π±Π΅Π· RTOS эти ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ приходится ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НапримСр, стандартный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ lv_demo_widgets ΠΈΠ· рСпозитория LVGL ΠΏΡ€ΠΈ компиляции для ESP32 Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1.2 ΠœΠ‘ Flash ΠΈ 220 ΠšΠ‘ RAM β€” это 40% ΠΎΡ‚ доступных рСсурсов!

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Wi-Fi/Bluetooth ΠΈ LVGL, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ESP32 Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎ 128 ΠšΠ‘ RAM для сСтСвого стСка. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для LVGL останСтся всСго ~300 ΠšΠ‘, Ρ‡Π΅Π³ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ интСрфСйс с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ 160Γ—128.
πŸ“Š Какой дисплСй Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ESP32 ΠΈ LVGL?
  • ILI9341 (320Γ—240)
  • ST7789 (240Γ—240)
  • SSD1306 (OLED, 128Γ—64)
  • GC9A01 (240Γ—240)
  • Π”Ρ€ΡƒΠ³ΠΎΠΉ

2. Установка LVGL Π² Arduino IDE: пошаговая инструкция

Начнём с Π±Π°Π·ΠΎΠ²ΠΎΠΉ установки. Π’Π°ΠΌ понадобятся:

  • πŸ“₯ Arduino IDE вСрсии 1.8.19+ (ΠΈΠ»ΠΈ PlatformIO для ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ).
  • πŸ”§ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° LVGL (вСрсия 8.3+). Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ вСрсии Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ESP32 Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ².
  • πŸ–₯️ Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, TFT_eSPI для ILI9341 ΠΈΠ»ΠΈ Adafruit_GFX для SSD1306.

Π¨Π°Π³ΠΈ установки:

  1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Arduino IDE ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π‘ΠΊΠ΅Ρ‚Ρ‡ β†’ ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ β†’ Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ.
  2. Π’ поискС Π²Π²Π΅Π΄ΠΈΡ‚Π΅ lvgl ΠΈ установитС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ LVGL by kisvegabor (Π°Π²Ρ‚ΠΎΡ€ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ).
  3. УстановитС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя. Для ILI9341 рСкомСндуСтся TFT_eSPI β€” ΠΎΠ½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для ESP32 ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ DMA.
  4. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ lvgl_esp32_drivers β€” это ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ LVGL с Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ возмоТностями ESP32.

ПослС установки ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: Π€Π°ΠΉΠ» β†’ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β†’ LVGL β†’ lvgl_demo_widgets. Но Π½Π΅ ΡΠΏΠ΅ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ! Π‘Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Arduino IDE 1.8.19+|Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ LVGL 8.3+|Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя (TFT_eSPI/Adafruit_GFX)|Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ lvgl_esp32_drivers|ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² lv_conf.h-->

3. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ LVGL для ESP32: Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ?

Π€Π°ΠΉΠ» lv_conf.h β€” сСрдцС настройки LVGL. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для ПК, Π° Π½Π΅ для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ². Π’ΠΎΡ‚ критичСскиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ для ESP32:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ESP32 ПояснСниС
LV_MEM_CUSTOM 0 1 Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ кастомный Π°Π»Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€ памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.
LV_MEM_SIZE УнаслСдовано ΠΎΡ‚ систСмы (32U * 1024U) (32 ΠšΠ‘) ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ использованиС памяти LVGL. Для слоТных интСрфСйсов ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎ 64 ΠšΠ‘.
LV_DISP_DEF_REFR_PERIOD 30 16 Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°Π΄Ρ€Π°ΠΌΠΈ (мс), ускоряя Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.
LV_TICK_CUSTOM 0 1 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ESP32 для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ отсчёта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ОсобоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»ΠΈΡ‚Π΅ настройкС LV_DISP_DEF_REFR_PERIOD. ΠŸΡ€ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ 30 интСрфСйс Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ 30 Ρ€Π°Π· Π² сСкунду, Π½ΠΎ Π½Π° ESP32 это часто ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ подёргиваниям. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” 16 (60 FPS), Π½ΠΎ для слоТных Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎ 30.

Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² platformio.ini (ΠΈΠ»ΠΈ настройтС Π² Arduino IDE) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ компилятора для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

build_flags =

-D LV_CONF_INCLUDE_SIMPLE

-D LV_COLOR_DEPTH=16

-D LV_TICK_CUSTOM

-D LV_TICK_CUSTOM_INCLUDE="lvgl_esp32_drivers.h"

-D LV_TICK_CUSTOM_SYS_TIME_EXPR=(uint32_t)(esp_timer_get_time() / 1000LL)

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ TFT_eSPI, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² lv_conf.h ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LV_USE_LOG (установитС Π² 0). Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎ 10% процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ESP32 ΠΈΠ·-Π·Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Serial.
πŸ’‘

Для ускорСния компиляции Π² Arduino IDE Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² preferences.txt строку compiler.warning_level=none. Π­Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, Π½ΠΎ сократит врСмя сборки Π½Π° 20-30%.

4. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ дисплСя ΠΊ ESP32: схСмы ΠΈ Π½ΡŽΠ°Π½ΡΡ‹

Π’Ρ‹Π±ΠΎΡ€ дисплСя опрСдСляСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ внСшний Π²ΠΈΠ΄ интСрфСйса, Π½ΠΎ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы. Рассмотрим Ρ‚Ρ€ΠΈ популярных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

4.1. ILI9341 (320Γ—240, SPI)

Π‘Π°ΠΌΡ‹ΠΉ распространённый TFT-дисплСй для ESP32. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎ SPI, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ настройки ΠΏΠΈΠ½ΠΎΠ² для максимальной скорости:

  • πŸ”Œ SPI-ΡˆΠΈΠ½Ρ‹: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ VSPI (ΠΏΠΈΠ½Ρ‹ GPIO 18-23), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ HSPI ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с flash-ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.
  • ⚑ Π’Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: УстановитС частоту SPI Π½Π° 40 ΠœΠ“Ρ† (максимум для ILI9341).
  • πŸ”„ DMA: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² TFT_eSPI ΠΎΠΏΡ†ΠΈΡŽ #define SPI_FREQUENCY 40000000 ΠΈ #define SPI_READ_FREQUENCY 20000000.

4.2. ST7789 (240Γ—240, SPI)

Π‘ΠΎΠ»Π΅Π΅ соврСмСнная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ILI9341 с Π»ΡƒΡ‡ΡˆΠ΅ΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ. Π“Π»Π°Π²Π½Ρ‹ΠΉ нюанс β€” Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСгистра 0x36 (ориСнтация экрана). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для настройки:

tft.init(240, 240, SPI_MODE2);

tft.setRotation(2); // ΠŸΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π° 180 градусов, Ссли ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎ

tft.writecommand(0x36);

tft.writedata(0x70); // Π Π΅ΠΆΠΈΠΌ отобраТСния: RGB (Π½Π΅ BGR!)

4.3. SSD1306 (OLED, 128Γ—64, I2C)

ИдСалСн для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ энСргопотрСблСниСм. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎ I2C, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: LVGL Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС для ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Ρ‹Ρ… дисплССв. РСшСниС β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ Π² 1 ΠšΠ‘:

#define LV_COLOR_DEPTH=1  // ΠœΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

#define LV_DISP_BUF_SIZE (128 * 8) // Π‘ΡƒΡ„Π΅Ρ€ Π½Π° 1 строку экрана

Для всСх дисплССв ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ напряТСниС питания! ILI9341 ΠΈ ST7789 Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ 3.3Π’, Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ 5Π’ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΈΡ… ΠΈΠ· строя. Для SSD1306 допустимо 5Π’ Π½Π° ΠΏΠΈΠ½Π΅ VCC, Π½ΠΎ логичСскиС ΡƒΡ€ΠΎΠ²Π½ΠΈ (SDA/SCL) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ 3.3Π’.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ссли дисплСй ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹?

АртСфакты (полосы, мСрцания, Π±ΠΈΡ‚Ρ‹Π΅ пиксСли) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ связаны с трСмя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ:

1. **ΠΠ΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅**: Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ кондСнсатор 100 ΠΌΠΊΠ€ ΠΌΠ΅ΠΆΠ΄Ρƒ VCC ΠΈ GND дисплСя.

2. **Блишком высокая частота SPI**: ΠŸΠΎΠ½ΠΈΠ·ΡŒΡ‚Π΅ Π΄ΠΎ 20 ΠœΠ“Ρ† Π² настройках TFT_eSPI.

3. **ΠŸΠ»ΠΎΡ…ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ паяныС соСдинСния ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ экран с Ρ€Π°Π·ΡŠΡ‘ΠΌΠΎΠΌ FPC вмСсто ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ² "ΠΏΠ°ΠΏΠ°-ΠΌΠ°ΠΌΠ°".

5. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ LVGL Π½Π° ESP32?

Π”Π°ΠΆΠ΅ послС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ настройки LVGL ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ. Π’ΠΎΡ‚ 5 практичСских способов ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ:

  • 🧠 Π”Π²ΡƒΡ…ΡŠΡΠ΄Π΅Ρ€Π½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³: ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ LVGL Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ядро ESP32 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ xTaskCreatePinnedToCore. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
    xTaskCreatePinnedToCore(
    

    lvgl_task, // Ѐункция с Ρ†ΠΈΠΊΠ»ΠΎΠΌ lv_timer_handler()

    "LVGL", // Имя Π·Π°Π΄Π°Ρ‡ΠΈ

    4096, // Π Π°Π·ΠΌΠ΅Ρ€ стСка

    NULL, // ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

    2, // ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

    NULL, // Π₯Π΅Π½Π΄Π»Π΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ

    1 // Π―Π΄Ρ€ΠΎ 1 (Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ядро)

    );

  • πŸ–ΌοΈ УмСньшСниС Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π°: ВмСсто полноэкранного Π±ΡƒΡ„Π΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΡƒΡ„Π΅Ρ€ Π½Π° 1/4 экрана:
    #define LV_DISP_BUF_SIZE (LV_HOR_RES_MAX * 60)  // Π‘ΡƒΡ„Π΅Ρ€ Π½Π° 60 строк
  • 🎨 ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²: Π’ lv_conf.h ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ элСмСнты:
    #define LV_USE_ARC       0
    

    #define LV_USE_CALENDAR 0

    #define LV_USE_CHART 0 // Если Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ эффСктивный ΠΏΡ€ΠΈΡ‘ΠΌ β€” ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ статичСских элСмСнтов. Если Ρƒ вас Π΅ΡΡ‚ΡŒ нСизмСняСмыС части интСрфСйса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅), Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² setup() ΠΈ сохраняйтС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€:

LV_IMG_DECLARE(background_img);

lv_obj_t *bg = lv_img_create(lv_scr_act(), NULL);

lv_img_set_src(bg, &background_img);

lv_obj_set_pos(bg, 0, 0);

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ использовании Wi-Fi/Bluetooth вмСстС с LVGL ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ автоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ экрана Π² Ρ†ΠΈΠΊΠ»Π΅ loop(). ВмСсто этого обновляйтС экран ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ ΠΈΠ»ΠΈ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ:
void loop() {

lv_task_handler(); // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий LVGL

delay(5); // Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° для освобоТдСния CPU

}

πŸ’‘

Π‘Π°ΠΌΡ‹ΠΉ эффСктивный способ ускорСния LVGL Π½Π° ESP32 β€” комбинация Π΄Π²ΡƒΡ…ΡŠΡΠ΄Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π° Π΄ΠΎ 1/4 экрана. Π­Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ прирост FPS Π½Π° 30-50% Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ качСства.

6. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ LVGL ΠΈ ESP32. Π’ΠΎΡ‚ Ρ‚ΠΎΠΏ-5 ошибок ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

Ошибка ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
Π‘Π΅Π»Ρ‹ΠΉ экран ΠΏΡ€ΠΈ запускС НСвСрная инициализация дисплСя ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΠΈΠ½ΠΎΠ² SPI. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ pinout Π² TFT_eSPI ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ CS-ΠΏΠΈΠ½ дисплСя Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с flash-ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (GPIO 5 Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½!).
LVGL Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° касания НС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроСн тачскрин (XPT2046, FT6236). Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² lv_conf.h:
#define LV_USE_INDEV 1

#define LV_INDEV_DEF_READ_PERIOD 20

Π’Ρ‹Π»Π΅Ρ‚ ΠΏΠΎ Hardware Watchdog LVGL Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° врСмя Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° (>5 сСк). Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ watchdog ΠΈΠ»ΠΈ пСрСнСситС LVGL Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ядро (см. Ρ€Π°Π·Π΄Π΅Π» 5).
АртСфакты ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ НСдостаточный Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π° ΠΈΠ»ΠΈ низкая частота SPI. Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ LV_DISP_BUF_SIZE Π΄ΠΎ LV_HOR_RES_MAX * 30 ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ качСство паяных соСдинСний.

ОсобСнно ΠΊΠΎΠ²Π°Ρ€Π½Π° ошибка с Hardware Watchdog. Она проявляСтся спонтанно, ΠΊΠΎΠ³Π΄Π° LVGL пытаСтся ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ слоТный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, lv_chart с 100 Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ). РСшСниС β€” Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Π½Π° части с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ lv_refr_now:

for (int i = 0; i < 100; i++) {

lv_chart_set_next(chart, series, data[i]);

if (i % 10 == 0) lv_refr_now(NULL); // ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 10 Ρ‚ΠΎΡ‡Π΅ΠΊ

}

7. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: создаём Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ с Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌΠΈ

Рассмотрим созданиС простого Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Π° с ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΈ влаТности). ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° доступСн здСсь.

Π¨Π°Π³ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ экран ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊ:
    lv_obj_t *chart = lv_chart_create(lv_scr_act(), NULL);
    

    lv_chart_set_range(chart, 0, 100); // Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

    lv_chart_set_type(chart, LV_CHART_TYPE_LINE);

    lv_chart_series_t *series = lv_chart_add_series(chart, LV_COLOR_RED);

  2. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ стили:
    lv_obj_set_size(chart, 200, 150);
    

    lv_chart_set_div_line_count(chart, 5, 5); // Π‘Π΅Ρ‚ΠΊΠ° 5Γ—5

    lv_chart_set_point_count(chart, 30); // 30 Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅

  3. ΠžΠ±Π½ΠΎΠ²Π»ΡΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅ loop():
    void loop() {
    

    static uint32_t last_ms = 0;

    if (millis() - last_ms > 1000) { // ОбновлСниС Ρ€Π°Π· Π² сСкунду

    last_ms = millis();

    float temp = readTemperature();

    lv_chart_set_next(chart, series, temp);

    lv_refr_now(NULL);

    }

    lv_task_handler();

    }

Для отобраТСния тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ lv_label:

lv_obj_t *label = lv_label_create(lv_scr_act(), NULL);

lv_label_set_text_fmt(label, "Temp: %.1fΒ°C", temp);

lv_obj_align(label, chart, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);

Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΊ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ lv_anim для ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ обновлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ измСнСния Ρ†Π²Π΅Ρ‚Π° сСрии:

lv_anim_t a;

lv_anim_init(&a);

lv_anim_set_var(&a, series);

lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_chart_set_series_color);

lv_anim_set_values(&a, LV_COLOR_RED, LV_COLOR_BLUE);

lv_anim_set_time(&a, 1000); // Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 1 сСкунда

lv_anim_start(&a);

FAQ: ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° частыС вопросы

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ LVGL Π½Π° ESP32 Π±Π΅Π· Arduino IDE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ESP-IDF)?

Π”Π°, Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ. Π’ ESP-IDF Π½ΡƒΠΆΠ½ΠΎ:

  1. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ исходники LVGL ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.
  2. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ CMakeLists.txt для компиляции LVGL с Ρ„Π»Π°Π³Π°ΠΌΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (-Os).
  3. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя Ρ‡Π΅Ρ€Π΅Π· SPI Master ΠΈΠ»ΠΈ I2C ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ESP-IDF.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ ESP-IDF β€” Π»ΡƒΡ‡ΡˆΠ°Ρ оптимизация ΠΊΠΎΠ΄Π° (Π½Π° 10-15% быстрСС, Ρ‡Π΅ΠΌ Π² Arduino IDE). НСдостаток β€” ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ².

Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти LVGL Π½Π° ESP32?

Π’ΠΎΡ‚ 4 способа:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ LV_COLOR_DEPTH=16 вмСсто 32 (экономит 50% памяти Π½Π° Π±ΡƒΡ„Π΅Ρ€ ΠΊΠ°Π΄Ρ€Π°).
  • ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ антиалиасинг: #define LV_ANTIALIAS 0.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ сТатыС ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹: LV_FONT_DECLARE(lv_font_montserrat_12_compressed).
  • Π Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚Π΅ слоТныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, lv_calendar) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСобходимости, Π° Π½Π΅ Π² setup().
ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ касании экрана LVGL зависаСт Π½Π° 1-2 сСкунды?

Π­Ρ‚ΠΎ типичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΈ использовании рСзистивных тачскринов (XPT2046). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

  1. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ тачскрина ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ слишком часто (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 20 мс).
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° события касания Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ основной ΠΏΠΎΡ‚ΠΎΠΊ.

РСшСниС: ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» опроса Π² lv_conf.h:

#define LV_INDEV_DEF_READ_PERIOD 100  // ΠžΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π· Π² 100 мс

И пСрСнСситС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ касаний Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ядро.

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ LVGL вмСстС с BLE Π½Π° ESP32?

Π”Π°, Π½ΠΎ с ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ:

  • BLE Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎ 50 ΠšΠ‘ RAM, поэтому для LVGL останСтся ~270 ΠšΠ‘ (ΠΏΡ€ΠΈ ΠΎΠ±Ρ‰Π΅ΠΉ SRAM 320 ΠšΠ‘).
  • РСкомСндуСтся ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ сканированиС устройств Π² Ρ„ΠΎΠ½Π΅ (esp_ble_gap_stop_scanning()), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ потрСбляСт CPU.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ lv_tick_inc(5) вмСсто Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ минимальной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для совмСстимости:

#define LV_DISP_BUF_SIZE (LV_HOR_RES_MAX * 20)  // Π‘ΡƒΡ„Π΅Ρ€ Π½Π° 20 строк

#define LV_MEM_SIZE (16U * 1024U) // 16 ΠšΠ‘ для LVGL

Как ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ LVGL Π΄ΠΎ послСднСй вСрсии Π² Arduino IDE?

Π’ Arduino IDE Π½Π΅Ρ‚ встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° обновлСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. Π£Π΄Π°Π»ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ LVGL ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ ~/Documents/Arduino/libraries/lvgl.
  2. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ с GitHub (Π²Π΅Ρ‚ΠΊΠ° release/v8.3).
  3. РаспакуйтС Π°Ρ€Ρ…ΠΈΠ² Π² ΠΏΠ°ΠΏΠΊΡƒ libraries ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ Π² lvgl.
  4. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ lv_conf.h (скопируйтС свой ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΈΠ· старой вСрсии).

ПослС обновлСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с вашим Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ дисплСя β€” Π² Π½ΠΎΠ²Ρ‹Ρ… вСрсиях LVGL ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ сигнатуры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, lv_obj_set_pos β†’ lv_obj_set_x/lv_obj_set_y).