Round Display with Xiao Nrf52840 Sense ,TFT_eSPI , LVL Example

I received the Round Display and out of the box the Examples Do not work completely… Go figure?
Battery Level doesn’t read just displays the label.
Slider works, but is Touchy…
SD-card(TFcard) On screen switch is just an indicator.
IMO, looks like they spent a solid 3 minutes or 5th graders were off that day. On testing examples.
Here’s what does for me YMMV.
Get the libs needed, Do the cut and paste, then the comment out , the uncomment in select file etc.

Be sure to Choose the NON mbed Chip “Xiao Nrf52840 Sense” and USB port “EVERY TIME” in IDE 2.0X

HTH
GL :slight_smile: PJ

#include <Arduino.h>
#include <LSM6DS3.h>
#include <Wire.h>
#include <lvgl.h>
// uncomment a library for display driver
#define USE_TFT_ESPI_LIBRARY
// #define USE_ARDUINO_GFX_LIBRARY

#include "lv_xiao_round_screen.h"
#include "lv_hardware_test.h"

void setup()
{
  
 lv_init();
 lv_xiao_disp_init();
 lv_xiao_touch_init();
 
 Serial.begin(9600);
  delay(2000);                       //relax...Get Ready for serial port
  Serial.println("Test program" __FILE__ "compiled on " __DATE__ " at " __TIME__);
  Serial.println();
  Serial.println( "XIAO round screen - LVGL_Arduino" );
  delay(2000);   
     
  lv_hardware_test();
}

void loop()
{
    lv_timer_handler();  //let the GUI do its work 
    delay( 5 );
}

Using library Seeed Arduino LSM6DS3 at version 2.0.3 in folder: C:\Users\Value Pawn\Documents\Arduino\libraries\Seeed_Arduino_LSM6DS3 
Using library Wire at version 1.0 in folder: C:\Users\Value Pawn\AppData\Local\Arduino15\packages\Seeeduino\hardware\nrf52\1.1.1\libraries\Wire 
Using library lvgl at version 8.3.7 in folder: C:\Users\Value Pawn\Documents\Arduino\libraries\lvgl 
Using library Seeed Arduino Round display at version 1.0.0 in folder: C:\Users\Value Pawn\Documents\Arduino\libraries\Seeed_Arduino_Round_display 
Using library SPI at version 1.0 in folder: C:\Users\Value Pawn\AppData\Local\Arduino15\packages\Seeeduino\hardware\nrf52\1.1.1\libraries\SPI 
Using library TFT_eSPI at version 2.5.23 in folder: C:\Users\Value Pawn\Documents\Arduino\libraries\TFT_eSPI 
Using library SD at version 1.2.4 in folder: C:\Users\Value Pawn\AppData\Local\Arduino15\libraries\SD 
Using library I2C BM8563 RTC at version 1.0.4 in folder: C:\Users\Value Pawn\Documents\Arduino\libraries\I2C_BM8563_RTC 
Using library Adafruit TinyUSB Library at version 1.7.0 in folder: C:\Users\Value Pawn\AppData\Local\Arduino15\packages\Seeeduino\hardware\nrf52\1.1.1\libraries\Adafruit_TinyUSB_Arduino 
"C:\\Users\\Value Pawn\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\arm-none-eabi-gcc\\9-2019q4/bin/arm-none-eabi-size" -A "C:\\Users\\Value Pawn\\AppData\\Local\\Temp\\arduino\\sketches\\6DC0D7935EF980F89A0D4B23A1B8BA04/HardwareTest.ino.elf"
Sketch uses 290236 bytes (35%) of program storage space. Maximum is 811008 bytes.
Global variables use 63932 bytes (26%) of dynamic memory, leaving 173636 bytes for local variables. Maximum is 237568 bytes.
Performing 1200-bps touch reset on serial port COM11
Waiting for upload port...
Upload port found on COM10
"C:\Users\Value Pawn\AppData\Local\Arduino15\packages\Seeeduino\hardware\nrf52\1.1.1/tools/adafruit-nrfutil/win32/adafruit-nrfutil.exe" --verbose dfu serial -pkg "C:\Users\Value Pawn\AppData\Local\Temp\arduino\sketches\6DC0D7935EF980F89A0D4B23A1B8BA04/HardwareTest.ino.zip" -p COM10 -b 115200 --singlebank
Upgrading target on COM10 with DFU package C:\Users\Value Pawn\AppData\Local\Temp\arduino\sketches\6DC0D7935EF980F89A0D4B23A1B8BA04\HardwareTest.ino.zip. Flow control is disabled, Single bank, Touch disabled
Opened serial port COM10
Starting DFU upgrade of type 4, SoftDevice size: 0, bootloader size: 0, application size: 290244
Sending DFU start packet
Sending DFU init packet
Sending firmware file
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
########################################
#######
Activating new firmware

DFU upgrade took 18.999632835388184s
Device programmed.

The display switch does not need to be “ON” to upload successfully…LOL (don’t ask how I know) :stuck_out_tongue_closed_eyes:
Display power switch does NOT reset the Xiao. (you have to press the tiny button)
I only needed to put it in “boot-loader” mode initially for the first Upload, all subsequent uploads worked straight away with it being detected correctly and board and port set each time.




The Display is Nice the Touch is OK, It’s way to “PHAT” IMO. “THICK” with the added battery.
thay should have gone more in this direction.
https://www.instagram.com/pauls_3d_things/
I have two of theses and they are sweet the round and thin watch only (no-GPS)

Looks like ttgo is also getting in on the round bandwagon…
https://www.cnx-software.com/2023/06/10/t-rgb-esp32-s3-board-gets-larger-2-8-inch-round-color-display/

:sunglasses: :v:

Be sure to Choose the NON mbed Chip “Xiao Nrf52840 Sense” and USB port “EVERY TIME” in IDE 2.0X

Thanx so much. This saved me a lot of time. Didn’t realize that the IDE managed to switch back to the not-Sense version and all compilation failed when I tried the TFT_eSPI_Clock sample.

So, i went and Grabbed a Xiao Esp32C3 took some uninstall of tbe TFT_Espi in the brds file ,and include Zip lib of the git hub one.
Works ok. with “TFT_eSPIClock.ino” example
But time is off , by some hours, the RTC and NTP server time are correct.
Go figure.:sweat_smile::ok_hand:



Here is whats working.

#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 = "SEEDSTUDIO :-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
*/
}

Hers’s the output

Power ON 

Program D:\Arduino_projects\libraries\Seeed_Arduino_Round_display\examples\TFT_eSPI_Clock\TFT_eSPI_Clock.ino compiled on Sep 15 2023 at 20:46:12

..

ESP32 Chip model = ESP32-C3 Rev 3
This chip has 1 cores
Chip ID: 4170632
Connected to :GlassSurf-2.4
Got IP: 192.168.1.188

08:46:31

HTH
GL :slight_smile: