Wyświetlacz graficzny ILI9341 w ESPHome

Cześć.

Dlaczego prosty program który ma wyświetlić kilka literek na wyświetlaczu ili9341 zawiesza esp8266?
Po włączeniu dioda na esp kilka razy pomryga i zapala się na stałe, esp traci połączenie wifi.

esphome:
  name: ili9341
  friendly_name: ILI9341

esp8266:
  board: esp01_1m


# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "vHxxxxxxxxxxxxxxxxxxxxx0Jr6+2NQ="

ota:
  password: "9xxxxxxxxxxxxxxxx2766f1fe8"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ili9341 Fallback Hotspot"
    password: "C79W5pkiIZfP"


captive_portal:

font:
  - file: "BebasNeue-Regular.ttf"
    id: my_font
    size: 50



spi:
  clk_pin: 14    
  mosi_pin: 13  
  miso_pin: 12  
# Example minimal configuration entry
display:
  - platform: ili9xxx
    model: ili9341
    cs_pin: 4
    dc_pin: 2
    reset_pin: 0
    auto_clear_enabled: true
    update_interval: 10s
    rotation: 270
    lambda: |-
      it.print(165, 130, id(my_font), Color::BLACK, TextAlign::CENTER, "21 C");




Przy tej ilości informacji to zgadywanki.
Uwaga zgaduję - błędna definicja dla board?

Board faktycznie źle zdefiniowany ale to nie to.
Po ustawieniu na nodemcu nadal ten sam efekt.
A jakie jeszcze informacje są potrzebne?

Diagnozę po sprawdzeniu czy wszystko dobrze podłączyłem i skonfigurowałem bez oczywistych błędów logicznych jak board, zaczął bym od zebrania log’ów.

A Powiesz mi jak mam zrobić logi skoro napisałem że esp po wgraniu programu się zawiesza?

Napisałeś

a nie po wgraniu. Ale nie czepiając się logi można zbierać na etapie wgrywania, w ESPHome są też logi etapu kompulacji. Po kabelku można zbierać logi uruchomienia. Jeśli one nie wskazują na błąd, to zawsze należy pamiętać, że każde urządzenie działa najlepiej jak ma dobre zasilanie.

Edit:
A czytałeś dokumentację? Ona już wskazuje na możliwe przyczyny niepowodzenia. Jaką masz płytkę ESP?

Czytając różne wątki w sieci również doszedłem do wniosku że esp32 będzie lepszym wyjściem.
Moja płytka to nodemcu.

Po pierwsze

Czy plik BebasNeue-Regular.ttf umieściłeś w katalogu zawierającym twoje projekty ESPHome - standardowo jest to katalog, gdzie są YAMLe projektów.
Czy nazwa, którą użyłeś w YAML jest identyczna z faktyczną nazwą wrzuconego pliku czcionki? (to jest linux, wielkość liter ma znaczenie!)
To są warunki poprawnej kompilacji wsadu/firmware.

Popatrz na to - u siebie używam specjalnie utworzonych katalogów na takie dodatkowe zasoby jak obrazki czy fonty (można dzięki temu nie robić sobie bałaganu w głównym katalogu projektów, a te same zasoby bez problemu używać w rożnych urządzeniach)


Po drugie - istotnie ESP8266 jest pewnym ograniczeniem dla wyświetlaczy graficznych (zalecam na słabej sprzętowo platformie używać jakieś prostsze wyświetlacze, które nie wymagają gigantycznych zasobów, np. monochromatyczne niewielkie OLEDy o niedużej rozdzielczości o ile upierasz się na grafikę, jest to możliwe na miarę rozsądku w gospodarowaniu zasobami), no akurat ILI9341 nigdy nie próbowałem, więc nie wiem ile zasobów wymaga tak prosty projekt, ale myślę, że tak prosty projekt powinien się i skompilować i uruchomić


I tu wchodzi kwestia trzecia co z zasilaniem, jak się sprzęt zachowuje bez podłączonego wyświetlacza? Skąd zasilasz wyświetlacz?
Wrzuć jakieś fotki tego co skonstruowałeś.


kolejna cześć to analiza użytych GPIO

nie wiem jak się zachowuje wejście reset w tym wyświetlaczu (teoretycznie nie powinien to być problem, ale nie mam sprzętu to nie sprawdzę), ale generalnie używanie GPIO0 (w ESP8266 i kilku innych modelach ESP) do innych celów niż przycisku wyzwalanego manualnie niesie pewne ryzyko - ściągniecie go do masy uniemożliwia poprawne zabootowanie.

Warto mieć od ręką choćby jakiś prosty bryk z opisem jakie są potencjalne pułapki konstrukcyjne na danych GPIO w danym modelu MCU

z dokumentacji tej integracji

