Elecrow CrowPanel 7" with ESPHome

I have V3 of the above device and like others are struggling to get a stable display that does not flicker or blank the screen every few minutes.

Just wanted to see if anyone else has had any luck as its a great device??
https://www.elecrow.com/esp32-display-7-inch-hmi-display-rgb-tft-lcd-touch-screen-support-lvgl.html

I am aware that others have tried but given up when using an earlier version and of course I have tried all code that I found on the web including from the manufacturer which is also not stable.

I also have the 5" version and this works perfectly with ESPHome & LVGL.

I believe the issue is due to support for different display drivers, but this is beyond my technical ability.

Thanks for any help… currently its a great bookend!

It seems to be compatible with openhasp, so give that a go.

In fact their advertising even says so. Happy days

Thanks for the hint… I know nothing about openhasp, but perhaps this is something I can look at if all else fails!!
Cheers

Curious if this helps

This config works well. I am underwhelmed by the display though - it has a very poor viewing angle and the pixels are not quite square so the aspect ratio is wrong - images are slightly squashed vertically. The Waveshare 7" display is much nicer.

esphome:
  name: elecrow-crowpanel-70-rgb
  friendly_name: Elecrow CrowPanel 7.0 RGB
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    platform_version: 6.8.1
    version: 5.3.0
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
      CONFIG_SPIRAM_RODATA: y

psram:
  mode: octal
  speed: 80MHz

logger:
  hardware_uart: UART0

wifi: !include wifi.yaml

i2c:
  sda: 19
  scl: 20

display:
  - platform: rpi_dpi_rgb
    data_pins:
      red: [14, 21, 47, 48, 45]
      green: [9, 46, 3, 8, 16, 1]
      blue: [15, 7, 6, 5, 4]
    de_pin: 41
    hsync_pin: 39
    vsync_pin: 40
    pclk_pin: 0
    hsync_front_porch: 40
    hsync_pulse_width: 48
    hsync_back_porch: 13
    vsync_front_porch: 1
    vsync_pulse_width: 31
    vsync_back_porch: 13
    pclk_inverted: true
    pclk_frequency: 15MHz
    color_order: RGB
    auto_clear_enabled: false
    update_interval: never
    dimensions:
      width: 800
      height: 480

touchscreen:
  platform: gt911
  interrupt_pin: 38

output:
  - platform: ledc
    pin: 2
    id: backlight_pin

light:
  - platform: monochromatic
    output: backlight_pin
    name: "Backlight Level"
    restore_mode: RESTORE_DEFAULT_ON
    gamma_correct: 1.8

lvgl:

Hi

i am having som issue with the 5inch.

I can get the screen to work with the board: esp32-s3-devkitc-1, but the touch function is not working. with the esp32s3box board, i am getting the touch to function but not the screen.

som ide on whay?

For anyone struggling to setup the Elecrow CrowPanel 7" with the ESPHome, I actually made it work and seems pretty stable so far. I have added a link to instructions in another similar post..

Or you can check the instructions directly.

Hello,

the touchscreen seems buggy for me…sometimes it doesnt work after power on.

i found some guys put the adress of I2C like address: 0x5D but it doesnt work well.

here is my config, hope its not the sleeping mode that make it buggy :

touchscreen:
  platform: gt911
  id: my_touchscreen
#  address: 0x5D
  display: my_display
  interrupt_pin: 38
  on_touch:
    - if:
        condition: lvgl.is_paused
        then:
          - light.turn_on: back_light
          - lvgl.resume:
          - lvgl.widget.redraw:
    - logger.log:
          format: Touch at (%d, %d)
          args: [touch.x, touch.y]
    - lambda: |-
          ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
              touch.x,
              touch.y,
              touch.x_raw,
              touch.y_raw
              );

perhaps i will try without the debug part like this :

touchscreen:
  platform: gt911
  id: my_touchscreen
#  address: 0x5D
  display: my_display
  interrupt_pin: 38
  on_touch:
    - if:
        condition: lvgl.is_paused
        then:
          - light.turn_on: back_light
          - lvgl.resume:
          - lvgl.widget.redraw:

dont know if it will make a diffrence…nobody experience problem with touchscreen?

EDIT : same problem without logger.

strange thing is 2 I2c adress are detected :

[18:03:08][I][i2c.idf:102]: Results from i2c bus scan:
[18:03:08][I][i2c.idf:108]: Found i2c device at address 0x18
[18:03:08][I][i2c.idf:108]: Found i2c device at address 0x5D

