Introduction
My previous project during the Corona pandemic, the Winddisplay with a Nextion 7" inch display, lasted precisely one season. It did not survive winter storage. At the beginning of the new sailing season the display was death as death can be. I had to fall back to the original on board network and had to replace som costly components. These did not last for more then 2 years either.
Since the winter overhere seems to last and technology made a leap forward when it comes to cheap displays and integrated ESP processors and also when it comes to frameworks for graphics on these integrated board, like LVGL.
Today they (the displays) come fully integrated and in a housing as one. Making it an interesting device for replacement of old displays and whatsoever. The even have a name; cheap yellow displays (CYD)
So I bought a 7" display for about € 37. Nextion displays are extremely expensive these days and do not have much benefits above these CYD displays imo.
Although I had a kind of similar display on my desk for about 2 years I hopefully ordered this bigger version.
The previous one, also from Guition, was a 480x480 display that I was not able to get it working. The included examples I could not get to work, due to a long list of compiler errors. And I had no motivation to go debugging some one else's code.
I was hopeful, but naive. The new display did not do better. The included examples, pre-installed on the display makes a great demo. Trying to get the examples working on this kit was a disappointment again.
But this time I was determined. More then 40 years of software development experience should be enough to get this thing working.
This is the story of my trip to developers hell and back.
The project
So this board is based on the latest ESP32-P4 and C6 chipsets and at the time I started this project late January 2026, there was no official support for in on the Platform.io framework. You had to reference to a distribution via an URL in your platformio.ini file. And again the default support was for the development board with 1 MB flash storage and 380K ROM, while the chipset comes with 16MB flash and 500K of ROM. So here was the 1st challenge for me; how to overcome this limitation since, and I will get back to it later, my compiled file size was bigger than the 1MB so I could not flash it to the ESP32.
I started with drawing some scenario's and UML diagrams for the working of this application:
Next LVGL was used in the examples and the framework was promising (again to me). But all the examples you have to download from a Chinese website ( what?) didn't work (examples are in English though). But this is a horror scenario from a cyber security perspective. I had expected that the examples where ready to run and learning how LVGL and this this works was easy piecy. Wrong, again!
Next I appeared that this chipset was so new that there was no support for in in the ArduiniGFX library. So even if the examples would have the right quality they would not have resulted in runnable code.
Last but not least I had over estimated my skills (or underestimated the complexity of the composite whole). My guess here is that this is true for a lot of (software) development teams traveling the same route.
So this is what I had to do to make a chance to get it to work:
- Find a working setup for this board, so I could see some graphics actually work. I found the works of Andruid59 who tested a similar board (among others for his hobby) He showed me how to setup the graphics and pointed me to a working library for the touchscreen from Bitbank (Larry Bank)
- Start reading the LVGL manuals and study the examples, see here. I understand that from the developers point of view they have done a great job. However it's usability for noobs on this matter is limited. You have to dig through lots of code examples without decent explanation for the basics. When you dive deeper documentation lacks clarity since it only references to the interfaces without explanation. So it means trial and error.
- pixelEDI who showed me how EEZ works for LVGL. It helped me to better understand the LVGL framework. In the end I don't use that framework, but it helped me forward. I could not get it to work on my board. (It seems that it lacked the load_screen function from LVGL.....)
- A deep dive into how to configure the the flash bank on the ESP32. I found it here and the actual setting here, from Espressif itself.
- Familiarize myself better with Git (if I had not made a hard copy of my code, Git would have destroyed all my painfully staking hard work with the blink of an eye (I know it is my ignorance; Git has become more then just pull, push and commits...)
And now I'm here writing about my experience during this project, 4 weeks later starting from scratch on this one.
What have I achieved so far?
Starting at the "get it working phase" I have:
- a compilable and running application with all the panels showing real-time data. Data is coming from a virtualised NMEA0183 generator from within the application demonstrating that the calculation module is working
- persistent storage to save the overall mileage(log) and settings for the application. The log is saved every 10 minutes to NVR. With speeds around 7 knots you might loose 1 nautical mile max if you shut off to early. I.m.o. that is acceptable. But in reality I won't shut down within 10 minutes after docking.
- brightness of the display can be controlled via a slider between 5% and 100%
- switching panels implemented correctly (no more toggling)
- day-, sunlight, dawn and night mode implemented. I'm using a reverse tree travel function to set obj colors piece by piece since the lv_obj_replace_style(), lv_obj_report_style_change() and lv_obj_invalidate() function do not seem to work in my application.
- processing life NME0183 data coming from a wired RS-485 connection
- Level conversion from 5v to 3.3 v for the ESP32 board. For testing purposes I created a voltage divider with a 10k Ohm and 5k Ohm resistor to scale down from 6V from the laptop to 3v for the ESP32-P4 board. Decided to put these on a PCB in stead of commercial optocouplers or level shifters.
- As per Mar 1,2026 I have an MVP; it reads serial data over a wired connection and displays the data. The user can modify the settings to make it work.
- As per Mar 6,2026, the memory assertion(leak) seems to be solved by increasing the LV_MEM_SIZE parameter from 64 * 1024 to 128 * 1024 bytes and added two gauges for apparent wind angle.
- As per Mar 12 solved the global variable challenge. I had statics declared in the include files, resulting in multiple instantiations of the same variable. So removed the static with extern and intialize the variabes in the C or C++ files accordingly.
- Also changed the setup so the display is powered via USB-C from a 12V to 5V converter with USB-C connection and no longer over the 5V GPIO's.
- As per Mar 14; successfull SAT with two minor improvements that can be made:
* while SOG < 0.3 kts don't add up total mileage (log)
* ignore calculated distance between 2 LAT /LON positions greater then 1 nm (which intheory can't be achieved given
Measuring voltage on the network wiring resulted in voltages of max 3.3 volts, so voltage divider can be left out. - As per Mar 17 version 1.0 is released.
Things to be done:
as per Mar 1, 2026
- implement WiFi functionality. Currently only RS485 or RS-232 is supported
- data relay is suspended due to low voltages (max 0,68V on GPIO's) on the ESP32-P4. Seems to be a known problem on this chip(!?).
Where did AI come in?
To be honest; not really. I let Claude do some code generation for a function to calculate the distance between 2 NMEA0183 strings with latitude and longitude information. And I asked the in-line chat a couple of times to help fix compiler errors. So that's it and it was a lot of trial and error.
To save you the same pitfalls, read the read.me from my Git repository. It will save you a lot of time, time you can spend on coding.
Youtube video of the different modes:













Comments