reset_pin (Optional, Pin Schema): The RESET pin.

więc nie musisz go używać (jeśli wyświetlacz będzie działał poprawnie)

warto znać schemat swojej płytki prototypowej - z racji wykorzystania GPIO2 do sterowania wlutowaną na płytce diodą LED, unikałbym używania GPIO2 jeśli nie mam pewności, że w danym zastosowaniu ta dioda nie będzie przeszkadzać

tak już poza wszystkim to się zastanawiam jaki jest sens pisania na czarno na wyświetlaczu, który defaultowo jest “zgaszony”, czyli masz wszystkie piksele czarne - czarny tekst na czarnym tle przecież nie jest widoczny, więc czuję że zerżnąłeś skądś cudzy kod i wklejasz go bez zrozumienia… i pewnie bez czytania dokumentacji


No i ostatnie - pokaż logi z kompilacji.

A więc.
Plik czcionki jest na miejscu, bez niego nie da się skompilować programu a tym bardziej go wgrać.
Pozamieniałem gpio według Twoich sugestii. Niczego to nie zmieniło.
Zauważyłem też coś dziwnego: po wgraniu programu esp traci jakby połączenie wifi bo nie da się zrobić logów, ale już ponownie da się wgrać program po wifi.
Przy próbie log-a mam dokładnie taki warning jak poniżej na końcu.

Tak wygląda log z wgrywania programu:

INFO ESPHome 2023.12.9
INFO Reading configuration /config/esphome/ili9341.yaml...
INFO Generating C++ source...
INFO Compiling app...
Processing ili9341 (board: nodemcuv2; framework: arduino; platform: platformio/espressif8266@3.2.0)
--------------------------------------------------------------------------------
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
Dependency Graph
|-- ESPAsyncTCP-esphome @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.1.0
|-- DNSServer @ 1.1.1
|-- ESP8266WiFi @ 1.0
|-- ESP8266mDNS @ 1.2
|-- noise-c @ 0.1.4
|-- SPI @ 1.0
Compiling .pioenvs/ili9341/src/main.cpp.o
Linking .pioenvs/ili9341/firmware.elf
RAM:   [====      ]  44.2% (used 36168 bytes from 81920 bytes)
Flash: [=====     ]  48.7% (used 508961 bytes from 1044464 bytes)
Building .pioenvs/ili9341/firmware.bin
esp8266_copy_factory_bin([".pioenvs/ili9341/firmware.bin"], [".pioenvs/ili9341/firmware.elf"])
========================= [SUCCESS] Took 22.39 seconds =========================
INFO Successfully compiled program.
INFO Connecting to 192.168.1.24
INFO Uploading /data/build/ili9341/.pioenvs/ili9341/firmware.bin (513120 bytes)
INFO Compressed to 356197 bytes
Uploading: [============================================================] 100% Done...

INFO Upload took 4.74 seconds, waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from 192.168.1.24 using esphome API
WARNING Can't connect to ESPHome API for ili9341 @ 192.168.1.24: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='192.168.1.24', port=6053))]: [Errno 111] Connect call failed ('192.168.1.24', 6053) (SocketAPIError)
INFO Trying to connect to ili9341 @ 192.168.1.24 in the background

Wyświetlacz cały świeci na biało a więc tekst czarny powinien być widoczny.

No i jeszcze log zrobiony po kablu:

[I][logger:351]: Log initialized
[C][ota:473]: There have been 10 suspected unsuccessful boot attempts.
[E][ota:480]: Boot loop detected. Proceeding to safe mode.
[I][app:029]: Running through setup()...
[C][wifi:038]: Setting up WiFi...
[C][wifi:051]: Starting WiFi...
[C][wifi:052]:   Local MAC: 2C:F4:32:3C:C0:77
[D][wifi:455]: Starting scan...
[D][wifi:470]: Found networks:
[I][wifi:513]: - 'Livebox-Kuranty' (D8:7D:7F:8C:C9:3C) [redacted]▂▄▆█
[D][wifi:515]:     Channel: 1
[D][wifi:516]:     RSSI: -59 dB
[D][wifi:518]: - 'Livebox-Kuranty_EXT'[redacted] (1C:3B:F3:01:D7:F1) [redacted]▂▄▆█
[D][wifi:518]: - 'Cyfrotel132'[redacted] (80:F7:A6:4D:BE:12) [redacted]▂▄▆█
[I][wifi:300]: WiFi Connecting to 'Livebox-Kuranty'...
[I][wifi:587]: WiFi Connected!
[C][wifi:405]:   Local MAC: 2C:F4:32:3C:C0:77
[C][wifi:410]:   SSID: 'Livebox-Kuranty'[redacted]
[C][wifi:411]:   IP Address: 192.168.1.24
[C][wifi:412]:   BSSID: D8:7D:7F:8C:C9:3C[redacted]
[C][wifi:414]:   Hostname: 'ili9341'
[C][wifi:416]:   Signal strength: -59 dB ▂▄▆█
[C][wifi:420]:   Channel: 1
[C][wifi:421]:   Subnet: 255.255.255.0
[C][wifi:422]:   Gateway: 192.168.1.1
[C][wifi:423]:   DNS1: 192.168.1.1
[C][wifi:424]:   DNS2: 0.0.0.0
[D][wifi:596]: Disabling AP...
[C][ota:097]: Over-The-Air Updates:
[C][ota:098]:   Address: ili9341.local:8266
[C][ota:101]:   Using Password.
[W][ota:106]: Last Boot was an unhandled reset, will proceed to safe mode in 0 restarts
[I][app:062]: setup() finished successfully!
[I][ota:493]: Waiting for OTA attempt.
[I][app:102]: ESPHome version 2023.12.9 compiled on Feb 18 2024, 18:03:57
[C][wifi:573]: WiFi:
[C][wifi:405]:   Local MAC: 2C:F4:32:3C:C0:77
[C][wifi:410]:   SSID: 'Livebox-Kuranty'[redacted]
[C][wifi:411]:   IP Address: 192.168.1.24
[C][wifi:412]:   BSSID: D8:7D:7F:8C:C9:3C[redacted]
[C][wifi:414]:   Hostname: 'ili9341'
[C][wifi:416]:   Signal strength: -59 dB ▂▄▆█
[C][wifi:420]:   Channel: 1
[C][wifi:421]:   Subnet: 255.255.255.0
[C][wifi:422]:   Gateway: 192.168.1.1
[C][wifi:423]:   DNS1: 192.168.1.1
[C][wifi:424]:   DNS2: 0.0.0.0
[C][logger:439]: Logger:
[C][logger:440]:   Level: DEBUG
[C][logger:441]:   Log Baud Rate: 115200
[C][logger:443]:   Hardware UART: UART0
[C][captive_portal:088]: Captive Portal:
[C][mdns:115]: mDNS:
[C][mdns:116]:   Hostname: ili9341
[C][ota:097]: Over-The-Air Updates:
[C][ota:098]:   Address: ili9341.local:8266
[C][ota:101]:   Using Password.
[W][ota:106]: Last Boot was an unhandled reset, will proceed to safe mode in 0 restarts

Więc prawdopodobnie model który posiadasz, ma kolory w negatywie, najlepiej wyświetlić szary tekst albo kawałek czarny i kawałek biały - będziesz wiedział, czy cokolwiek się wyświetla.

W ogóle na początek proponuję spróbować narysować jakieś kreski, zamiast generować bitmapy z pliku czcionki (nie wiadomo czy nie wadliwego), jest to z pewnością mniej zasobożerne, mimo, że z loga kompilacji wygląda = wydaje się, że wygenerowany kod na luzie zadziała na tym MCU.

Masz bootloopa, więc prawdopodobnie wygenerowane firmware jest wadliwe.

Proponuję jednak usiąść do dokumentacji i krok po kroku zweryfikować poprawność YAMLa.

Linter i kompilator nie zawsze wykrywa wszystkie możliwe błędy.
Zdefiniuj sobie wyświetlacz podając jego rzeczywistą rozdzielczość itd.

Nie ma nic w tym dziwnego - firmware przechodzi w safe mode.

W ogóle proponuję skompilować soft i wgrać po kablu, a nie przez OTA.

Dodatkowo aby się zabezpieczyć, że nie są linkowane jakieś wadliwe obiekty proponuję użyć funkcji Clean Build Files przed ponowną kompilacją i wgrywaniem po kabelku.

Naczytałem się internetów i wątków o niedziałaniu wyświetlacza ILI9341 z esp8266.
Zakupiłem esp32 i od strzała działa.
Swoją drogą mogli by umieścić info że pod esphome takie wyświetlacze nie działają z esp8266.

Nadal nie wiadomo jaka była przyczyna - czy brak zasobów czy coś innego, ESP32 ma zarówno większe zasoby od ESP8266, jak i mniej pułapek (bo ma więcej “zdrowych” GPIO w stosunku do tych które wymagają uwzględnienia ich ograniczeń).

Dla zbyt dużej rozdzielczości wyświetlacza można ograniczyć viewport jeśli zasobów brakuje.

PS Dlatego pisałem, żebyś uzupełnił definicję YAMLa w pełne dane wyświetlacza, to może by rzuciło cokolwiek światła na problem.

Wskazywałem na ten zapis w dokumentacji wyżej. Nie jest może jednoznaczny jak wiele innych w ESPHome ale jak dla mnie był od razu dobitna wskazówką, że brakuje u Ciebie zasobów.