合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕彩色时钟-Arduino中文社区 - Powered by Discuz! Archiver

topdog 发表于 2022-5-30 21:26

miao_miao 发表于 2022-5-30 10:10
注释掉后时间全都重叠在一起了。发现TFT_eSPI官方示例下的Sprite/Orrery可以实现时间刷新而不闪烁,希望 ...

好的,受教。:handshake

miao_miao 发表于 2022-6-1 09:08

本帖最后由 miao_miao 于 2022-6-3 22:37 编辑

## 修改了楼主的代码,使用的Sprite实现时间刷新不闪烁,修改
esp32c3_tft_espi_ChineseFont_Time_st7735s.ino:
### 1.在:
~~~arduono
TFT_eSPI tft = TFT_eSPI();
~~~
### 后添加:
~~~arduono
TFT_eSprite clk = TFT_eSprite(&tft);
~~~
### 2.修改printLocalTime函数为:
~~~arduono
void printLocalTime()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
    tft.println("No time available (yet)");
    return;
}

clk.setColorDepth(8);
clk.createSprite(160, 128);
clk.fillSprite(TFT_BLACK);
clk.loadFont(FONTYAHEI24);
clk.setTextDatum(CC_DATUM);
clk.fillScreen(TFT_BLACK);
clk.setTextColor(TFT_RED, TFT_BLACK);
clk.print("上海时间日期: ");
clk.println();
clk.setTextColor(TFT_GREEN, TFT_BLACK);
clk.print(&timeinfo, "%H");
clk.print("时");
clk.print(&timeinfo, "%M");
clk.print("分");
clk.print(&timeinfo, "%S");
clk.print("秒");
clk.println();
clk.unloadFont();
clk.setTextColor(TFT_CYAN, TFT_BLACK);
clk.setTextFont(4);
clk.print(&timeinfo, "%F");
clk.pushSprite(0,0);
clk.deleteSprite();
delay(1000);
}
~~~
### 完整代码:
~~~arduono
#include <WiFi.h>
#include "FontYahei24.h"
#include "time.h"
#include "sntp.h"

#include <SPI.h>
#include <TFT_eSPI.h>


const char* ssid    = "WiFi名称";
const char* password = "WiFi密码";

const char* ntpServer1 = "ntp.ntsc.ac.cn";   //中国国家授时中心
const char* ntpServer2 = "cn.ntp.org.cn";    //中国授时
const longgmtOffset_sec = 8 * 3600;   //参数就是用来修正时区的,比如对于我们东八区(UTC/GMT+08:00)来说该参数就需要填写 8 * 3600
const int   daylightOffset_sec = 0;   //使用夏令时 daylightOffset_sec 就填写3600,否则就填写0;

const char* time_zone = "CST-8";// 亚洲/上海时区规则,包括日光调整规则(可选)


TFT_eSPI    tft = TFT_eSPI();         // Invoke library

TFT_eSprite clk = TFT_eSprite(&tft);// Sprite class

void printLocalTime()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
    tft.println("No time available (yet)");
    return;
}

clk.setColorDepth(8);
clk.createSprite(160, 128);
clk.fillSprite(TFT_BLACK);
clk.loadFont(FONTYAHEI24);
clk.setTextDatum(CC_DATUM);
clk.fillScreen(TFT_BLACK);
clk.setTextColor(TFT_RED, TFT_BLACK);
clk.print("上海时间日期: ");
clk.println();
clk.setTextColor(TFT_GREEN, TFT_BLACK);
clk.print(&timeinfo, "%H");
clk.print("时");
clk.print(&timeinfo, "%M");
clk.print("分");
clk.print(&timeinfo, "%S");
clk.print("秒");
clk.println();
clk.unloadFont();
clk.setTextColor(TFT_CYAN, TFT_BLACK);
clk.setTextFont(4);
clk.print(&timeinfo, "%F");
clk.pushSprite(0,0);
clk.deleteSprite();
delay(1000);

}


// 回调函数(通过NTP调整时间时调用get)
void timeavailable(struct timeval *t)
{
tft.println("Got time adjustment from NTP!");
printLocalTime();
}

void setup()
{
Serial.begin(115200);

// 设置通知回调功能
sntp_set_time_sync_notification_cb( timeavailable );

/**
    NTP服务器地址可以通过DHCP获取,
    注意:该调用应该在esp32通过DHCP获取IP地址之前进行,
    否则SNTP选项42将默认被拒绝。
    注意:configTime()函数在DHCP-client运行后调用
    将覆盖获取的NTP服务器地址
*/
sntp_servermode_dhcp(1);    // (optional)

/**
   这将设置已配置的ntp服务器和常量 TimeZone/daylightOffset
   如果你的时区不需要一年两次调整日光偏移,应该是可以的,
   在这种情况下,时间调整将不会自动处理。
*/
//configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);

/**
   使用daylightOffset处理时区的更方便的方法
   将是使用包括日光调整网规则的TimeZone定义指定一个环境变量。
   可以从中获得专区的规则列表 https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
configTzTime(time_zone, ntpServer1, ntpServer2);




tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
tft.setTextFont(2);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setCursor(0, 0);
//connect to WiFi
tft.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    tft.print("。");
}
tft.println(" CONNECTED");
}

void loop()
{
printLocalTime();   // it will take some time to sync time :)
}

~~~

topdog 发表于 2022-6-3 01:32

本帖最后由 topdog 于 2022-6-3 01:35 编辑

miao_miao 发表于 2022-6-1 09:08
## 修改了楼主的代码,使用的Sprite实现时间刷新不闪烁,修改
esp32c3_tft_espi_ChineseFont_Time_st77 ...
自带库里面有- , clk.unloadFont();要加在-之前,谢谢你的修改和赐教。

miao_miao 发表于 2022-6-3 22:36

topdog 发表于 2022-6-3 01:32
自带库里面有- , clk.unloadFont();要加在-之前,谢谢你的修改和赐教。

多谢,已修改。

yangpenghan 发表于 2022-6-4 15:37

这个板子除了做这个以外还可以做其它的吗?比如说做简单的动画或者根据气温和适度显示穿衣提示。

topdog 发表于 2022-6-5 23:52

yangpenghan 发表于 2022-6-4 15:37
这个板子除了做这个以外还可以做其它的吗?比如说做简单的动画或者根据气温和适度显示穿衣提示。 ...

都可以实现的。

tmld570707 发表于 2022-6-23 16:48

楼主 可不可以这样,一句搞定。
#include <TZ.h>

configTime(TZ_Asia_Shanghai, "pool.ntp.org");

topdog 发表于 2022-6-23 22:30

tmld570707 发表于 2022-6-23 16:48
楼主 可不可以这样,一句搞定。
#include



这是基于官方示例改的应用,用其他的库就不必了。

wangyong159800 发表于 2022-6-24 23:15

牛蛙!!!屏幕好丝滑,大佬呀!!!!!

wangyong159800 发表于 2022-6-24 23:17

miao_miao 发表于 2022-5-30 10:10
注释掉后时间全都重叠在一起了。发现TFT_eSPI官方示例下的Sprite/Orrery可以实现时间刷新而不闪烁,希望 ...

楼主添加了这个小功能,现在不闪,很丝滑
页: 1 [2] 3
查看完整版本: 合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕彩色时钟