Skip to content

Add Elecrow CrowPanel ESP32-S3 7.0" HMI Display (DIS08070H)#1494

Open
Verstreubulator wants to merge 4 commits intoesphome:mainfrom
Verstreubulator:main
Open

Add Elecrow CrowPanel ESP32-S3 7.0" HMI Display (DIS08070H)#1494
Verstreubulator wants to merge 4 commits intoesphome:mainfrom
Verstreubulator:main

Conversation

@Verstreubulator
Copy link
Copy Markdown

@Verstreubulator Verstreubulator commented Mar 18, 2026

Brief description of the changes

Adds device page for the Elecrow CrowPanel ESP32-S3 7.0" HMI Display (DIS08070H, V3.0). Includes working configuration with mipi_rgb display platform (model: RPI), GT911 touch controller, and LVGL example. Documents common pitfalls (flash size, PCA9557, GT911 address variance) that cause issues for many users of this board.

Type of changes

  • New device
  • Update existing device
  • Removing a device
  • General cleanup
  • Other

Checklist

  • There are no passwords or secrets references in any examples. The only exceptions are !secret wifi_ssid and !secret wifi_password.
  • The wifi or ethernet block has no static / manual ip address specified.
  • The first configuration provided should be hardware definitions only. A more involved example can be provided in a separate configuration block.

Added documentation for the Elecrow CrowPanel ESP32-S3 7.0" HMI Display, including product specs, important notes, pin configuration, common pitfalls, and basic configuration examples.
Summary
Adds a complete working configuration for the Elecrow CrowPanel ESP32-S3 7.0" V3.0 (DIS08070H) — a 800×480 RGB TFT with GT911 capacitive touch.

No 7" CrowPanel entry currently exists on the site (only the 5" model).

What's included
Basic config: display (rpi_dpi_rgb) + touch (GT911 polling) + backlight (LEDC PWM)
LVGL config: fonts, swipe gestures, styled button pages
Full pin mapping table
Common pitfalls table (8 known issues with symptoms and fixes)
Detailed notes on:
GT911 I2C address variance between units (0x5D vs 0x14)
Why PCA9557 I/O expander must NOT be manipulated
firmware.factory.bin vs firmware.bin for first-time USB flash
Flash size is 4MB not 16MB (N4R8 module)
I2C scan interfering with GT911
Testing
Tested on two physical CrowPanel 7" V3.0 units with ESPHome 2026.2.4 (ESP-IDF framework). Display, touch, LVGL swipe, and button events all confirmed working.

Related issue: esphome/esphome#13307
@netlify
Copy link
Copy Markdown

netlify Bot commented Mar 18, 2026

Deploy Preview for esphome-devices ready!

Name Link
🔨 Latest commit 43283b8
🔍 Latest deploy log https://app.netlify.com/projects/esphome-devices/deploys/69d059037897b100082cd95d
😎 Deploy Preview https://deploy-preview-1494--esphome-devices.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 76 (🟢 up 3 from production)
Accessibility: 97 (no change from production)
Best Practices: 100 (no change from production)
SEO: 91 (🔴 down 1 from production)
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

@Verstreubulator
Copy link
Copy Markdown
Author

I have just learned that the solution I presented above works with some but not all of these 7" Crowpanels. I have not yet figured out why this is. The solution works great with some of them, but with others, the GT911 just seems dead. In some cases, the I2C bus either does not work at all or shows over 100 devices. All panels work with the factory demo just fine so the hardware must be functional.

This issue needs further exploration.

Comment on lines +50 to +73
### First-Time USB Flash — `firmware.factory.bin` vs `firmware.bin`

ESPHome produces two binary files when it compiles:

| File | Contents | Flash Address |
|------|----------|---------------|
| `firmware.factory.bin` | **Complete image** — bootloader + partition table + application | `0x0` |
| `firmware.bin` | **Application only** — just the ESPHome code | `0x10000` |

