Refreshed episodes/hosts/comments/series from hpr.sql, and added official HPR transcripts for the 180 episodes aired since the last sync (hpr4516-hpr4695).
200 lines
18 KiB
Plaintext
200 lines
18 KiB
Plaintext
Episode: 4624
|
|
Title: Cheap Yellow Display Project Part 7: GUI Trying a Simple Hello World
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr4624/hpr4624.mp3
|
|
Transcribed: 2026-07-31 16:15:22 (official HPR transcript)
|
|
|
|
---
|
|
|
|
This is Hacker Public Radio Episode 4624, for 2026-04-23
|
|
Today's show is entitled, "Cheap Yellow Display Project Part 7: GUI Trying a Simple Hello World "
|
|
The host is Trey and the duration is 00:21:47
|
|
The flag is Clean, and the license is CC-BY-SA
|
|
The summary is "The continuing saga of the Cheap Yellow Display graphical user interface"
|
|
Hello again, this is Tre. Please note, I did the work described in this episode and wrote the script,
|
|
more than six months prior to this recording. But then life got in the way, and I didn't get
|
|
it recorded, and I didn't even look at the project until recently. But that dear friends is a story
|
|
for another episode. In literature we call that foretelling. Right now, however, it is time to
|
|
record and publish this episode. Welcome to Part 7 in my cheap yellow display project series.
|
|
If you're still listening to me ramble about this project, thank you. If you lost track of it over
|
|
the months of silence from me, you're not alone. Frankly, I've lost track of it too.
|
|
If you wish to catch up on earlier episodes, you can find them on my HPR profile page,
|
|
and there's a link in the show notes. Today, I'm not going to blather on about all the things
|
|
that we've done so far in the current state of the project. Now, today we are getting back to basics.
|
|
Beginning with the random nerds tutorial, introducing the ESP32 cheap yellow display,
|
|
and I'm posting a link to that in the show notes. Why am I going back to basics?
|
|
I really, I just, I don't want to talk about it. If you've not listened to episode 5 of this series,
|
|
you may go back and suffer through it. It's an HPR episode 4, 5, 3, 2.
|
|
There's a link in the show notes, but suffice it to say, when you choose to jump in the deep end of
|
|
something, you think you understand a little about, but about which you really know much less,
|
|
you can find yourself flailing about gasping for air and trying not to sink.
|
|
That's a pretty good illustration of what happened in episode 5.
|
|
However, a recurring theme has been evident to me in several weeks of podcasts and
|
|
YouTube videos that I've experienced over the last, again, over the last several weeks.
|
|
That theme is embracing failure. The most recent of those was Mark Rober's YouTube video
|
|
uncovering America's underwater city. There's a link to it in the show notes too.
|
|
In the video, his successes and his misses gave me a glimmer of hope and reminded me that our
|
|
failures are not failures in and of themselves, their opportunities to learn and pivot and change and
|
|
move forward. I've been programming computers in various forms since the early 1980s. Yes,
|
|
back in the 1900s for all you young folk there. Over the years, I worked with basic and Pascal
|
|
various flavors of sea of assembly language, Pearl, Java, JavaScript, Python, and more.
|
|
And every time I started a course to learn a new language, the first program to write was,
|
|
yep, you guessed it, hello world. Random nerds tutorial posted and article entitled,
|
|
introduced in the ESP32 cheap yellow display. And it includes a starter program that creates two
|
|
different buttons on the screen, which do two different things. A slider, and of course, it displays
|
|
hello world. In the show notes, you can find an image of that screen and a link to the random nerds
|
|
tutorial. That's where I'm going. All right, it was time for me to get started. Copy paste run,
|
|
nope, not this time. The article also explains section by section what the code does.
|
|
And my goal here is not to simply make the cheap yellow display do my bidding,
|
|
but rather to learn the why and the how, which I need in order to become proficient with it.
|
|
First, we start with loading the necessary libraries. These include pun intended there,
|
|
include, oh, never mind. These include LVGL, TFT, underscore espy, XPT, 2046 underscore touch screen.
|
|
That's a resistive touch controller library used for all sorts of touch screens.
|
|
There are instructions earlier in the tutorial that describe how to make certain that these are
|
|
properly installed in the Arduino IDE. One thing that I noticed almost immediately
|
|
is that the previous GUI building tool I used in episode five called Squareline Studio,
|
|
only supported up to LVGL version 8. Well, the tutorial recommended LVGL version 9.01.
|
|
I wonder if this could have contributed to some of my issues. All right,
|
|
back up, I'm using acronyms and I haven't talked about them. So what is this LVGL thing anyways?
|
|
LVGL stands for light and versatile graphics library. According to LVGL.io, quote,
|
|
LVGL is the most popular free and open source embedded graphics library to create
|
|
beautiful user interfaces for any microcontroller unit, micro processor unit, and display type, unquote.
|
|
It is built to make UI development easier with animations and more than 30 different widgets.
|
|
It basically allows a lot of things to happen without you having to get down into the weeds of your code.
|
|
All right, so we've got that. We've included the necessary library types and there's some initialization
|
|
to do for the touch screen. The touch screen is a serial peripheral interface. We'll call it SPI.
|
|
And you can see in the tutorial that the XPT 2046 requires you to define several different things
|
|
for that particular serial peripheral interface. These include the interrupt that it uses.
|
|
The Mossi, that's MOSI, master out slave in port that's used. This is the pin that the
|
|
microcontroller uses to send data to the touch screen or the touch screen's input port.
|
|
There's also a Nissan port, MISO, master in slave out pin. That pin is the pin that the
|
|
microcontroller uses to receive data from the touch screen or the touch screen's out port.
|
|
The ins and outs seem to be a little confusing, but it's defining the ports on the microcontroller
|
|
itself that these will use. There's also the clock pin, which the microcode microcontroller
|
|
uses to send clock signals to SPI devices. SPI is a bus and you can have several different devices
|
|
and having that clock signal is important to make sure that the things are in sync.
|
|
The chip select pin on the microcontroller is used to enable and disable communications
|
|
with the touch screen. We've got all those defined. We can then create specific instances for
|
|
touch screen SPI and touch screen within our code. Next, we define the screen height,
|
|
the width, and the font size. Along with integer variables for X and Y coordinates, input coordinates,
|
|
when the screen is touched, and Z, which is the pressure that's used when the screen is touched.
|
|
These values are important when you're configuring the draw buffer. There's also a setup
|
|
function which is used to basically launch the touch screen SPI and the TFTP display and LVGL.
|
|
That's a lot. But wait, there's more. There's a decent size function which creates the main
|
|
GUI screen and it begins with the hello world text label. Great, our hello world program.
|
|
Here we can see specifically how the text label is created, named and assigned the text that
|
|
it will display, then sized and positioned. The same goes for buttons 1 and 2 and there are associated
|
|
labels and the slider and it's label. Finally, there are event handler functions for when
|
|
button 1 or button 2 are pressed and for when the slider is moved. When button 1 is pressed,
|
|
it shows that it is clicked until it is released. So, when you press it, it shows clicked,
|
|
when you release it, it's not clicked anymore. When button 2 is pressed, however, it actually changes
|
|
the state of the button between off and on to the opposite of what the state was before it was
|
|
pressed, then it alters the color of the button accordingly. So, button 2 effectively toggles from
|
|
off to on or from on back to off again, each time it is pressed. So, if it's off and I push it,
|
|
it goes on and it stays on until I push it again. I hope that explanation of this simple function
|
|
did not make it even more confusing. Back to the code. When the slide is moved, it changes the
|
|
value of the text for the slider label. All of these are fairly simple. Now for the test. In episode
|
|
five, you can witness me building my Morse code app or Morse code key app and downloading it
|
|
to the cheap yellow display, only to have the touch screen input fail spectacularly.
|
|
I know there wasn't a hardware failure because the application that was pre-installed when I purchased
|
|
the cheap yellow display worked perfectly. Additionally, when I loaded a pre-compiled application
|
|
built for the cheap yellow display, from Brian Lowe's witness me now Github site, it also worked
|
|
perfectly and I'll include a link to that in the show notes as well. So, now it was time to once again
|
|
verify the proper libraries are loaded in the library manager and then copy the hello world
|
|
TFTP display and touch screen test code from random tutorials and paste it into the Arduino IDE.
|
|
Section by section, making sure again that I understand with each section does and fine tuning it
|
|
for my display. Please note, I spent years of my youth manually typing programs from magazines
|
|
into computers. Back then my eyes worked better and my brain worked better and I often spent more
|
|
time troubleshooting and trying to find all the typos that I actually spent typing the program.
|
|
So yes, I will copy and paste other people's programs every time I can and I'll include proper
|
|
attribution for where I got it from. After all, this is a test and if it works, it could be the
|
|
foundation upon which I build the application I really want. I connected my cheap yellow displays
|
|
USB C port to my computer and verified the comp port the windows had chosen to assign it.
|
|
Next, per the instructions in the tutorial, within Arduino IDE, I select the board type that I'm using
|
|
as ESP32 Dev module and I specified the comp port to that which it was connected.
|
|
With a deep breath in a short prayer, I clicked the upload button.
|
|
After what seemed like an eternity of compiling but was actually closer to 36 seconds, I saw the screen
|
|
on my cheap yellow display showing exactly what it should and proudly displaying hello world.
|
|
Alright, now we'll the touch screen work. I clicked button one. The button changed color when I
|
|
pressed it and returned to normal when I released it. Now for button two, a tap toggled it from
|
|
orange to blue and another toggled it back to orange again. Finally, the slider test.
|
|
Moving the slider did work and changed the percentage value being displayed below the
|
|
control. Everything worked. Now we're getting somewhere. There are photos of all of these in the
|
|
show notes. What next? I had a few options. I could use what I learned from hello world to begin
|
|
building my GUI again part by part. But this time manually as the code directly within Arduino IDE
|
|
just manually writing that code not using some other tool for it. To start with I would need to
|
|
learn how to build different screens and to navigate between those. So that's option one. Option two.
|
|
Alright, to be honest, I wasn't thrilled with my experience using SquareLine Studio.
|
|
It is a commercial tool and the licensing is a pain. I recently discovered an open source
|
|
option called EEZ Studio. I could load it and try to rebuild the GUI a little at a time examining
|
|
the code produced as I go along. Other options. I'm sure there are dozens, but I really need
|
|
more information before I can choose what to do. In the end, I choose none of the above. I decided
|
|
to take a closer look at the code which SquareLine built for my GUI and try to learn what is in there.
|
|
It turns out there's quite a bit. Granted, I had built three different screens with
|
|
quite a number of buttons and some other controls. But where hello world included all of the
|
|
source code in a single.iono file. SquareLine had created a number of files. Let's talk about those.
|
|
There was CMakelist.text and filelist.text and those seem to be artifacts from when the GUI code
|
|
was exported from SquareLine. There's a UI.iono file and this is the Arduino C file with several of
|
|
the same foundational structures that can also be found in hello world for configuring individual
|
|
libraries to work with the CYD and things like that. Some of these differ from hello world and
|
|
will require comparison. There's also the UI.c file which starts with a variable section for
|
|
defining screen control, label names and things like that. It also has a function section with code
|
|
for event handling and finally it has a screen section which defines functions for each of the different
|
|
application screens built within SquareLine. Send config and keyboard. There's a UI.h file
|
|
which really does not have much in it. I need to figure out what the that file does.
|
|
There's a UI underscore screen UI underscore send underscore screen.c a UI underscore config
|
|
underscore screen.c and UI underscore keyboard underscore screen.c and these create all the controls
|
|
and labels on each of those screens. The send screen, the config screen and the keyboard screen.
|
|
They specify location, size and some of the functions of those controls.
|
|
There's a UI underscore events.h file which also seems to have very little in it like
|
|
UI underscore h. So there's more research needed and figuring out what the that h files do.
|
|
There's a UI underscore comp underscore hook.c file and it simply includes a list of libraries
|
|
and their versions along with the project name header and it's common that the header is
|
|
common to most of the files that are in this list. There's a UI underscore helper.c and it has
|
|
code related to the properties of several of the controls in the project and a UI underscore helpers
|
|
underscore or dot h UI underscore helpers dot h file and it's the only dot h file that has really
|
|
any amount of code in it but I still don't know what that code is doing. You can find all of these
|
|
on my GitHub repository and I'm posting a link to it in the show notes.
|
|
So this is interesting but I didn't really get anywhere. Remember I mentioned a YouTube video
|
|
by LVGL beginner where I first saw reference to a product called EEZ Studio.
|
|
That video I'll post a link to it in the show notes along with the title but it's a good place to
|
|
start. So I went back to the video and in the video the author shows how to use EEZ Studio to build a
|
|
button. Then he exports the code which is a bunch of files like square line did copies all of the
|
|
created files into the same folder where his dot iano file resides and then he integrates it into
|
|
the dot iano file. In fact he's using a template iano file that was designed by random nerds and
|
|
can be found on the random nerds site and he integrates it by using an include statement and a
|
|
function call. So I went back to my old UI dot iano file from square line. It seems to only
|
|
interact with the remainder of the UI files also through an include include less than ui dot h greater
|
|
than statement. Okay that's where ui dot h comes in that's that's interesting. So there's a line
|
|
for that and there's also a function ui underscore init which which calls some things.
|
|
What if what if my issues were within the ui dot iano file itself in the way it configured
|
|
the board or instantiated the libraries or something. All right I have a working foundation to build
|
|
on let's let's look at something. So I make a copy of the template and I moved it into a new
|
|
test folder and I copied all the square line created user user files into that same test folder
|
|
except for my ui dot iano. Next I edited the version of hello world and removed all of the event
|
|
handlers and the entire lv underscore create underscore main GUI function. Finally I replaced the
|
|
lv underscore create underscore main underscore GUI function call with a ui underscore init function call.
|
|
This couldn't work could it? It's worth a shot. I could always revert back to my saved copy
|
|
of hello world and try something different. I reconnected the capabilities play to the USB
|
|
C cable and I clicked the upload button in the Arduino IDE and then waited for what seemed
|
|
like another eternity while the code compiled. This time taking much longer than 36 seconds.
|
|
I pondered searching youtube for the jeopardy game theme song music to play in the background while
|
|
it waited. Finally the screen on the cheap yellow display went black and amazingly it displayed
|
|
the send button screen that I had originally built in square line. Okay try I thought to myself
|
|
don't get your hopes up you've seen this before. The real test is if any of the buttons work.
|
|
I tapped the config button. The send screen began to slide from left slide to the left to be replaced
|
|
with the config screen. It worked. I tapped the keyboard screen. The config screen
|
|
slid to the left and the keyboard screen slid into its place. I absolutely shouted.
|
|
A lot of enough to scare both of my cats and they jumped from their place where they'd been sleeping
|
|
on the bed in my office and ran out the door. It worked. I still have a ton of work to do. I still
|
|
don't really understand a lot of the parts of this and I need to get a better understanding
|
|
of it but I've got work to do in the GUI and I've got work to do in the actual program part to
|
|
send the Morris code. But this is a good place to stop and savor a little bit of success.
|
|
I look forward to any feedback you might have. Please post it as a comment or send me an email
|
|
using the addresses that are listed in my HPR profile. I hope you have an amazing day and I will
|
|
talk to you again in my next episode.
|
|
You have been listening to the Hacker Public Radio podcast, at hackerpublicradio.org.
|
|
Today's show was contributed by a HPR listener like yourself.
|
|
If you ever thought of recording a podcast, then visit the HPR site to find out how easy it really is.
|
|
Hosting for HPR has been kindly provided by anhonesthost.com, the Internet Archive, rsync.net, and the HPR Community Content Delivery Network.
|
|
Unless otherwise stated, today's show is released under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
|