|
本帖最后由 miao_miao 于 2022-6-3 22:37 编辑
[md]## 修改了楼主的代码,使用的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 long gmtOffset_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 :)
}
~~~
[/md] |
|