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 PJ