New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add GC9A01 round TFT display #3625
Conversation
do you mean 1.28"? The only Waveshare 1.8" display is not round. Does your display work with this library? https://github.com/PaintYourDragon/Adafruit_GC9A01A |
I actually managed to get it to work. Sorry for the confusion. |
Can you please share the yaml you used to get this display working? |
Probably something like:
|
I'm getting this error when trying to install with the above YAML. Not 100% sure how esphome works in the background, any help would be appreciated.
|
@sam632 please you could have a try with:
|
This didn't work unfortunately. What's the best way to debug this issue? |
There hasn't been any activity on this pull request recently. This pull request has been automatically marked as stale because of that and will be closed if no further activity occurs within 7 days. Thank you for your contributions. |
I'd love to see this implemented as these displays are fairly cheap and widely available. How could I help with this PR without having any language knowledge? |
Why is this stale? I'm using this PR component and works without any problems. |
Hi @pkejval yes it works, it should be maintained aligned with dev branch (there are some conflicts). |
I've been working with this external component (Thanks @4cello !!!), and it works quite well. The only issue I've had so far is I cannot get it to drive two of these displays from one ESP32; you just use separate Here's a basic Hello World example of what I'm troubleshooting with, trimmed down as much as possible to test with. Any thoughts? esphome:
name: "round-display"
friendly_name: ESP32 Round Display
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: [redacted]
ota:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
ap:
ssid: "Esphome-Round-Display"
password: !secret ap
captive_portal:
external_components:
- source: github://4cello/esphome@gc9a01
components: ["gc9a01"]
spi:
mosi_pin: GPIO23
clk_pin: GPIO18
font:
- file: 'fonts/Google_Sans_Regular.ttf'
id: font_16
size: 16
time:
- platform: sntp
id: my_time
display:
## First display <-- Nothing displays, when Second Display is configured. Works fine if comment out Second Display
- platform: gc9a01
id: roundOLED1
reset_pin: GPIO26
cs_pin: GPIO5
dc_pin: GPIO25
rotation: 90
lambda: |-
it.strftime(120,80, id(font_16), TextAlign::CENTER, "%A %b %w", id(my_time).now());
## Second display <-- Displays dateTime data as expected.
- platform: gc9a01
id: roundOLED2
reset_pin: GPIO26
cs_pin: GPIO15
dc_pin: GPIO25
rotation: 90
lambda: |-
it.strftime(120,80, id(font_16), TextAlign::CENTER, "%A %b %w", id(my_time).now()); |
this->dc_pin_->digital_write(true); | ||
|
||
if (this->eightbitcolor_) { | ||
for (size_t line = 0; line < this->get_buffer_length(); line = line + this->get_width_internal()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This loop is extreamly slow. Sending pixel data on 40MHz SPI takes 30ms, but this loop for 240x240 on ESP32S3 (160MHz clock) takes ~200ms.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed this too specifically on the ESP32S3, other variants seem normal refresh speed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With 40MHz and using 16bit refresh takes roughly ~30ms for the 240x240 on esp32s3.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For me (using esp32s2) setting eight_bit_color: false
in yaml configuration results in a broken image and loss of connectivity. Leaving the default (true) works fine but with the long update as mentioned above.
edit - I am actually using an esp32s2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mcmanigle can you add an photo from your broken image on your display?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Issue is here: https://imgur.com/a/CKaTwWo
It obviously also overflows memory or otherwise breaks things somehow -- note the sensors aren't reading right; wifi connectivity is non-existent, etc in the eight_bit_color: false
version (everything else stays the same compared to version on the left).
I assumed it was crashing the ESP entirely (I usually use wifi logs etc), but when plugged in, see that it does pass messages from the display component. Also note the central RGB circles (added for debugging) change color; looks like wrong bits written.
My display code is here; it uses DATA_RATE_40MHZ
and changes DisplayBufferRef to DisplayRef but no other changes.
For reference, on this esp32s2 (specifically this one; note in my earlier post I mentioned s3, but I was wrong; it's an s2), with eight_bit_display: false, the logger complains the display update takes 160ms. With eight_bit_display on (default), it says it takes 260ms.
class GC9A01 : public PollingComponent, | ||
public display::DisplayBuffer, | ||
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, | ||
spi::DATA_RATE_8MHZ> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm able to use DATA_RATE_40MHZ
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
spi::DATA_RATE_8MHZ> { | |
spi::DATA_RATE_40MHZ> { |
ESP_LOGD(TAG, " START"); | ||
dump_config(); | ||
ESP_LOGD(TAG, " END"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ESP_LOGD(TAG, " START"); | |
dump_config(); | |
ESP_LOGD(TAG, " END"); |
dump_config(); | ||
ESP_LOGD(TAG, " END"); | ||
|
||
display_init_(INITCMD); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
display_init_(INITCMD); | |
this->display_init_(INITCMD); |
int GC9A01::get_height_internal() { return height_; } | ||
|
||
int GC9A01::get_width_internal() { return width_; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
int GC9A01::get_height_internal() { return height_; } | |
int GC9A01::get_width_internal() { return width_; } | |
int GC9A01::get_height_internal() { return this->height_; } | |
int GC9A01::get_width_internal() { return this->width_; } |
this->cs_->digital_write(true); | ||
|
||
this->init_reset_(); | ||
delay(100); // NOLINT |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please alter this code to use a set_timeout
instead of delaying
class GC9A01 : public PollingComponent, | ||
public display::DisplayBuffer, | ||
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, | ||
spi::DATA_RATE_8MHZ> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
spi::DATA_RATE_8MHZ> { | |
spi::DATA_RATE_40MHZ> { |
Hello! When using this PR I'm getting an error with the latest esphome version (2023.12.5):
the config is
UPD: looks like this happens because of #6009 being merged some days ago |
Hello! I'm having an issue with the same config. Did you find a way around it? |
We need to wait until PR owner will issue a fix to code.
|
hey @bearpawmaxim Thanks for lending a hand here.. still getting a compile error using your fork: Looks like
|
I had the same issue too, I've made my own fork from @bearpawmaxim 's which seemed to work for me
|
That is strange because it works for me) |
@ParineetVernekar Thanks for jumping in. I tried your fork, and get a bit further, but still erroring on a parameter in using: external_components:
- source: github://ParineetVernekar/esphome@pr3625fix
components: [gc9a01] compile output: Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_common_loader.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_clock_init.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_flash.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_mem.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_random.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_random_esp32c3.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_utility.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/esp_image_format.o
src/main.cpp: In function 'void setup()':
src/main.cpp:3384:53: error: cannot declare parameter 'it' to be of abstract type 'esphome::display::DisplayBuffer'
roundOLED1->set_writer([=](display::DisplayBuffer it) -> void {
~~~~~~~~~~~~~~~~~~~~~~~^~
In file included from src/esphome.h:19,
from src/main.cpp:3:
src/esphome/components/display/display_buffer.h:15:7: note: because the following virtual functions are pure within 'esphome::display::DisplayBuffer':
class DisplayBuffer : public Display {
^~~~~~~~~~~~~
In file included from src/esphome/components/api/proto.h:3,
from src/esphome/components/api/api_pb2.h:5,
from src/esphome/components/api/api_connection.h:4,
from src/esphome.h:3,
from src/main.cpp:3:
src/esphome/core/component.h:302:16: note: 'virtual void esphome::PollingComponent::update()'
virtual void update() = 0;
^~~~~~
In file included from src/esphome.h:18,
from src/main.cpp:3:
src/esphome/components/display/display.h:434:23: note: 'virtual esphome::display::DisplayType esphome::display::Display::get_display_type()'
virtual DisplayType get_display_type() = 0;
^~~~~~~~~~~~~~~~
In file included from src/esphome.h:19,
from src/main.cpp:3:
src/esphome/components/display/display_buffer.h:25:15: note: 'virtual int esphome::display::DisplayBuffer::get_height_internal()'
virtual int get_height_internal() = 0;
^~~~~~~~~~~~~~~~~~~
src/esphome/components/display/display_buffer.h:26:15: note: 'virtual int esphome::display::DisplayBuffer::get_width_internal()'
virtual int get_width_internal() = 0;
^~~~~~~~~~~~~~~~~~
src/esphome/components/display/display_buffer.h:29:16: note: 'virtual void esphome::display::DisplayBuffer::draw_absolute_pixel_internal(int, int, esphome::Color)'
virtual void draw_absolute_pixel_internal(int x, int y, Color color) = 0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
<unicode string>:277:4: error: no matching function for call to 'esphome::gc9a01::GC9A01::set_writer(setup()::<lambda(esphome::display::DisplayBuffer)>)'
In file included from src/esphome.h:18,
from src/main.cpp:3:
src/esphome/components/display/display.h:411:8: note: candidate: 'void esphome::display::Display::set_writer(esphome::display::display_writer_t&&)'
void set_writer(display_writer_t &&writer);
^~~~~~~~~~
src/esphome/components/display/display.h:411:8: note: no known conversion for argument 1 from 'setup()::<lambda(esphome::display::DisplayBuffer)>' to 'esphome::display::display_writer_t&&' {aka 'std::function<void(esphome::display::Display&)>&&'}
Compiling .pioenvs/esp32-c3/bootloader_support/src/flash_encrypt.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/secure_boot.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/flash_partitions.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/flash_qio_mode.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_flash_config_esp32c3.o
*** [.pioenvs/esp32-c3/src/main.o] Error 1 |
@jbishop129 , @ParineetVernekar friends, what version of esphome you're using? I'm fine with my "fork" with this config on 2023.12.5. More to say, it is suitable only for this version... |
@bearpawmaxim good call. I was running ESPHome 2023.23.0 - DEV, I rolled back to the non-Dev Add-on (2023.12.5) and cleaned build files, unfortunately the same compile error. Seems like it is zoning in on this Compiling .pioenvs/esp32-c3/app_trace/gcov/gcov_rtio.o
Compiling .pioenvs/esp32-c3/app_update/esp_ota_ops.o
Compiling .pioenvs/esp32-c3/app_update/esp_app_desc.o
Compiling .pioenvs/esp32-c3/bootloader_support/src/bootloader_common.o
src/main.cpp: In function 'void setup()':
src/main.cpp:3384:53: error: cannot declare parameter 'it' to be of abstract type 'esphome::display::DisplayBuffer'
roundOLED1->set_writer([=](display::DisplayBuffer it) -> void { |
Nothing unless you specify your config ;) |
Fair enough ;) Removed unnecessary part of my display lambda: esphome:
name: esp32-c3
friendly_name: ESP32-C3
platform: ESP32
board: esp32-c3-devkitm-1
on_boot:
then:
- light.turn_on:
id: backlight
brightness: 65%
external_components:
- source: github://bearpawmaxim/esphome@pr3625fix
components: [gc9a01]
logger:
api:
encryption:
key: !secret api
ota:
password: !secret ota
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
ap:
ssid: "Esp32-C3 Fallback Hotspot"
password: !secret ap
spi:
mosi_pin: GPIO10
clk_pin: GPIO7
light:
- platform: monochromatic
id: backlight
name: "Backlight"
output: pwm_output
output:
- platform: ledc
id: pwm_output
pin: GPIO3
#########
# Fonts
#########
font:
- file: 'fonts/Google_Sans_Regular.ttf'
id: font_16
size: 16
- file: 'fonts/Google_Sans_Regular.ttf'
id: font_32
size: 32
- file: 'fonts/Google_Sans_Regular.ttf'
id: font_48
size: 48
- file: 'fonts/Google_Sans_Regular.ttf'
id: font_80
size: 80
## Weather icons - Size 46
- file: 'fonts/mdi.ttf'
id: icon_weather
size: 46
glyphs: [
"\U000F0590", # mdi-weather-cloudy
"\U000F0F2F", # mdi-weather-cloudy-alert
"\U000F0E6E", # mdi-weather-cloudy-arrow-right
"\U000F0591", # mdi-weather-fog
"\U000F0592", # mdi-weather-hail
"\U000F0F30", # mdi-weather-hazy
"\U000F0898", # mdi-weather-hurricane
"\U000F0593", # mdi-weather-lightning
"\U000F067E", # mdi-weather-lightning-rainy
"\U000F0594", # mdi-weather-night
"\U000F0F31", # mdi-weather-night-partly-cloudy
"\U000F0595", # mdi-weather-partly-cloudy
"\U000F0F32", # mdi-weather-partly-lightning
"\U000F0F33", # mdi-weather-partly-rainy
"\U000F0F34", # mdi-weather-partly-snowy
"\U000F0F35", # mdi-weather-partly-snowy-rainy
"\U000F0596", # mdi-weather-pouring
"\U000F0597", # mdi-weather-rainy
"\U000F0598", # mdi-weather-snowy
"\U000F0F36", # mdi-weather-snowy-heavy
"\U000F067F", # mdi-weather-snowy-rainy
"\U000F0599", # mdi-weather-sunny
"\U000F0F37", # mdi-weather-sunny-alert
"\U000F14E4", # mdi-weather-sunny-off
"\U000F059A", # mdi-weather-sunset
"\U000F059B", # mdi-weather-sunset-down
"\U000F059C", # mdi-weather-sunset-up
"\U000F0F38", # mdi-weather-tornado
"\U000F059D", # mdi-weather-windy
"\U000F059E", # mdi-weather-windy-variant
]
# ## Other icons - Size 32
- file: 'fonts/mdi.ttf'
id: icon_32
size: 32
glyphs: [
"\U000F000E", # mdi-account-multiple
]
##################
# Sensors from HA
##################
time:
- platform: sntp
id: my_time
timezone: America/Phoenix
sensor:
- platform: homeassistant
id: outside_temp_dht22
entity_id: sensor.dht22_temp
- platform: homeassistant
id: openweather_temp
entity_id: sensor.openweathermap_temp_rounded
- platform: homeassistant
id: spa_temp
entity_id: sensor.pool_temp
binary_sensor:
- platform: homeassistant
id: office_motion
entity_id: binary_sensor.office_motion_sensor
- platform: homeassistant
id: spa_heater
entity_id: switch.pool_spa
text_sensor:
- platform: homeassistant
id: weather
entity_id: weather.openweathermap
internal: true
- platform: homeassistant
name: Readable_time
entity_id: sensor.12h_time
id: readable_ha_time
color:
- id: yellow
hex: FFC300
- id: light_gray
hex: DEDEDE
display:
- platform: gc9a01
id: roundOLED1
reset_pin: GPIO4
cs_pin: GPIO6
dc_pin: GPIO5
rotation: 90
lambda: |-
... trimmed out my display lambda.. not relevant... compile error: INFO ESPHome 2023.12.5
INFO Reading configuration /config/esphome/esp32-c3.yaml...
INFO Generating C++ source...
Traceback (most recent call last):
File "/usr/local/bin/esphome", line 33, in <module>
sys.exit(load_entry_point('esphome', 'console_scripts', 'esphome')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/esphome/esphome/__main__.py", line 1041, in main
return run_esphome(sys.argv)
^^^^^^^^^^^^^^^^^^^^^
File "/esphome/esphome/__main__.py", line 1028, in run_esphome
rc = POST_CONFIG_ACTIONS[args.command](args, config)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/esphome/esphome/__main__.py", line 458, in command_run
exit_code = write_cpp(config)
^^^^^^^^^^^^^^^^^
File "/esphome/esphome/__main__.py", line 192, in write_cpp
generate_cpp_contents(config)
File "/esphome/esphome/__main__.py", line 204, in generate_cpp_contents
CORE.flush_tasks()
File "/esphome/esphome/core/__init__.py", line 679, in flush_tasks
self.event_loop.flush_tasks()
File "/esphome/esphome/coroutine.py", line 246, in flush_tasks
next(task.iterator)
File "/esphome/esphome/__main__.py", line 184, in wrapped
await coro(conf)
File "/data/external_components/ad3b3ff5/esphome/components/gc9a01/display.py", line 76, in to_code
await setup_gc9a01(var, config)
File "/data/external_components/ad3b3ff5/esphome/components/gc9a01/display.py", line 62, in setup_gc9a01
config[CONF_LAMBDA], [(display.DisplayBufferRef, "it")], return_type=cg.void
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'esphome.components.display' has no attribute 'DisplayBufferRef'. Did you mean: 'DisplayBuffer'?
|
I've managed to compile your code on 2023.12.5 with the @ParineetVernekar's version. Until the code from this PR isn't merged it is better to use it.
|
Really appreciate your time and attention on this. I'm still getting a different compile error when using Parineet's version as well, however if you are able to compile, I will take this aside to work further on my own. I don't want to treat this area as a troubleshooting forum :) |
Some progress made: It turns out the code I gave you above with the redacted display content after lambda: |-
// Outside Temp
if (id(openweather_temp).has_state()) {
it.printf(120,210, id(font_32), TextAlign::CENTER, "%.0f°F", id(openweather_temp).state);
it.printf(115,230, id(font_16), TextAlign::CENTER, "Outside");
} do you get a compile error like this? |-- SPI @ 2.0.0
Compiling .pioenvs/esp32-s2/src/main.cpp.o
src/main.cpp: In function 'void setup()':
src/main.cpp:3319:53: error: cannot declare parameter 'it' to be of abstract type 'esphome::display::DisplayBuffer'
roundOLED1->set_writer([=](display::DisplayBuffer it) -> void {
~~~~~~~~~~~~~~~~~~~~~~~^~
In file included from src/esphome.h:21,
from src/main.cpp:3:
src/esphome/components/display/display_buffer.h:15:7: note: because the following virtual functions are pure within 'esphome::display::DisplayBuffer':
class DisplayBuffer : public Display {
^~~~~~~~~~~~~
In file included from src/esphome/components/api/proto.h:3,
from src/esphome/components/api/api_pb2.h:5,
from src/esphome/components/api/api_connection.h:4,
from src/esphome.h:3,
from src/main.cpp:3:
src/esphome/core/component.h:302:16: note: 'virtual void esphome::PollingComponent::update()'
virtual void update() = 0;
^~~~~~
In file included from src/esphome.h:20,
from src/main.cpp:3:
src/esphome/components/display/display.h:449:23: note: 'virtual esphome::display::DisplayType esphome::display::Display::get_display_type()'
virtual DisplayType get_display_type() = 0;
^~~~~~~~~~~~~~~~
In file included from src/esphome.h:21,
from src/main.cpp:3:
src/esphome/components/display/display_buffer.h:25:15: note: 'virtual int esphome::display::DisplayBuffer::get_height_internal()'
virtual int get_height_internal() = 0;
^~~~~~~~~~~~~~~~~~~
src/esphome/components/display/display_buffer.h:26:15: note: 'virtual int esphome::display::DisplayBuffer::get_width_internal()'
virtual int get_width_internal() = 0;
^~~~~~~~~~~~~~~~~~
src/esphome/components/display/display_buffer.h:29:16: note: 'virtual void esphome::display::DisplayBuffer::draw_absolute_pixel_internal(int, int, esphome::Color)'
virtual void draw_absolute_pixel_internal(int x, int y, Color color) = 0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
<unicode string>:180:4: error: no matching function for call to 'esphome::gc9a01::GC9A01::set_writer(setup()::<lambda(esphome::display::DisplayBuffer)>)'
In file included from src/esphome.h:20,
from src/main.cpp:3:
src/esphome/components/display/display.h:426:8: note: candidate: 'void esphome::display::Display::set_writer(esphome::display::display_writer_t&&)'
void set_writer(display_writer_t &&writer);
^~~~~~~~~~
src/esphome/components/display/display.h:426:8: note: no known conversion for argument 1 from 'setup()::<lambda(esphome::display::DisplayBuffer)>' to 'esphome::display::display_writer_t&&' {aka 'std::function<void(esphome::display::Display&)>&&'}
*** [.pioenvs/esp32-s2/src/main.cpp.o] Error 1 |
Yes. I got the same thing.. Will investigate in it. |
hello another compilation error. commented here: https://github.com/landonr/lilygo-tdisplays3-esphome/pull/46
Do you happen to know how to fix it? |
@jbishop129, @ParineetVernekar I've fixed lambda in my fork, so you're free to use it. |
@4cello hi! I'm getting the weird issue while trying to use 16-bit color ( Do you have any ideas about what can be wrong? |
Success! Thank you very much @bearpawmaxim I have this running on an ESP32 C3, display is working! |
The issue was in uint16_t overflow while calculating buffer position. Fixed in my fork. P.S.: the benefit of using the 16bit mode are x2 drawing speed while using x2 memory (115200 bytes) and more essential colors. It is ok if you have 250+ kbytes of ram |
Hi after update to esphome 12.5 and using this plugin, the display flickers during the update (the RGB color of some brightness blocks changes, etc. as if there is a bad power supply). |
It may be related to the 80MHz spi speed I've set for the display. Try to lower it from The code can be downloaded from here |
got you On old file is speed spi is 8Mhz (also works 20MHz, I haven't tried anything else) And another problem is color on display: RGB scheme is changed
|
This is strange because on my side these lines fixes the colors in 16 bit mode (blue was red and red was blue). |
@tiimsvk About your flickering. Did lowering the frequency fixed your issue? |
#6351 adds GC9A01A support to the |
What does this implement/fix?
Add display platform for GC9A01 240x240 TFT LCD.
Tested with ESP32 and ESP8266. (ESP8266 only with reduced display size because of frame buffer size)
Types of changes
Related issue or feature (if applicable): -
Pull request in esphome-docs with documentation (if applicable): esphome/esphome-docs#2176
Test Environment
Example entry for
config.yaml
:Checklist:
tests/
folder).If user exposed functionality or configuration variables are added/changed: