Getting Started with Seeed Studio Round Display for XIAO | Seeed Studio Wiki

23 May 2023
Thank you for responding. Here are the steps I took:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Could the following json reference cause any problems?
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
Navigate to Tools > Board > Boards Manager…, type the keyword esp32 in the search box, select the latest version of esp32, and install it. (version 2.08 is installed)

GitHub - lvgl/lvgl: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type. It's boosted by a professional yet affordable drag and drop UI editor, called SquareLine Studio. (installed this library)

Round-Display wiki:
Make sure the json file installed (check)
If you want to use the RTC function on the expansion board, then you also need to search and install the I2C BM8563 RTC library. (check)
If you have previously installed the TFT_eSPI library, please remove the original library and install the new one. (check)https:
Wiki LINK pointed to: //github.com/Maxwelltoo/TFT_eSPI
when installed produced this folder:
C:\Users\blablabla\Documents\Arduino\libraries\TFT_eSPI-master

Round-Display:
Wiki Link: GitHub - Seeed-Studio/Seeed_Arduino_RoundDisplay: An Arduino graphics library based on LVGL, specifically designed for Round Display for XIAO

lv_conf setup:
Then, you need to take the lv_conf.h file and cut it to the root directory of the Arduino library.
CAUTION
Note that the lv_conf.h file here is from Seeed_Arduino_RoundDisplay, not from the LVGL library.
On Windows, the root directory of the Arduino library is:
C:\Users${UserName}\Documents\Arduino\libraries (check)

User_Setup_Select.h setup:
For the content of Round Display, our tutorial will focus on the use of TFT_eSPI.
Please find the TFT_eSPI folder in the root directory of the Arduino library, and then modify the User_Setup_Select.h file in the TFT_eSPI directory.
C:\Users${UserName}\Documents\Arduino\libraries\TFT_eSPI\User_Setup_Select.h
If you want to use the TFT_eSPI library for display driving, you must comment out the line #include <User_Setup.h> and uncomment the line #include <User_Setups/Setup66_Seeed_XIAO_RoundDisplay.h> in the User_Setup_Select.h file.

edited “C:\Users\blablabla\Documents\Arduino\libraries\TFT_eSPI-master\User_Setup_Select.h”
If you want to use the TFT_eSPI library for display driving, you must comment out the line #include <User_Setup.h> and uncomment the line #include <User_Setups/Setup66_Seeed_XIAO_RoundDisplay.h> in the User_Setup_Select.h file. (check)

Arduino Library Overview (LINK BROKEN)
As we can probably tell from the above tutorial, Round Display mainly uses LVGL, TFT_eSPI and Arduino GFX libraries. For the sake of space, we will introduce the use of LVGL and TFT_eSPI libraries separately with the example of drawing a dial.
You can learn about the interface and use of the TFT_eSPI library by clicking here. (This link is broken)

Hardware Test:
Light up your Round Display
Once the hardware and software are ready, we start uploading our first example program. This sample program can be used to check if the Round Display’s RTC clock, SD card and touch functions are working properly.
You can find this sample program in the Arduino IDE under File → Examples → Seeed Arduino Round display → HardwareTest.

