Arduino C语言 240*240 TFT 显示屏绘制表盘手把手教学,粗暴易懂

  1. 首先要确定表盘上时针分针秒针的位置。
  2. 所需变量
  1. 原点坐标
  2. 时针终点坐标 (由原点坐标和终点坐标 两点确定一条直线)分针秒针同理
  3. 时针每移动一次的角度 时针360/12=30度 分针/秒针 360/60=6度
  4. 当前时间值
  1. 综上可得核心函数绘制表针

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));
  }

演示图片
在这里插入图片描述
素材
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ou.cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值