- 首先要确定表盘上时针分针秒针的位置。
- 所需变量
- 原点坐标
- 时针终点坐标 (由原点坐标和终点坐标
两点确定一条直线
)分针秒针同理- 时针每移动一次的角度 时针360/12=30度 分针/秒针 360/60=6度
- 当前时间值
- 综上可得核心函数绘制表针
len:时针的长度 其他针同理
value:当前 是第几个小时
interval: 时钟移动一次 30度
color:颜色
void DrawClockHand(int len, int value, int _interval, uint32_t color)
{
float x, y;
x = len * cos(value * _interval * pi / 180 - pi / 2) + 120;
y = len * sin(value * _interval * pi / 180 - pi / 2) + 120;
tft.drawLine(120, 120, x, y, color);
}
使用示例:
#define HLen 35
#define MLen 65
#define SLen 85
#define HInterval 30
#define OInterval 6
_hour = hour();
DrawClockHand(HLen, _hour, HInterval, tft.color565(0, 0, 255));
清除上一步函数
void ClearDrawClockHand(int len, int value, int _interval)
{
float x, y;
x = len * cos(value * _interval * pi / 180 - pi / 2) + 120;
y = len * sin(value * _interval * pi / 180 - pi / 2) + 120;
tft.drawLine(120, 120, x, y, tft.color565(0, 0, 0));
}
主函数思路:定时更新数据,刷新针的移动,移动前擦去上一次的位置。
void loop()
{
static unsigned long time1 = 0;
static unsigned long time2 = 0;
if (millis() - time2 > 20000)
{
time2 = millis();
TJpgDec.drawJpg(0, 0, jpgTime, sizeof(jpgTime));
}
if (millis() - time1 > 1000)
{
time1 = millis();
int tmpHour = hour();
int tmpMin = minute();
int tmpSec = second();
if (tmpHour > 12)
{
tmpHour = tmpHour - 12;
}
if (_hour != tmpHour)
{
ClearDrawClockHand(HLen, _hour, HInterval);
_hour = tmpHour;
}
if (_min != _min)
{
ClearDrawClockHand(MLen, _min, OInterval);
_min = _min;
}
if (_sec != tmpSec)
{
ClearDrawClockHand(SLen, _sec, OInterval);
_sec = tmpSec;
}
DrawClockHand(HLen, _hour, HInterval, tft.color565(0, 0, 255));
DrawClockHand(MLen, _min, OInterval, tft.color565(0, 0, 255));
DrawClockHand(SLen, _sec, OInterval, tft.color565(255, 255, 255));
tft.drawCircle(120,120,8,tft.color565(255, 255, 255));
}
演示图片
素材