The Seeed Studio Round Display
A debugging odyssey on the edge of sanity…
I was looking for a new muse, having been priced out of the Apple world with their new virtual reality headset, when I came across the Seeed Studio Sense, a tiny camera. I have written four articles about turning it into a security camera.
But this paper isn’t about that—it's about my second purchase of a 240x240 Round Display and the journey to get it working. This device isn't on the leading edge of tech; although it felt like the bleeding edge.
In defence of Seeed Studio, most of their documentation [I have seen so far] is very good, with a few other notable contributors like the random nerd guy who has compiled an excellent collection of tutorials in this domain.
Join me in this article to follow through how a man who should be on Seeed Studio payroll, PJ, spent more than two hours on the Seeed Studio forum talking me through figuring out how to get this thing working — a man who deserves all the credit for helping me work the problem!
Ok — onwards and upwards — now this is where Seeed says you should start.
Pay close attention to the TIP in Step 3. Advising you to use version 2.0 of the TFT library, it is an understatement.
Although, beware this isn’t the only one you need to be careful with; you should also check that the board support package you have installed. You’ll need this version of this one.
And don’t miss that button for the library for Round Display; it is also critical.
Now, the next step [4] says to download the latest libraries for TFT and LVGL. No, no, wait—what — did it not just say I shouldn’t use the latest version?
Don’t download the latest version of anything…
This step is misleading. That said, you will need LVGL. I am using this version, and it definitively works.
Don’t make the same mistake I did; look up these libraries on Google and download them from there—no, make sure you use the download buttons in the documentation. This is especially true for this library because it has several critical configuration files that won’t be correct if you use the Google link.
Please pay close attention to the two configuration files used with the LVGL library: User_setup.h and User_Setup_Select.h.
It will compile with these setups incorrect; it just won’t work.
I am working on a Mac, and I find them here in the TFT_eSPI directory.
This is what my User_setup.h says—in theory, if you have followed the instructions to the letter, it should also be what your file says. A critical detail PJ tells me is that the driver you need for the round display is the GC9A01 shown here. If you use a different one, it may not work.
Note the weird line at the top of this screenshot says — show me the file skipping the comments and the blank lines in OSX. If you’re on Windows, I am unsure if you have this option.
cat User_Setup.g | grep -v ^// | grep -v ^$
In the User_Setup_Select.h file, you will find many conditional lines that look like this, together with the definitions captured in the screenshot that follows.
#elif defined (HX8357C_DRIVER)
#include "TFT_Drivers/HX8357C_Defines.h"
#define TFT_DRIVER 0x835C
There are two critical lines in this file right at the top —
#include <User_Setup.h> // Default setup is root library folder
#include <User_Setups/Setup66_Seeed_XIAO_Round.h> // Setup file for Seeed XIAO with GC9A01 240x240
And there you have it. You should be ready to compile and upload your sketch.
Make sure the versions of the LV.conf file are copied as indicated on the Seeed Instructions is done too.
Troubleshooting
But if you missed something here and it goes into one of those kamikaze loops, loading crashing, loading crashing… the best way to reset it is with the Expressif tools. Go to their webpage the Mac/Linux link for which you’ll find here.
And the Windows link for good measure
Follow the steps to get the hello world example working; the five key terminal commands you’ll need again and again — in truth, the last four key steps, again and again, are shown here.
idf.py menuconfig
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/cu.usbmodem1101 flash
idf.py -p /dev/cu.usbmodem1101 monitor
Go through the steps illustrated. Obviously, you’ll need to target your processor, which may not be the esp32s3. The hello world build sends “hello world” to the console, counts down, I think, 10 seconds, and reboots, repeating the process again and again.
To reset “kamikaze mode”, you’ll normally just need to use the flash command; note this will not work if you have your Arduino IDE open.
This brings me to the end of this short write-up of the stages needed to make the Seeed Studio Round Display work. If you’re still struggling, turn on verbose mode in the compiler — you’ll find the option in settings on a Mac and look to check that you’re using these versions for all the libraries being used.
A couple of extra points that should take into account. This is the program I am running. Make sure the Sketch users has 284606 bytes and the Global variables use 14148. If these numbers are not correct, then you have missed something.
#include <TFT_eSPI.h>
#include <SPI.h>
#define USE_TFT_ESPI_LIBRARY
#include "lv_xiao_round_screen.h"
lv_coord_t touchX, touchY;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(TOUCH_INT, INPUT_PULLUP);
Wire.begin();
// Initialise the screen
tft.init();
tft.setRotation(0);
tft.fillScreen(TFT_BLACK);
}
void loop() {
//put your main code here, to run repeatedly:
if(chsc6x_is_pressed())
{
Serial.println("The display is touched.");
chsc6x_get_xy(&touchX, &touchY);
tft.drawCircle(touchX, touchY, 15, TFT_WHITE);
}
delay(500);
}
And be warned: The systems library you have installed predates the release of the ESP32C6, which is incompatible with the display. So not only can you not use it as the host here, but as long as you’re working with the display in question, the Arduino has no knowledge of said chip, and you cannot do anything with the ESP32C6.