The ESP32-S3 flash is laid out in regions: bootloader at `0x0`, partition table at `0x8000`, NVS storage at `0x9000`, and application at `0x10000`. The `firmware.factory.bin` overwrites everything from address `0x0`. The `firmware.bin` only writes the application at `0x10000`, assuming a compatible bootloader and partition table already exist.

**First-time flash: you MUST use `firmware.factory.bin`.** The CrowPanel ships with Elecrow's demo firmware which has an incompatible bootloader and partition table. If you flash `firmware.bin` (app only), the existing Elecrow bootloader tries to load your ESPHome app and fails — resulting in a `rst:0x3` boot loop with no useful log output.

```bash
# Flash the factory image at address 0x0 (overwrites bootloader + partition table + app)
esptool.py --chip esp32s3 --port COM4 write_flash 0x0 firmware.factory.bin
```

Or use the [ESPHome Web Flasher](https://web.esphome.io) — click Install, select the `.factory.bin` file.

**Note:** You do NOT need to erase the flash first. The `firmware.factory.bin` overwrites the bootloader, partition table, and application regions. The ESP32-S3's ROM bootloader is in silicon (not flash), so USB download mode always works regardless of what's on the flash. If you *do* want a completely clean slate, you can run `esptool.py erase_flash` before flashing — this is safe as long as you immediately flash the factory image afterward. A device with erased flash will appear "dead" (no display, no WiFi) but will still accept a new flash over USB.

**After first flash:** Once the device boots ESPHome and connects to WiFi, use OTA for all subsequent updates (ESPHome Dashboard → Install → Wirelessly). OTA uses `firmware.bin` internally and only updates the application partition, preserving the bootloader, partition table, and saved WiFi credentials. If an OTA update fails mid-transfer, the device rolls back to the previous firmware automatically (dual OTA partition scheme).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is general ESPHome knowledge and shouldn't be on one specific device page. If we don't have something like this already on the main website, please feel free to submit a PR to add it.

Suggested change
### First-Time USB Flash — `firmware.factory.bin` vs `firmware.bin`
ESPHome produces two binary files when it compiles:
| File | Contents | Flash Address |
|------|----------|---------------|
| `firmware.factory.bin` | **Complete image** — bootloader + partition table + application | `0x0` |
| `firmware.bin` | **Application only** — just the ESPHome code | `0x10000` |
The ESP32-S3 flash is laid out in regions: bootloader at `0x0`, partition table at `0x8000`, NVS storage at `0x9000`, and application at `0x10000`. The `firmware.factory.bin` overwrites everything from address `0x0`. The `firmware.bin` only writes the application at `0x10000`, assuming a compatible bootloader and partition table already exist.
**First-time flash: you MUST use `firmware.factory.bin`.** The CrowPanel ships with Elecrow's demo firmware which has an incompatible bootloader and partition table. If you flash `firmware.bin` (app only), the existing Elecrow bootloader tries to load your ESPHome app and fails — resulting in a `rst:0x3` boot loop with no useful log output.
```bash
# Flash the factory image at address 0x0 (overwrites bootloader + partition table + app)
esptool.py --chip esp32s3 --port COM4 write_flash 0x0 firmware.factory.bin
```
Or use the [ESPHome Web Flasher](https://web.esphome.io) — click Install, select the `.factory.bin` file.
**Note:** You do NOT need to erase the flash first. The `firmware.factory.bin` overwrites the bootloader, partition table, and application regions. The ESP32-S3's ROM bootloader is in silicon (not flash), so USB download mode always works regardless of what's on the flash. If you *do* want a completely clean slate, you can run `esptool.py erase_flash` before flashing — this is safe as long as you immediately flash the factory image afterward. A device with erased flash will appear "dead" (no display, no WiFi) but will still accept a new flash over USB.
**After first flash:** Once the device boots ESPHome and connects to WiFi, use OTA for all subsequent updates (ESPHome Dashboard → Install → Wirelessly). OTA uses `firmware.bin` internally and only updates the application partition, preserving the bootloader, partition table, and saved WiFi credentials. If an OTA update fails mid-transfer, the device rolls back to the previous firmware automatically (dual OTA partition scheme).

Comment on lines +122 to +129
framework:
type: esp-idf
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
CONFIG_SPIRAM_RODATA: y
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY: "y"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
framework:
type: esp-idf
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
CONFIG_SPIRAM_RODATA: y
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY: "y"
cpu_frequency: 240MHz
framework:
type: esp-idf
advanced:
execute_from_psram: true
sdkconfig_options:
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY: "y"

default_transition_length: 0s

display:
- platform: rpi_dpi_rgb
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please try this with mipi_rgb which replaces rpi_dpi_rgb

Comment on lines +311 to +313
## Disclosure

This configuration was developed with the help of Claude (Anthropic's AI). The low-level I2C debugging, GT911 driver analysis, and ESP-IDF internals exceeded the contributor's personal skill level. Results are accurate and tested on two physical units. See [ESPHome Issue #13307](https://github.com/esphome/esphome/issues/13307) for the full discussion.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Disclosure
This configuration was developed with the help of Claude (Anthropic's AI). The low-level I2C debugging, GT911 driver analysis, and ESP-IDF internals exceeded the contributor's personal skill level. Results are accurate and tested on two physical units. See [ESPHome Issue #13307](https://github.com/esphome/esphome/issues/13307) for the full discussion.

@esphome esphome Bot marked this pull request as draft March 29, 2026 20:34
@esphome
Copy link
Copy Markdown

esphome Bot commented Mar 29, 2026

Please take a look at the requested changes, and use the Ready for review button when you are done, thanks 👍

Learn more about our pull request process.

Copy link
Copy Markdown
Member

@jesserockz jesserockz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, do not delete the pull request template, fill it out correctly

@Verstreubulator
Copy link
Copy Markdown
Author

Thank you very much for all the help! I am new to Github and thought I could be helpful to others since I could not find any useful help myself. I will work on this and try to get everything fixed properly.

Some of these panels work easily and some just do not work at all. How do I address this issue? The ESP-IDF driver seems to break the I2C bus on GPIO19 and 20. The driver does not seem to properly release them. Is there a proper place to address this? Do I handle my current pull request separately from the driver issue even though they are related?

Thanks again and thank you for this wonderful resource!!!

Updated product specifications and configuration details in index.md. Changed formatting for clarity and corrected some technical details.
Added important notes regarding I2C fix for GPIO 19/20 and clarified flash size for ESP32-S3-WROOM-1. Updated basic configuration to include usb_disable.h.
@Verstreubulator
Copy link
Copy Markdown
Author

Hi @jesserockz, thank you again for the review feedback — I've applied all the changes you requested (removed factory.bin section, removed AI disclosure, switched to mipi_rgb, used cpu_frequency/execute_from_psram, and I still need to fill out the PR template).

I wanted to let you know about an update: since submitting this PR, I ran into the I2C regression on GPIO19/20 that's tracked in #15356. After a lot of testing, I found a user-level workaround that fully resolves it — disabling the USB_SERIAL_JTAG PHY pad via usb_serial_jtag_ll_phy_enable_pad(false) in a pre-app_main() constructor. I've confirmed this on two separate CrowPanel boards.

I've updated the device page to include this fix (a small usb_disable.h header file included via esphome.includes), since without it anyone following the guide on ESPHome 2026.3.0+ would get non-functional touch.

I understand this is a workaround rather than a proper upstream fix, so I completely understand if you'd prefer to:

  • Wait until #15356 is resolved before merging this PR
  • Include the workaround but with a note that it can be removed once the upstream fix lands
  • Handle it differently — happy to adjust however you'd like

Thank you for your patience and for all the work you put into ESPHome. I really appreciate it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants