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

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.

1 Like

I’ve got exactly the same issue.

I understand the problems people are experiencing and we apologize. Since the LVGL and TFT libraries were not developed by us, there is no way for us to require developers to release versions that work directly with XIAO and Round Display without any modifications. This is true for the vast majority of screen devices, and it is necessary to make changes to the configuration of the libraries.

If you do have trouble with the LVGL and TFT modification steps, I suggest you just use the libraries we’ve already modified instead of downloading them from the Library Manager. If you have better suggestions on how to do this, feel free to submit PRs to our Wiki content as well.

Seeed-Studio-XIAO-Round-Display-lvgl8.3.5/libraries at main · limengdu/Seeed-Studio-XIAO-Round-Display-lvgl8.3.5 (github.com)

Meanwhile, if you have the need to use SquareLine Studio for LVGL GUI development, you are also welcome to refer to my project program for configuration:

This project is based on the SquareLine 1.2.3 export and lvgl 8.3.4 and tft 1.0.6.

All though I was able to test all pins using a LED, I resoldered all joints and the display is working now.

I had the same problem…
I have a XIAO SAMD21 board connected to the XIAO Round display.
After a lot of stress getting the libraries loaded (yes I read the instructions),
I tried to build the HardwareTest sketch.
In the end, the compile fails.
It looks like there is not enough RAM (.bss) space by about 27k!

-R

===
/Users/rolf/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/7-2017q4/bin/…/lib/gcc/arm-none-eabi/7.2.1/…/…/…/…/arm-none-eabi/bin/ld: /var/folders/5j/3r8174xs47b4h2v2f27y0y880000gn/T/arduino_build_428479/HardwareTest.ino.elf section .bss' will not fit in region RAM’
Multiple libraries were found for “TFT_eSPI.h”
Used: /Users/rolf/Documents/Arduino/libraries/TFT_eSPI
Not used: /Users/rolf/Library/Arduino15/packages/Seeeduino/hardware/samd/1.8.5/libraries/Seeed_Arduino_LCD
/Users/rolf/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/7-2017q4/bin/…/lib/gcc/arm-none-eabi/7.2.1/…/…/…/…/arm-none-eabi/bin/ld: region RAM overflowed with stack
/Users/rolf/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/7-2017q4/bin/…/lib/gcc/arm-none-eabi/7.2.1/…/…/…/…/arm-none-eabi/bin/ld: region `RAM’ overflowed by 26932 bytes
collect2: error: ld returned 1 exit status

Sorry, the instructions for the Round display are not correct.
After following the instructions, the HardwareTest sketch was not there.
I had to go search around for a library to get that sketch.
(In the end, that sketch didn’t work for me on the XIAO SAMD21 board, but that’s another story)

May I suggest one of the Seeed engineers look at the solution that worked for me, validate it and share it as an alternative to the listed heavyweights, LVGL and TFT libraries?

Thank you!

Have you tried the solution that worked for me?

You may need to define the pins used by SPI, something like

    // Board Xiao ESP32-C3 crashes if pins are not specified.
    SPI.begin(8, 9, 10); // SCK MISO MOSI

The multiple ESP32 variants and their implementations are rather tricky.

Thanks. I saw your post but have not tried that. What you showed didn’t look like a complete sketch,
just some lines of code.
For example, which libraries are needed in order to run it?
-R

That’s great that you got it working. But, you didn’t say which MCU board you used?
A few more details would help others solve this puzzle.

By the way, the board i used was the XIAO ESP32C3.
After starting my Arduino library from scratch i was able to get the provided demo to work. I have since added dome additional code to blank the screen and display the date and digital time.

like this on , NTP ?

https://forum.seeedstudio.com/t/round-display-with-xiao-nrf52840-sense-tft-espi-lvl-example/270762/3?u=pj_glasso
some output for others as well…
HTH
GL :slight_smile: PJ

Thanks. It seems that people using the ESP32 boards got it working.
I haven’t heard from anyone who was successful using a SAMD21 board though.

I’m trying to get something very basic working with the TFT_eSPI library.
I did verify the pinouts (in User_Setups/Setup66_XIAO_Round_Expansion.h) and they seem to
be correct.
So far no luck.
The Round display just shows garbage pixels and doesn’t draw anything.

Unfortunately, it has been a very long time ago and I should start again from scratch investigating those libraries with the Xiao round display.

Hi there,
I think it’s just not going to fit? or the pins are off or inverted or ? total guess here I don’t have a samd21 they have always been too light weight for my prototypes any way ,You may look at this link ,
SAMD21 (arduino mkr zero) with TFT 3.5 ili9486 albeit not directly about round eye display, but
worthy of a look imho, what frequency is your spi or clock?
GL :slight_smile: PJ

Thanks, good point about the SPI freq. I didn’t set it but somewhere in the header files it is set to something. I’ll take another look.
-R

I’m sorry I’m late. From the error message you provided, it seems that you are correct, and this is most likely due to the Insufficient Memory error that pops up with XIAO SAMD21 running LVGL. In fact, the XIAO SAMD is quite an ancient being with only 32KB of SRAM and 256KB of Flash, which means that it is not capable of carrying LVGL animations with a certain volume (including the XIAO nRF52840 as well). So, I would recommend you to use it to complete some simple image display based on TFT graphics library.

You are right, that the SAMD21 has 256k flash and 32k sram.
The ESP32C3 has 4mb flash and 400k sram, I believe.

Not surprisingly, I wasn’t able to compile Seeed’s basic demo of the Round Display due to insufficient RAM on the
SAMD21 XIAO board.
But, a different demo (tft_espi-base-dial) only uses TFT_eSPI library, and it fit in RAM no problem.
However, it still did not work!
I believe I followed all the configurations suggested in Seeed’s Getting Started guide:

-R

Hi there,
So the Round Display is working Here; Xiao ESP32S3 in the Seat
Using library TFT_eSPI at version 2.5.23 (setup/selects with all edits)The Touch Screen warning NAG is present but it still connects to my WiFi, Then gets IP address and updates the Time from NTP server then Displays the “ROLO” tweaked Watch face.
HTH

#include <Arduino.h>
#include <TFT_eSPI.h>
#include <SPI.h>
#include <Wire.h>
#include "time.h"    //
#include "RTClib.h"  // 

#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
#include "esp_wifi.h"
#include "WiFi.h"

#include "esp_wps.h"  //

const char *ntpServer = "time.cloudflare.com";
const char *ssid     = "GlassSurf-2.4";
const char *password = "SEEEDstudio :-p"; // edited for security and LOL's
#endif

#include "I2C_BM8563.h"
#include "NotoSansBold15.h"
#define ESP_MANUFACTURER  "SEEED"
#define ESP_MODEL_NUMBER  "ESP32C3"
#define ESP_MODEL_NAME    "Xiao ESP"

I2C_BM8563 rtc(I2C_BM8563_DEFAULT_ADDRESS, Wire);
I2C_BM8563_TimeTypeDef timeStruct;
I2C_BM8563_DateTypeDef dateStruct;

//I2C_BM8563_TimeTypeDef tStruct;

TFT_eSPI tft = TFT_eSPI();  // Invoke library, pins defined in User_Setup.h
TFT_eSprite face = TFT_eSprite(&tft);

uint32_t chipId = 0;
#define CLOCK_X_POS 10
#define CLOCK_Y_POS 10

#define CLOCK_FG   TFT_SKYBLUE
#define CLOCK_BG   TFT_NAVY
#define SECCOND_FG TFT_RED
#define LABEL_FG   TFT_GOLD

#define CLOCK_R       230.0f / 2.0f // Clock face radius (float type)
#define H_HAND_LENGTH CLOCK_R/2.0f
#define M_HAND_LENGTH CLOCK_R/1.4f
#define S_HAND_LENGTH CLOCK_R/1.3f

#define FACE_W CLOCK_R * 2 + 1
#define FACE_H CLOCK_R * 2 + 1

// Calculate 1 second increment angles. Hours and minute hand angles
// change every second so we see smooth sub-pixel movement
#define SECOND_ANGLE 360.0 / 60.0
#define MINUTE_ANGLE SECOND_ANGLE / 60.0
#define HOUR_ANGLE   MINUTE_ANGLE / 12.0

// Sprite width and height
#define FACE_W CLOCK_R * 2 + 1
#define FACE_H CLOCK_R * 2 + 1

const long  gmtOffset_sec = -18000;  //For UTC -5.00 : -5 * 60 * 60 : -18000
const int   daylightOffset_sec = 3600;

// Time h:m:s
uint8_t h = 0, m = 0, s = 0;

float time_secs = h * 3600 + m * 60 + s;

// Time for next tick
uint32_t targetTime = 0;

// =========================================================================
// Setup
// =========================================================================
void setup() {
  Serial.begin(9600);
  delay(2500);  //relax...Get Ready for serial port
  Serial.println();
  Serial.println();
  Serial.println("Power ON ");  // Let's BEGIN!!
  Serial.println("");
  // Init and get the time
 // configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  //printLocalTime();
  Serial.println("Program " __FILE__ " compiled on " __DATE__ " at " __TIME__ );
  Serial.println();

  // Initialise the screen
  tft.init();

  // Ideally set orientation for good viewing angle range because
  // the anti-aliasing effectiveness varies with screen viewing angle
  // Usually this is when screen ribbon connector is at the bottom
  tft.setRotation(0);
  tft.fillScreen(TFT_BLACK);

  // Create the clock face sprite
  //face.setColorDepth(8); // 8 bit will work, but reduces effectiveness of anti-aliasing
  face.createSprite(FACE_W, FACE_H);

  // Only 1 font used in the sprite, so can remain loaded
  face.loadFont(NotoSansBold15);

  // Draw the whole clock - NTP time not available yet
  renderFace(time_secs);

#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) 
  {
    delay ( 500 );
    Serial.print ( "." );
  }
  Serial.println("");
  // Init and get the time
  //configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  configTime(8 * 3600, 0, ntpServer);
  struct tm timeInfo;
  if (getLocalTime(&timeInfo)) {
    timeStruct.hours   = timeInfo.tm_hour;
    timeStruct.minutes = timeInfo.tm_min;
    timeStruct.seconds = timeInfo.tm_sec;
    rtc.setTime(&timeStruct);
    //dateStruct.weekDay = timeInfo.tm_wday;
    //dateStruct.month   = timeInfo.tm_mon + 1;
    //dateStruct.date    = timeInfo.tm_mday;
    //dateStruct.year    = timeInfo.tm_year + 1900;
    //rtc.setDate(&dateStruct);
  }
#endif

  Wire.begin();
  rtc.begin();
  syncTime();

  Serial.println();
   for(int i=0; i<17; i=i+8) {
	  chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
	}
	Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
	Serial.printf("This chip has %d cores\n", ESP.getChipCores());
  Serial.print("Chip ID: "); Serial.println(chipId);
  Serial.println("Connected to :" + String(WiFi.SSID()));
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());
  delay (500);
  printLocalTime();
}

// =========================================================================
// Loop
// =========================================================================
void loop() {
  // Update time periodically
  if (targetTime < millis()) {

    // Update next tick time in 100 milliseconds for smooth movement
    targetTime = millis() + 100;

    // Increment time by 100 milliseconds
    time_secs += 0.100;

    // Midnight roll-over
    if (time_secs >= (60 * 60 * 24)) time_secs = 0;

    // All graphics are drawn in sprite to stop flicker
    renderFace(time_secs);

    // syncTime();
  }
}

// =========================================================================
// Draw the clock face in the sprite
// =========================================================================
static void renderFace(float t) {
  float h_angle = t * HOUR_ANGLE;
  float m_angle = t * MINUTE_ANGLE;
  float s_angle = t * SECOND_ANGLE;

  // The face is completely redrawn - this can be done quickly
  face.fillSprite(TFT_BLACK);

  // Draw the face circle
  face.fillSmoothCircle( CLOCK_R, CLOCK_R, CLOCK_R, CLOCK_BG );

  // Set text datum to middle centre and the colour
  face.setTextDatum(MC_DATUM);

  // The background colour will be read during the character rendering
  face.setTextColor(CLOCK_FG, CLOCK_BG);

  // Text offset adjustment
  constexpr uint32_t dialOffset = CLOCK_R - 10;//10

  float xp = 0.0, yp = 0.0; // Use float pixel position for smooth AA motion

  // Draw digits around clock perimeter
  for (uint32_t h = 1; h <= 12; h++) {
    getCoord(CLOCK_R, CLOCK_R, &xp, &yp, dialOffset, h * 360.0 / 12);
    face.drawNumber(h, xp, 2 + yp);
  }

  // Add text (could be digital time...)
  face.setTextColor(LABEL_FG, CLOCK_BG);
  face.drawString("ROLO", CLOCK_R, CLOCK_R * 0.75);

  // Draw minute hand
  getCoord(CLOCK_R, CLOCK_R, &xp, &yp, M_HAND_LENGTH, m_angle);
  face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 6.0f, CLOCK_FG);
  face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 2.0f, CLOCK_BG);

  // Draw hour hand
  getCoord(CLOCK_R, CLOCK_R, &xp, &yp, H_HAND_LENGTH, h_angle);
  face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 6.0f, CLOCK_FG);
  face.drawWideLine(CLOCK_R, CLOCK_R, xp, yp, 2.0f, CLOCK_BG);

  // Draw the central pivot circle
  face.fillSmoothCircle(CLOCK_R, CLOCK_R, 4, CLOCK_FG);

  // Draw Second hand
  getCoord(CLOCK_R, CLOCK_R, &xp, &yp, S_HAND_LENGTH, s_angle);
  face.drawWedgeLine(CLOCK_R, CLOCK_R, xp, yp, 2.5, 1.0, SECCOND_FG);
  face.pushSprite(5, 5, TFT_TRANSPARENT);
}

// =========================================================================
// Get coordinates of end of a line, pivot at x,y, length r, angle a
// =========================================================================
// Coordinates are returned to caller via the xp and yp pointers
#define DEG2RAD 0.0174532925
void getCoord(int16_t x, int16_t y, float *xp, float *yp, int16_t r, float a)
{
  float sx1 = cos( (a - 90) * DEG2RAD);
  float sy1 = sin( (a - 90) * DEG2RAD);
  *xp =  sx1 * r + x;
  *yp =  sy1 * r + y;
}

void syncTime(void){
  targetTime = millis() + 100;
 rtc.getTime(&timeStruct);
  time_secs = timeStruct.hours * 3600 + timeStruct.minutes * 60 + timeStruct.seconds;
  //rtc.getTime(&tStruct);
   // char rtc_time[10];
   // sprintf(rtc_time, "%d:%d:%d", tStruct.hours, tStruct.minutes, tStruct.seconds);
    //Serial.println(rtc_time);

}
void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println("");
  Serial.println(&timeinfo, "%H:%M:%S");  //"%A, %B %d %Y %H:%M:%S"%A	returns day of week
/* %B	returns month of year
%d	returns day of month
%Y	returns year
%H	returns hour
%M	returns minutes
%S	returns seconds
*/
}

compiler Output…

FQBN: esp32:esp32:XIAO_ESP32S3
Using board 'XIAO_ESP32S3' from platform in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8
Using core 'esp32' from platform in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8
Using library TFT_eSPI at version 2.5.23 in folder: D:\Arduino_projects\libraries\TFT_eSPI 
Using library SPI at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\SPI 
Using library FS at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\FS 
Using library SPIFFS at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\SPIFFS 
Using library Wire at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\Wire 
Using library RTClib at version 2.1.3 in folder: D:\Arduino_projects\libraries\RTClib 
Using library Adafruit BusIO at version 1.15.0 in folder: D:\Arduino_projects\libraries\Adafruit_BusIO 
Using library WiFi at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\libraries\WiFi 
Using library I2C BM8563 RTC at version 1.0.4 in folder: D:\Arduino_projects\libraries\I2C_BM8563_RTC 
"C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\xtensa-esp32s3-elf-gcc\\esp-2021r2-patch5-8.4.0/bin/xtensa-esp32s3-elf-size" -A "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\20A0B1C3DA8FE222E73EFD3C122C752F/sketch_feb18a.ino.elf"
Sketch uses 767261 bytes (22%) of program storage space. Maximum is 3342336 bytes.
Global variables use 45156 bytes (13%) of dynamic memory, leaving 282524 bytes for local variables. Maximum is 327680 bytes.
"C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1/esptool.exe" --chip esp32s3 --port "COM23" --baud 921600  --before default_reset --after hard_reset write_flash  -z --flash_mode dio --flash_freq 80m --flash_size 8MB 0x0 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\20A0B1C3DA8FE222E73EFD3C122C752F/sketch_feb18a.ino.bootloader.bin" 0x8000 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\20A0B1C3DA8FE222E73EFD3C122C752F/sketch_feb18a.ino.partitions.bin" 0xe000 "C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8/tools/partitions/boot_app0.bin" 0x10000 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\20A0B1C3DA8FE222E73EFD3C122C752F/sketch_feb18a.ino.bin" 
esptool.py v4.5.1
Serial port COM23
Connecting...
Chip is ESP32-S3 (revision v0.2)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 84:fc:e6:6a:d0:f0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x000cbfff...
Compressed 15040 bytes to 10333...
Writing at 0x00000000... (100 %)
Wrote 15040 bytes (10333 compressed) at 0x00000000 in 0.2 seconds (effective 491.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.0 seconds (effective 566.0 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 792.0 kbit/s)...
Hash of data verified.
Compressed 767632 bytes to 497696...
Writing at 0x00010000... (3 %)
Writing at 0x000194dd... (6 %)
Writing at 0x00024b70... (9 %)
Writing at 0x00031004... (12 %)
Writing at 0x000368ff... (16 %)
Writing at 0x0003bf39... (19 %)
Writing at 0x00041b0b... (22 %)
Writing at 0x000470bd... (25 %)
Writing at 0x0004c47a... (29 %)
Writing at 0x00051568... (32 %)
Writing at 0x00056356... (35 %)
Writing at 0x0005b29a... (38 %)
Writing at 0x000600e4... (41 %)
Writing at 0x00065220... (45 %)
Writing at 0x0006a22e... (48 %)
Writing at 0x0006f7a9... (51 %)
Writing at 0x00075247... (54 %)
Writing at 0x00079fcb... (58 %)
Writing at 0x0007f0fd... (61 %)
Writing at 0x00083ff5... (64 %)
Writing at 0x0008949f... (67 %)
Writing at 0x0008e9c1... (70 %)
Writing at 0x000945a9... (74 %)
Writing at 0x00099c83... (77 %)
Writing at 0x0009f2f3... (80 %)
Writing at 0x000a77b9... (83 %)
Writing at 0x000afe79... (87 %)
Writing at 0x000b5548... (90 %)
Writing at 0x000bdf3a... (93 %)
Writing at 0x000c378c... (96 %)
Writing at 0x000c9258... (100 %)
Wrote 767632 bytes (497696 compressed) at 0x00010000 in 5.6 seconds (effective 1102.2 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Serial OUTPUT

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x2b (SPI_FAST_FLASH_BOOT)
Saved PC:0x420817fa
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x44c
load:0x403c9700,len:0xbe4
load:0x403cc700,len:0x2a38
entry 0x403c98d4


Power ON 

Program C:\Users\Dude\AppData\Local\Temp\.arduinoIDE-unsaved2024118-13664-141pncu.bvqe\sketch_feb18a\sketch_feb18a.ino compiled on Feb 18 2024 at 18:52:07

.

ESP32 Chip model = ESP32-S3 Rev 0
This chip has 2 cores
Chip ID: 7000304
Connected to :GlassSurf-2.4
Got IP: 192.168.1.166

07:54:33

HTH
GL :slight_smile: PJ