Раньше я уже имел опыт работы с платами lilygo в ESPHome (использую две платы LILYGO T-Display), и никаких проблем с ними не возникало. Но потребовался мне тут экран побольше, и приобрёл я довольно старую плату LILYGO T4 V1.3 с дисплеем ILI9341 на 2.8 дюйма:
Однако с полпинка в ESPHome мне её запустить не удалось, и я потратил два вечера только на то, чтобы на экране хоть что-то отрисовалось. Все инструкции и примеры настройки этой платы в ESPHome, которые я смог найти, оказались устаревшими и не компилировались.
Внешне это выглядело как полностью мёртвый дисплей, в то время как прошивка успешно прошивалась и плата выходила на связь по WiFi, отображая свои логи в Home Assistant. И в логах при этом вылезала ошибка модуля display.
В итоге проблем оказалось две, и из-за этого я долго не мог понять, что же эта железяка не хочет работать? Уж не сжёг ли я её ненароком, небрежно елозя голыми контактами плату по столу с бардаком из токопроводящих предметов?
Как вернуть заводскую прошивку в LILYGO T4 V1.3
Для проверки живости дисплея решил даже вернуть в плату её заводскую тестовую прошивку, и... на гитхабе lilygo её не оказалось! И вообще нигде её не оказалось. Прошивка для версии платы 1.2 есть, а для 1.3 нет. А там отличия по пинам, прошивки не взаимозаменяемы.
Что ж, хоть исходники есть, пришлось компилировать их в Arduino IDE. Но и тут не всё прошло гладко, так как библиотеки за это время тоже успели обновиться.
Прежде, чем прошивать LILYGO T4 V1.3 из Arduino IDE, нужно выполнить настройки этой среды. Всё это делается по инструкции со страницы lilygo на GitHub.
Сначала нужно установить библиотеку TFT_eSPI (меню Скетч -> Подключить библиотеку -> Управлять библиотеками). Там несколько библиотек с похожими именами, нужна именно с таким именем:
Затем скачать с гитхаба весь исходный код LilyGo_Txx и распаковать архив:
Папку Buttons2 из архива (которая внутри папки lib) нужно скопировать в папку libraries Arduino IDE. Затем в библиотеке TFT_eSPI в файле User_Setup_Select.h закомментировать строку #include <User_Setup.h> и раскомментировать строку #include <User_Setups/Setup22_TTGO_T4_v1.3.h>, я это делал просто в блокноте:
Затем нужно выполнить установку пакета "esp32 by Espressif Systems" для прошивки плат с ESP32, если этого ещё не было сделано ранее (меню Инструменты -> Плата: "..." ->Менеджер плат):
И после этого нужно выполнить настройки, указанные в пункте 4 на гитхабе lilygo, и можно компилировать и прошивать.
Но при попытке скомпилировать проект я получил ошибку функции ledcSetup():
Опять пришлось копаться в интернете в поисках решения проблемы. Оказалось, что API с тех пор поменялся:
И теперь это нужно делать иначе:
Изменив код исходника в этой части, он, наконец, скомпилировался и прошился. Бузер, к слову, на моей плате не работал изначально, уж не знаю в чём дело, но он мне и не нужен. Главное - экран ожил, отобразив тестовое меню. Значит не сдох, уже хорошо.
Дальнейшие копания и попытки запуска дисплея с уже снова с прошивкой ESPHome привели к следующим выводам.
Включение PSRAM
Во-первых, в ESPHome по умолчанию не включена PSRAM (Pseudo SRAM) - это дополнительный чип памяти в модуле ESP32, используемый для буферизации данных, отображаемых дисплеем:
Основной памяти для работы дисплея не хватает, и ESPHome не может выделить для него требуемый объём, выдавая ошибку инициализации компонента памяти (Failed to init Memory: YES!) и ошибку компонента display (Component display is marked FAILED):
В конфигурацию платы в ESPHome необходимо добавить компонент psram:
psram:
mode: octal
speed: 80MHz
Включение подсветки дисплея
Во-вторых, led-подсветка дисплея по умолчанию тоже выключена, и её нужно явно включить, чего не требовалось делать на платах LILYGO T-Display с дисплеем st7789v. В этой части в ESPHome для дисплеев ili9341 с некоторых пор также произошли изменения, и теперь недостаточно просто указать пин светодиодной подсветки в настройках модуля display (точнее - его там теперь вообще указать невозможно).
Для включения подсветки нужно использовать компонент light и указывать пин подсветки в компоненте output:
output:
- platform: ledc
pin: 4
id: backlight_display
light:
- platform: monochromatic
output: backlight_display
id: back_light
restore_mode: ALWAYS_ON
Конфигурация компонента display
Кроме всего прочего, изменилось и имя платформы для дисплеев ili9341 в компоненте display, и теперь правильная конфигурация этого дисплея выглядит так:
display:
- platform: ili9xxx
model: ili9341
invert_colors: false
cs_pin: 27
dc_pin: 32
reset_pin: 5
lambda: |-
Конфигурация SPI
Ну и не забываем подключить компонент интерфейса SPI для связи дисплея с ESP32, тут ничего не изменилось и всё делается как прежде:
spi:
clk_pin: 18
mosi_pin: 23
Кстати, пин MISO рекомендуется не указывать в данном случае, чтобы сэкономить ресурсы, так как передача данных осуществляется только в одном направлении - от ESP32 к дисплею.
Полная конфигурация дисплея LILYGO T4 V1.3
После выполнения всех этих шагов дисплей наконец-то ожил и начал всё корректно отрисовывать:
Полная конфигурация для дисплея платы LILYGO T4 V1.3 выглядит так:
spi:
clk_pin: 18
mosi_pin: 23
psram:
mode: octal
speed: 80MHz
output:
- platform: ledc
pin: 4
id: backlight_display
light:
- platform: monochromatic
output: backlight_display
id: back_light
restore_mode: ALWAYS_ON
display:
- platform: ili9xxx
model: ili9341
invert_colors: false
cs_pin: 27
dc_pin: 32
reset_pin: 5
lambda: |-
it.image(0, 0, id(img));
image:
rgb:
- file: "image.png"
id: img