Problem compiling:
n file included from C:\Users\blablabla\Documents\Arduino\Seeed_Hardwar_Test\Seeed_Hardwar_Test.ino:7:
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:23: error: variable or field ‘xiao_disp_flush’ declared void
void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
^~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:23: error: ‘lv_disp_drv_t’ was not declared in this scope
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:23: note: suggested alternative: ‘lv_fs_drv_t’
void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
^~~~~~~~~~~~~
lv_fs_drv_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:38: error: ‘disp’ was not declared in this scope
void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
^~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:38: note: suggested alternative: ‘dup’
void xiao_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
^~~~
dup
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:44: error: expected primary-expression before ‘const’
void xiao_disp_flush( lv_disp_drv_t disp, const lv_area_t area, lv_color_t color_p )
^~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:78: error: expected primary-expression before '
’ token
void xiao_disp_flush( lv_disp_drv_t disp, const lv_area_t area, lv_color_t color_p )
^
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:79: error: ‘color_p’ was not declared in this scope
void xiao_disp_flush( lv_disp_drv_t disp, const lv_area_t area, lv_color_t *color_p )
^~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:50:79: note: suggested alternative: ‘lv_color_t’
void xiao_disp_flush( lv_disp_drv_t disp, const lv_area_t area, lv_color_t *color_p )
^~~~~~~
lv_color_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h: In function ‘void lv_xiao_disp_init()’:
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:87:12: error: ‘lv_disp_draw_buf_t’ does not name a type; did you mean ‘lv_draw_ctx_t’?
static lv_disp_draw_buf_t draw_buf;
^~~~~~~~~~~~~~~~~~
lv_draw_ctx_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:89:29: error: ‘draw_buf’ was not declared in this scope
lv_disp_draw_buf_init( &draw_buf, buf, NULL, SCREEN_WIDTH * LVGL_BUFF_SIZE );
^~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:89:5: error: ‘lv_disp_draw_buf_init’ was not declared in this scope
lv_disp_draw_buf_init( &draw_buf, buf, NULL, SCREEN_WIDTH * LVGL_BUFF_SIZE );
^~~~~~~~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:89:5: note: suggested alternative: ‘lv_obj_draw_dsc_init’
lv_disp_draw_buf_init( &draw_buf, buf, NULL, SCREEN_WIDTH * LVGL_BUFF_SIZE );
^~~~~~~~~~~~~~~~~~~~~
lv_obj_draw_dsc_init
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:92:12: error: ‘lv_disp_drv_t’ does not name a type; did you mean ‘lv_fs_drv_t’?
static lv_disp_drv_t disp_drv;
^~~~~~~~~~~~~
lv_fs_drv_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:93:24: error: ‘disp_drv’ was not declared in this scope
lv_disp_drv_init( &disp_drv );
^~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:93:24: note: suggested alternative: ‘lv_disp_dpx’
lv_disp_drv_init( &disp_drv );
^~~~~~~~
lv_disp_dpx
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:93:5: error: ‘lv_disp_drv_init’ was not declared in this scope
lv_disp_drv_init( &disp_drv );
^~~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:93:5: note: suggested alternative: ‘lv_fs_drv_init’
lv_disp_drv_init( &disp_drv );
^~~~~~~~~~~~~~~~
lv_fs_drv_init
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:96:25: error: ‘xiao_disp_flush’ was not declared in this scope
disp_drv.flush_cb = xiao_disp_flush;
^~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:96:25: note: suggested alternative: ‘xiao_disp_init’
disp_drv.flush_cb = xiao_disp_flush;
^~~~~~~~~~~~~~~
xiao_disp_init
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:98:5: error: ‘lv_disp_drv_register’ was not declared in this scope
lv_disp_drv_register( &disp_drv );
^~~~~~~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:98:5: note: suggested alternative: ‘lv_fs_drv_register’
lv_disp_drv_register( &disp_drv );
^~~~~~~~~~~~~~~~~~~~
lv_fs_drv_register
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h: At global scope:
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:19: error: variable or field ‘chsc6x_read’ declared void
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:19: error: ‘lv_indev_drv_t’ was not declared in this scope
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:19: note: suggested alternative: ‘lv_indev_data_t’
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~~~~~~~~~~~
lv_indev_data_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:36: error: ‘indev_driver’ was not declared in this scope
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:36: note: suggested alternative: ‘lv_indev_reset’
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~~~~~~~~~
lv_indev_reset
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:66: error: expected primary-expression before '
’ token
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:68: error: ‘data’ was not declared in this scope
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:141:68: note: suggested alternative: ‘atan’
void chsc6x_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data )
^~~~
atan
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h: In function ‘void lv_xiao_touch_init()’:
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:161:12: error: ‘lv_indev_drv_t’ does not name a type; did you mean ‘lv_indev_data_t’?
static lv_indev_drv_t indev_drv;
^~~~~~~~~~~~~~
lv_indev_data_t
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:162:24: error: ‘indev_drv’ was not declared in this scope
lv_indev_drv_init(&indev_drv);
^~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:162:5: error: ‘lv_indev_drv_init’ was not declared in this scope
lv_indev_drv_init(&indev_drv);
^~~~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:162:5: note: suggested alternative: ‘lv_fs_drv_init’
lv_indev_drv_init(&indev_drv);
^~~~~~~~~~~~~~~~~
lv_fs_drv_init
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:164:25: error: ‘chsc6x_read’ was not declared in this scope
indev_drv.read_cb = chsc6x_read;
^~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:164:25: note: suggested alternative: ‘chsc6x_get_xy’
indev_drv.read_cb = chsc6x_read;
^~~~~~~~~~~
chsc6x_get_xy
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:165:5: error: ‘lv_indev_drv_register’ was not declared in this scope
lv_indev_drv_register(&indev_drv);
^~~~~~~~~~~~~~~~~~~~~
C:\Users\blablabla\Documents\Arduino\libraries\Seeed_Arduino_RoundDisplay-main\src/lv_xiao_round_screen.h:165:5: note: suggested alternative: ‘lv_fs_drv_register’
lv_indev_drv_register(&indev_drv);
^~~~~~~~~~~~~~~~~~~~~
lv_fs_drv_register
In file included from C:\Users\blablabla\Documents\Arduino\Seeed_Hardwar_Test\Seeed_Hardwar_Test.ino:8:
C:\Users\blablabla\AppData\Local\Temp\arduino_build_651078\sketch\lv_hardware_test.h: In function 'void event_handler(lv_event_t
)’:
lv_hardware_test.h:52:41: error: invalid conversion from 'void
’ to 'lv_obj_t
’ {aka '_lv_obj_t
’} [-fpermissive]
lv_obj_t * obj = lv_event_get_target(e);
~~~~~~~~~~~~~~~~~^
C:\Users\blablabla\AppData\Local\Temp\arduino_build_651078\sketch\lv_hardware_test.h: In function 'void slider_event_cb(lv_event_t
)’:
lv_hardware_test.h:72:44: error: invalid conversion from 'void
’ to 'lv_obj_t
’ {aka '_lv_obj_t
’} [-fpermissive]
lv_obj_t * slider = lv_event_get_target(e);
~^
C:\Users\blablabla\AppData\Local\Temp\arduino_build_651078\sketch\lv_hardware_test.h: In function ‘void lv_hardware_test()’:
lv_hardware_test.h:82:5: error: ‘lv_obj_add_event_cb’ was not declared in this scope
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
^
~~
C:\Users\blablabla\AppData\Local\Temp\arduino_build_651078\sketch\lv_hardware_test.h:82:5: note: suggested alternative: ‘lv_obj_add_event’
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
^~~~~~~~~~~~~~~~~~~
lv_obj_add_event
Multiple libraries were found for “SD.h”
Used: C:\Users\blablabla\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\SD
Not used: C:\Program Files (x86)\Arduino\libraries\SD

