Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: topdog

合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕彩色时钟

[复制链接]
 楼主| 发表于 2022-5-30 21:26 | 显示全部楼层
miao_miao 发表于 2022-5-30 10:10
注释掉后时间全都重叠在一起了。发现TFT_eSPI官方示例下的Sprite/Orrery可以实现时间刷新而不闪烁,希望 ...

好的,受教。
发表于 2022-6-1 09:08 | 显示全部楼层
本帖最后由 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]
 楼主| 发表于 2022-6-3 01:32 | 显示全部楼层
本帖最后由 topdog 于 2022-6-3 01:35 编辑
miao_miao 发表于 2022-6-1 09:08
[md]## 修改了楼主的代码,使用的Sprite实现时间刷新不闪烁,修改
esp32c3_tft_espi_ChineseFont_Time_st77 ...

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

多谢,已修改。
发表于 2022-6-4 15:37 | 显示全部楼层
这个板子除了做这个以外还可以做其它的吗?比如说做简单的动画或者根据气温和适度显示穿衣提示。
 楼主| 发表于 2022-6-5 23:52 | 显示全部楼层
yangpenghan 发表于 2022-6-4 15:37
这个板子除了做这个以外还可以做其它的吗?比如说做简单的动画或者根据气温和适度显示穿衣提示。 ...

都可以实现的。
发表于 2022-6-23 16:48 | 显示全部楼层
楼主 可不可以这样,一句搞定。
#include <TZ.h>

configTime(TZ_Asia_Shanghai, "pool.ntp.org");
 楼主| 发表于 2022-6-23 22:30 | 显示全部楼层
tmld570707 发表于 2022-6-23 16:48
楼主 可不可以这样,一句搞定。
#include

这是基于官方示例改的应用,用其他的库就不必了。
发表于 2022-6-24 23:15 | 显示全部楼层
牛蛙!!!屏幕好丝滑,大佬呀!!!!!
发表于 2022-6-24 23:17 | 显示全部楼层
miao_miao 发表于 2022-5-30 10:10
注释掉后时间全都重叠在一起了。发现TFT_eSPI官方示例下的Sprite/Orrery可以实现时间刷新而不闪烁,希望 ...

楼主添加了这个小功能,现在不闪,很丝滑
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-9 14:16 , Processed in 0.068584 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表