i have read a lot of comments and elecrow team said 0x5D is the adress of the touchscreen, but why 0x18 is detected and what hardware is it???

the problem seems really random, i try several usb cable and power source…really random…sure its a starting problem with software, not hardware.

according to the schematic 0x18 is the address of the PCA9557 I/O expander.

Perhaps not related but i deleted the encryption part on the API and it seems to work better

There is a lot time the touchscreen still doesnt work and need to restart.

It seems i have to wait 10 or 20 seconds after the esp is power on and have all his sensors from HA updated…i have 28 lights, 5 covers.

Just received these Displays Today.
Following Your Guide, but as yet not getting a Result.

Error I’m Receiving When Compiling is:

INFO ESPHome 2025.12.4
INFO Reading configuration /config/esphome/elecrow-test-1.yaml...
WARNING The selected framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected platform version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected platform version is not the recommended one. If there are connectivity or build issues please remove the manual version.
Failed config

i2c: [source /config/esphome/elecrow-test-1.yaml:58]
  
  This feature requires at least framework version 5.4.2.
  - sda: 19
    scl: 20

If I Remove the Version Lines, it Complies & I at Least get the Backlight Once it’s booted.

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
#    platform_version: 6.8.1
#   version: 5.3.0

Any Suggestions on What Work with Current Releases?

Thanks.

Also Now Found that if I comment out the i2c: section, I get this:-

INFO ESPHome 2025.12.4
INFO Reading configuration /config/esphome/elecrow-test-1.yaml...
WARNING The selected framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected platform version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected platform version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING GPIO0 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq/#why-am-i-getting-a-warning-about-strapping-pins
INFO Generating C++ source...
INFO Compiling app... Build path: /data/build/elecrowlcd
Processing elecrowlcd (board: esp32-s3-devkitc-1; framework: espidf; platform: https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip)
--------------------------------------------------------------------------------
Platform Manager: Installing https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip
INFO Installing https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip
WARNING Package download failed: Got the unrecognized status code '404' when downloaded https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip. Retrying... (attempt 1/3)
WARNING Package download failed: Got the unrecognized status code '404' when downloaded https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip. Retrying... (attempt 2/3)
PackageException: Got the unrecognized status code '404' when downloaded https://github.com/pioarduino/platform-espressif32/releases/download/6.08.01/platform-espressif32.zip

Further to What’s above,
I’ve now found Another Set of Examples on Github.

There’s Versions 1.1 thru to 1.3, with the latest updated within the last 24 hours.

Haven’t tried any yet, but I do notice the Pin Mappings have changed.

Edit:- Not Sure where to get the PNG files referenced in the above Example.

Looks Like Elecrow is Looking into this sice I emailed their support line.

At this point I have the Display working just fine with LVGL, but without the Touch configured.

There is now an updated Version 3.0 Example that includes the PCA9554 Component.

Tried that very Code on My Display, but with no success.
It was updated 13th January 2026, so may still be work in progress.

CrowPanel-7.0-HMI-ESP32-Display-800x480/example/Esphome/7.0-V3.0esphome.yaml at master · Elecrow-RD/CrowPanel-7.0-HMI-ESP32-Display-800x480

Maybe others with V3.0 Displays could give it a go & see if they can find why it’s not quite right.

Tried this morning - no joy.

Yes,
Their Example at this point is incomplete.

They are configuring the PCA9557,

# PCA9554 GPIO extender for display reset

pca9554:
  - id: p_c_a
    address: 0x18 # Originally 0x20 Which applies to PCA9554
    i2c_id: i2c_bus

switch:

  - platform: gpio
    pin: 38
    id: output_pin
    name: "Pin 38 Output"

  - platform: gpio
    name: "GT911 Reset"
    pin:
      pca9554: p_c_a
      number: 0
      mode:
        output: true
      inverted: false
    id: gt911_reset
    restore_mode: RESTORE_DEFAULT_ON

  - platform: gpio
    name: "GT911 INT"
    pin:
      pca9554: p_c_a
      number: 1
      mode:
        output: true
      inverted: false
    id: gt911_int

Then They have a Script to control the Output Pins on the PCA9557, but have not coded to call it.

