Add Elecrow CrowPanel ESP32-S3 7.0" HMI Display (DIS08070H)#1494
Add Elecrow CrowPanel ESP32-S3 7.0" HMI Display (DIS08070H)#1494Verstreubulator wants to merge 4 commits intoesphome:mainfrom
Conversation
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
✅ Deploy Preview for esphome-devices ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
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. |
| ### 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). | ||
|
|
There was a problem hiding this comment.
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.
| ### 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). |
| 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" |
There was a problem hiding this comment.
| 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 |
There was a problem hiding this comment.
Please try this with mipi_rgb which replaces rpi_dpi_rgb
| ## 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. |
There was a problem hiding this comment.
| ## 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. |
|
Please take a look at the requested changes, and use the Ready for review button when you are done, thanks 👍 |
jesserockz
left a comment
There was a problem hiding this comment.
Also, do not delete the pull request template, fill it out correctly
|
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.
|
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 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 I've updated the device page to include this fix (a small I understand this is a workaround rather than a proper upstream fix, so I completely understand if you'd prefer to:
Thank you for your patience and for all the work you put into ESPHome. I really appreciate it! |

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
Checklist
!secret wifi_ssidand!secret wifi_password.wifiorethernetblock has no static / manual ip address specified.