Bottom Line:
exit status 1
invalid conversion from ‘void*’ to ‘lv_obj_t*’ {aka ‘_lv_obj_t*’} [-fpermissive]

I am not sure why the editor crossed out some of the lines above. Not on my original. Maybe some escape character snuck in!

I couldn’t find the reference of the screen controller and the touch controller.

Could Seeed provide them with the corresponding data sheets?

Thank you!

Hello,
To solve this problem, you can check if the LVGL library version is between 8.3.4 and 8.3.7. I was able to compile with esp32C3 while using 8.3.7 LGVL library.
Note: LVGL library can be downloaded directly from Arudino IDE.

Thank you! The hardware test compiled! Now I am waiting for the Round Display to arrive. It should be here before week is out. It is being handed over to USPS now.

Can I ask a question regarding reTerminal E10-1 (bridge)? I finally found a M.2 SATA III (could not find any SATA II) and it works but after formatting and mounting, I have no permission to use it. I am hoping chmod will fix it. But the real question is the battery power. Installed two that match the specs (Flat tops) and charged the batteries before installing. Should I be able to power up the reTerminal via the E10-1 batteries? If so, it is not working. The 12V adapter powers both the bridge and the reTerminal but not the batteries?

Reference for the M.2 SSD: TEAMGROUP MS30 512GB with SLC Cache 3D NAND TLC M.2 2280 SATA III 6Gb/s Internal Solid State Drive SSD (Read/Write Speed up to 530/430 MB/s) Compatible with Laptop & PC Desktop TM8PS7512G0C101

I remembered also that I did have some trouble or failure with installing/preparing the E10-1.
Are you able to answer or help with this or pass it to someone else?
reTerminal E10-1 instillation failed - Products & Technology - Seeed Forum (seeedstudio.com)

I tried to install/prepare the E10-1 for Audio and it failed. Probably because of the failed overlays.
Are the overlays supposed to work with “Bullseye” AND “Buster”? The install failed on “Bullseye”
Thank you!

For those looking for the datasheets of the screen and touch controllers, see 240x240 Round IPS TFT LCD Display 1.28" Capactive Touch Circle Screen at Buy Display.

Notable differences are:

  • Screen GC9A01A SPI controller: SPI MISO is not implemented on the screen, so reading a pixel is not possible.
  • Touch CST816S I²C controller: automatic low power mode is on, direct read gives 5 bytes for number, event, x, 0, y.

Enjoy!

1 Like

I wish someone could explain exactly what is going on… it seems with all this arduino stuff
its loading up a bunch of extra libraries and changing a bunch of variables and poof its supposed to work but no one can explain what the heck is going on… it is getting worse by the day

maybe one day ChatGPT will write code for us…

LOL, It already is for Seeed Studio Xiao devices.
HTH
GL :slight_smile: PJ :wink:

That is the exact reason why I asked for the data-sheets, found them somewhere else and read them.

So I coded a compact driver I could use without loading and installing half a dozen libraries.

WoW, that is a task for sure. Care to show your code ?
Perhaps it will help answer the questions some users have and add to the community.
unless it’s proprietary :smiley:
AFAIK, You can get more verbose compiler output to Show what is getting loaded and added to the build so maybe look to turn that on?
HTH
GL :slight_smile:

I took three files from GitHub - Bodmer/TFT_eSPI: Arduino and PlatformIO IDE compatible TFT library optimised for the Raspberry Pi Pico (RP2040), STM32, ESP8266 and ESP32 that supports different driver chips and checked them against the example provided by Buy Displays:

  • GC9A01_Defines.h,
  • GC9A01_Init.h to be called first; and
  • GC9A01_Rotation.h to set the coordinates according to the orientation

To set a point at (x1, y1) with colour

x2 = x1;
y2 = y1;

_writeCommand8(TFT_CASET);
_writeData16(x1);
_writeData16(x2);

_writeCommand8(TFT_PASET);
_writeData16(y1);
_writeData16(y2);

_writeCommand8(TFT_RAMWR);
_writeData16(colour);

That’s it!

reivilo, Slick, :grinning: :+1:
TNX.
GL :wink:

If anyone is still having trouble compiling Arduino sketches for the Round Display, here is one clear method I found to make sure the provided examples work. I believe that I ran into some library conflicts originally on my Windows PC. I am not sure how to delete some libraries from my Windows PC - may have to uninstall and re-install Arduino IDE. However, the simple test was using my RPi400 and created a completely new image and then install Arduino IDE. Then adding the required libraries for the Round Display as stated in the wiki. Make sure you do NOT add the TFT_eSPI library from the IDE library options at anytime but download the library from the WIKI! I was able the have no problems compiling the examples.

i seem to remember a portion of the code that required the TFT_eSPI to be commented out //

that may have to do with it too

ps i think on windows if you go into my documents - arduino folder - libraries you can delete offending instalations… but also sometimes the folder is not the same name as the offending file

also during compile error you can see the offending path

windows no longer allows the setup of “dummy users” to separate login
but maybe on lynix you can set up a new login and get a clean install of arduino without having to wipe the whole OS

regards

The official library doesn’t fit into the limited RAM of the Xiao SAMD. The Xiao ESP32 or RP2040 are required.

Hence the minimalistic implementation I am using with all the Xiao boards.

yes i have noticed this as well

1 Like

Anyone got any more tips with this one? I have been back and forward with support on this one getting it working with the Xiao ESP32S3 module but can’t get it to work. Display lights up, but nothing is shown (backlight only)

I’ve been back and forth with support installing different libraries, but nothing works with this display, I’ve got several different circular displays which work fine, but having real trouble with this Xiao display. I’ve even tried Arduino on another computer to rule out old libraries, but cannot get it working.

Very disappointed in my Seeed studio products so far, from reading the documentation before purchasing I was lead to believe this was a well documented and supported piece of hardware. It seems I was wrong.

2 Likes

I’ve got exactly the same issue.

1 Like