script:
  - id: init_touch
    mode: queued
    then:
      - switch.turn_off: gt911_reset
      - switch.turn_off: gt911_int
      - delay: 20ms
      - switch.turn_on: gt911_reset
      - delay: 100ms
      - switch.turn_off: gt911_int

From What I’ve Read, Arduino Code Cycles the Int & Reset Pins on the Touch Interface to get it in the Correct State before moving further into the Setup Code.

I’ve had a Poke about on PCA9557 & confirmed with the Scope that I can actually Toggle those Pin 0 & 1 on the PCA Device.

Think the Solution might be to Manipulate them in On_Boot, but yet to get my head around that.
Something like this…

  on_boot:
    then:
    - logger.log: "Onboot seq"
    - lambda: !lambda |-
       id(p_c_a)->pin_mode(0, esphome::gpio::FLAG_OUTPUT);
       id(p_c_a)->digital_write(0, false);
       id(p_c_a)->pin_mode(1, esphome::gpio::FLAG_OUTPUT);
       id(p_c_a)->digital_write(1, false);

But that’s getting a bit beyond My Understanding, & would not have delays as seen in Arduino examples.

hello,

i have a lot of problem with touchscreen for a while, i buy 2 elecrow panel 7", the first screen i bought work normally whithout the i2c PCA stuff and script, the 2nd one doesnt work ass expected and i found that put a aluminium film at the back work when i touch it with a hand, and the screen xith other hand...i used it like that for month...

I then decided to buy 2 more, to see if its a hardware problem, but no luck, the 2 new 7" the touchscreen doesnt work.

6 month after i search a lot and found this post with the link to 7.0-V3.0esphome.yaml, try it and now my touchscreen work on my 4 elecrow 7" without any trouble!

here is my code :

esphome:
  name: crowpanel7pouces
  platformio_options:
    build_flags: "-DBOARD_HAS_PSRAM"
    board_build.esp-idf.memory_type: qio_opi
    board_build.flash_mode: dio
  on_boot:
    - delay: 3s
    - lvgl.widget.hide: boot_screen

esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  framework:
    type: esp-idf
    #platform_version: 6.8.1
    #version: 5.3.0
    # Required to achieve sufficient PSRAM bandwidth
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: y
      CONFIG_ESP32S3_DATA_CACHE_64KB: y
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: y
      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
      CONFIG_SPIRAM_RODATA: y

# Enable logging
logger:

# Enable Home Assistant API
api:
  on_client_connected:
    - if:
        condition:
          lambda: 'return (0 == client_info.find("Home Assistant "));'
        then:
          - lvgl.widget.show: lbl_hastatus
          - lvgl.widget.hide: top_layer
  on_client_disconnected:
    - if:
        condition:
          lambda: 'return (0 == client_info.find("Home Assistant "));'
        then:
          - lvgl.widget.hide: lbl_hastatus

ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx347"


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_pwd
  manual_ip:
    static_ip: xxxxxxxxxx
    gateway: xxxxxxxxxxxxxxx
    subnet: 255.255.255.0
    dns1: xxxxxxxxxx
  fast_connect: on
  power_save_mode: none


psram:
  mode: octal
  speed: 80MHz 

# I2C bus configuration
i2c:
  - id: i2c_bus
    sda: GPIO19
    scl: GPIO20
    scan: true

# PCA9554 GPIO extender for display reset
pca9554:
  - id: p_c_a
    address: 0x20
    i2c_id: i2c_bus
output:
  - platform: ledc
    pin: 2
    frequency: 1220
    id: gpio_backlight_pwm

light:
  - platform: monochromatic
    output: gpio_backlight_pwm
    name: Huawei 7 pouces Display Backlight
    id: back_light
    restore_mode: ALWAYS_ON

touchscreen:
  platform: gt911
  id: my_touchscreen
  i2c_id: i2c_bus
#  address: 0x5D
  display: my_display
#  interrupt_pin: 38
  on_touch:
    - logger.log: "Ecran appuyé desssssssssssssssssssssssssssssssssssssssssssssssssus"
    - if:
        condition: lvgl.is_paused
        then:
          - light.turn_on: back_light
          - lvgl.resume:
          - lvgl.page.show: huawei_page
          - lvgl.widget.hide: top_layer
          - lvgl.widget.redraw:
          - logger.log: "Ecran se reveilllllllllllllllllllllllllllllllllllllllllllle"
    - logger.log:
        format: Touch at (%d, %d)
        args: [touch.x, touch.y]
    - lambda: |-
        ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
           touch.x,
           touch.y,
           touch.x_raw,
           touch.y_raw
           );
  on_update:
      - lambda: |-
          for (auto touch: touches)  {
              if (touch.state <= 2) {
                ESP_LOGI("Touch points:", "id=%d x=%d, y=%d", touch.id, touch.x, touch.y);
              }
          }
  on_release:
    - if:
        condition: lvgl.is_paused
        then:
          - logger.log: "LVGL resuming"
          - lvgl.resume:
          - lvgl.widget.redraw:
          - light.turn_on: 
              id: back_light
              brightness: 100%

time:
  - platform: homeassistant
    id: time_ha 
    timezone: UTC-4
    on_time_sync:
      - script.execute: time_update
    on_time:
      - minutes: '*'
        seconds: 0
        then:
          - script.execute: time_update

script:
  - id: init_touch
    mode: queued
    then:
      - switch.turn_off: gt911_reset
      - switch.turn_off: gt911_int
      - delay: 20ms
      - switch.turn_on: gt911_reset
      - delay: 100ms
      - switch.turn_off: gt911_int
  - id: time_update
    then:
      - lvgl.label.update:
          id: time_label
          text: !lambda |-
            static char time_buf[17];
            auto now = id(time_ha).now();            
            bool is_pm = now.hour >= 12;
            int hour_12 = now.hour % 12;
            if (hour_12 == 0) {
                hour_12 = 12; // 12 AM/PM should be displayed as 12, not 0
            }
            snprintf(time_buf, sizeof(time_buf), "%2d:%02d %s", hour_12, now.minute, is_pm ? "pm" : "am");
            return time_buf; 
      - lvgl.label.update:
          id: date_label
          text: !lambda |-
            static const char * const mon_names[] = {"JANVIER", "FEVRIER", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET", "AOUT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "DECEMBRE"};
            static char date_buf[20];
            auto now = id(time_ha).now();
            snprintf(date_buf, sizeof(date_buf), "%2d  %s  %4d", now.day_of_month, mon_names[now.month-1], now.year);
            return date_buf;
      - lvgl.label.update:
          id: day_label
          text: !lambda |-
            static const char * const day_names[] = {"DIMANCHE", "LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI"};
            return day_names[id(time_ha).now().day_of_week - 1];

display:
  - platform: mipi_rgb
    model: RPI
    id: my_display
    data_pins:
      red:
        - 14
        - 21
        - 47
        - 48
        - 45
      green:
        - 9
        - 46
        - 3
        - 8
        - 16 
        - 1
      blue:
        - 15
        - 7
        - 6
        - 5
        - 4
    de_pin: 41
    hsync_pin: 39
    vsync_pin: 40
    hsync_front_porch: 40
    hsync_pulse_width: 48
    hsync_back_porch: 13
    vsync_front_porch: 1
    vsync_pulse_width: 31
    vsync_back_porch: 13
    pclk_pin: 0
    pclk_frequency: 12MHz
    pclk_inverted: true
    color_order: RGB
    auto_clear_enabled: false
    update_interval: 30s
    dimensions:
      width: 800
      height: 480

lvgl:
  on_idle:
    - timeout: 240s
      then:
        - logger.log: idle timeout
        - lvgl.pause:
        - light.turn_off:
            id: back_light
            transition_length: 5s

you're right, the script seems to be called anywhere...but it works ... Perhaps its called with the "touch" function...

anyway, thanks for your post, its work great for me now, on my 4 elecroc panel 7" !!!

I was running into touchscreen issues with a recently purchased panel, but found this snippet of code in one of their downloadable examples:

touchscreen:
  platform: gt911
  id: my_touchscreen
  display: main_display
  update_interval: 50ms
  address: 0x5D
  on_touch:
    - logger.log:
          format: Touch at (%d, %d)
          args: [touch.x, touch.y]
    - lambda: |-
          ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
              touch.x,
              touch.y,
              touch.x_raw,
              touch.y_raw
              );

This seems to be working for me. Hope this helps someone else (or even myself) in the future.

I just bought the same panel, but the touch screen isn’t even working in the demo that came with the panel, so I’m not sure whether the touch screen is defective or whether they changed the hardware again.

I think I’ll need to try compiling one of the Arduino examples or perhaps an I2C bus scanner for Arduino to confirm that the touch screen controller chip is responding and on what address

Can you post your entire working YAML?

Check my GitHub for a working example..