【花雕学编程】Arduino TFT 之绘制线条

在这里插入图片描述

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino TFT 是指与 Arduino 开发板兼容的薄膜晶体管(Thin - Film - Transistor)液晶显示屏,以下是其主要特点、应用场景及注意事项的详细介绍:

一、主要特点
1、高分辨率显示:TFT 显示屏通常具有较高的分辨率,能够提供清晰、细腻的图像和文字显示效果。这使得它可以展示复杂的图形界面、丰富的色彩以及详细的信息,满足各种应用对显示质量的要求。
2、快速响应速度:TFT 技术能够实现快速的像素切换,响应速度比传统的液晶显示屏更快。这意味着在显示动态图像或进行交互操作时,不会出现明显的拖影或延迟,提供流畅的视觉体验。
3、宽视角:具有较宽的可视角度,无论从哪个方向观看显示屏,都能获得清晰的图像和一致的色彩表现。这使得在不同角度下观察显示屏时,都能保证信息的准确传达,方便多人同时查看或在不同位置操作设备。
4、丰富的色彩表现:能够呈现出丰富、鲜艳的色彩,具备较高的色彩饱和度和对比度。可以准确地显示各种颜色,使图像和界面更加生动逼真,适用于需要展示彩色图像或进行视觉交互的应用。
5、易于控制:通过 Arduino 开发板可以方便地对 TFT 显示屏进行控制。借助相应的库函数和代码,能够轻松实现图像绘制、文字显示、触摸交互等功能,降低了开发难度,即使对于没有深厚显示技术背景的开发者也较为友好。

二、应用场景
1、人机交互界面:在各种电子设备中,如智能仪器仪表、智能家居控制系统、工业自动化控制面板等,作为人机交互的窗口,用于显示菜单、参数设置界面、实时数据监测以及操作提示等信息,方便用户与设备进行交互。
2、教育领域:可用于制作教育实验设备、电子学习工具等。例如,在教学机器人中作为显示屏,展示机器人的状态信息、任务指令以及互动内容;在电子积木等教育玩具中,显示图形化的编程界面或游戏画面,增加学习的趣味性和互动性。
3、便携式设备:如手持游戏机、电子书阅读器、便携式多媒体播放器等。其高分辨率、宽视角和丰富的色彩表现能够为用户提供良好的视觉享受,同时快速响应速度也适合处理游戏中的动态画面和多媒体内容的播放。
4、物联网应用:在物联网项目中,作为节点设备的显示屏,用于展示传感器采集的数据、设备状态信息以及远程控制界面等。例如,在环境监测系统中,显示温度、湿度、空气质量等数据;在智能农业中,展示农田的灌溉状态、作物生长信息等。

三、需要注意的事项
1、电源管理:TFT 显示屏通常需要稳定的电源供应,并且其功耗相对较高。在与 Arduino 连接时,要确保电源能够满足显示屏的需求,避免因电源不稳定导致显示屏出现闪烁、显示异常或损坏等问题。同时,要合理设计电源电路,考虑节能措施,特别是在电池供电的设备中,以延长设备的续航时间。
2、接口兼容性:不同型号的 Arduino 开发板和 TFT 显示屏可能具有不同的接口类型和通信协议。在选择和使用时,要确保两者之间的接口兼容,并且正确连接引脚。有些 TFT 显示屏可能需要额外的驱动电路或转接板才能与 Arduino 顺利连接,需要仔细阅读产品说明书并进行相应的配置。
3、显示内存限制:虽然 TFT 显示屏能够显示丰富的内容,但 Arduino 的内存资源有限。在绘制复杂图像或显示大量数据时,可能会遇到内存不足的问题。因此,需要合理规划显示内容,优化图像和数据的存储方式,避免因内存耗尽导致程序崩溃或显示异常。
4、驱动程序和库的使用:为了实现 TFT 显示屏的各种功能,需要使用相应的驱动程序和库。不同的显示屏可能需要不同的库,并且这些库可能会不断更新和改进。在使用过程中,要及时关注官方文档和社区资源,获取最新的驱动程序和库,并了解其使用方法和注意事项。同时,要注意库与 Arduino IDE 版本的兼容性,避免出现编译错误或运行时问题。
5、电磁干扰:在一些电磁环境较为复杂的场合,TFT 显示屏可能会受到电磁干扰,导致显示出现噪点、闪烁或颜色异常等问题。此时,需要采取相应的抗干扰措施,如合理布线、使用屏蔽线、添加滤波电容等,以确保显示屏的稳定工作。

在这里插入图片描述
一、主要特点
基于像素级控制

在TFT屏幕上绘制线条的本质是通过操控屏幕上的像素点,将指定起点和终点之间的像素点亮并连接起来。Arduino通常通过TFT库中的函数(如drawLine())来实现这一操作。
支持多种颜色

TFT屏幕支持丰富的颜色显示,因此在绘制线条时可以选择不同的颜色值(RGB格式)。这使得线条可以用于区分不同的数据或增强视觉效果。
灵活性高

绘制线条的起点和终点可以任意指定,因此可以通过调整坐标参数来绘制水平线、垂直线或任意角度的斜线。
依赖硬件性能

线条的绘制速度和分辨率受TFT屏幕的驱动芯片(如ILI9341、ST7735等)以及Arduino主控板(如Uno、Mega、ESP32等)的性能影响。
抗锯齿能力有限

由于Arduino的处理能力和TFT屏幕的分辨率限制,绘制的线条可能在某些情况下出现锯齿现象,尤其是在低分辨率屏幕上绘制斜线时。
二、应用场景
图形用户界面(GUI)设计

在TFT屏幕上创建简单的用户界面时,线条常用于分隔不同区域、绘制边框或突出显示特定内容。例如,在仪表盘界面中,线条可以用来分割不同的数据显示区域。
数据可视化

在实时监控系统中,线条可用于绘制折线图或趋势线,帮助用户直观地观察数据变化。例如,温度传感器的数据可以用线条表示随时间的变化曲线。
游戏开发

在基于Arduino的简单游戏中,线条可以用来绘制迷宫、边界或其他游戏元素。例如,贪吃蛇游戏中,线条可以用来绘制游戏区域的边界。
艺术创作与动画

结合循环和随机数生成,可以利用线条绘制动态的艺术图案或实现简单的动画效果。例如,模拟流星划过屏幕的效果。
辅助调试与测试

在开发过程中,线条可以用来标记屏幕上的特定位置或区域,便于调试和验证代码逻辑。
三、需要注意的事项
坐标系的理解
TFT屏幕的坐标系原点(0,0)通常位于屏幕的左上角,X轴向右递增,Y轴向下递增。
确保正确设置起点和终点的坐标值,避免因坐标错误导致线条绘制异常。
颜色值的选择
使用RGB颜色值时,需确保颜色值符合TFT库的要求(通常为16位RGB565格式)。
注意背景色与线条颜色的对比度,以保证线条清晰可见。
性能优化
在需要频繁绘制线条的场景中(如实时数据更新),应注意优化代码逻辑,减少不必要的重绘操作。
如果使用较慢的Arduino主控板(如Uno),可能需要降低刷新频率以避免卡顿。
屏幕分辨率的影响
不同型号的TFT屏幕分辨率不同(如128x160、240x320等),绘制线条时应根据屏幕分辨率合理设置坐标范围。
高分辨率屏幕可能需要更高的计算资源,建议选择性能更强的主控板(如ESP32)。
锯齿问题的处理
对于斜线或对角线,由于像素点的离散性,可能会出现锯齿现象。可以通过算法优化(如Bresenham算法)或提高屏幕分辨率来缓解。
库的兼容性
不同的TFT屏幕可能需要使用不同的驱动库(如Adafruit GFX库、MCUFRIEND_kbv库等),在使用前需确认所选库是否支持目标屏幕。
确保库版本与屏幕驱动芯片匹配,以避免功能异常。

在这里插入图片描述
1、绘制简单的直线网格

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

// 定义TFT引脚
#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(9600);
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
}

void loop() {
  // 绘制水平直线
  for (int y = 10; y < tft.height(); y += 20) {
    tft.drawLine(10, y, tft.width() - 10, y, ST7735_WHITE);
  }
  // 绘制垂直直线
  for (int x = 10; x < tft.width(); x += 20) {
    tft.drawLine(x, 10, x, tft.height() - 10, ST7735_WHITE);
  }
  delay(5000);
  tft.fillScreen(ST7735_BLACK);
}

要点解读:
库的使用:引入Adafruit_GFX和Adafruit_ST7735库,前者是图形绘制的基础库,后者用于驱动 TFT 屏幕。
初始化:在setup函数里对串口通信进行初始化,同时初始化 TFT 屏幕,设置旋转方向并填充背景为黑色。
直线绘制:在loop函数中,借助for循环分别绘制水平和垂直的直线,从而构成网格。tft.drawLine函数的参数依次为起始点的x、y坐标,终点的x、y坐标,以及线条颜色。
延迟与清屏:绘制完成后延迟 5 秒,接着清屏,方便后续的操作。

2、绘制动态折线图

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

// 定义TFT引脚
#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// 模拟数据
const int numPoints = 20;
int data[numPoints];

void setup() {
  Serial.begin(9600);
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
  // 初始化数据
  for (int i = 0; i < numPoints; i++) {
    data[i] = random(10, tft.height() - 10);
  }
}

void loop() {
  tft.fillScreen(ST7735_BLACK);
  // 绘制折线图
  for (int i = 0; i < numPoints - 1; i++) {
    int x1 = 10 + i * (tft.width() - 20) / (numPoints - 1);
    int y1 = data[i];
    int x2 = 10 + (i + 1) * (tft.width() - 20) / (numPoints - 1);
    int y2 = data[i + 1];
    tft.drawLine(x1, y1, x2, y2, ST7735_GREEN);
  }
  // 更新数据
  for (int i = 0; i < numPoints - 1; i++) {
    data[i] = data[i + 1];
  }
  data[numPoints - 1] = random(10, tft.height() - 10);
  delay(500);
}

要点解读:
数据模拟:运用数组data来模拟要绘制折线图的数据,并且在setup函数中对其进行初始化。
折线图绘制:在loop函数里,通过循环计算每个数据点的坐标,再使用drawLine函数连接相邻的数据点,从而绘制出折线图。
数据更新:每次绘制完折线图之后,更新数据数组,把前一个数据点的值赋给当前数据点,最后一个数据点的值则随机生成,以此实现动态效果。
延迟:每次绘制完成后延迟 500 毫秒,这样能让用户观察到动态变化。

3、绘制动态螺旋线

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <math.h>

// 定义TFT引脚
#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// 螺旋线参数
float angle = 0;
float radius = 10;
float angleStep = 0.1;
float radiusStep = 0.1;

void setup() {
  Serial.begin(9600);
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
}

void loop() {
  int centerX = tft.width() / 2;
  int centerY = tft.height() / 2;
  int x1 = centerX + radius * cos(angle);
  int y1 = centerY + radius * sin(angle);
  angle += angleStep;
  radius += radiusStep;
  int x2 = centerX + radius * cos(angle);
  int y2 = centerY + radius * sin(angle);
  tft.drawLine(x1, y1, x2, y2, ST7735_BLUE);
  if (radius > tft.width() / 2 || radius < 10) {
    radiusStep = -radiusStep;
  }
  delay(20);
}

要点解读:
数学函数运用:借助math.h库中的cos和sin函数来计算螺旋线每个点的坐标。
螺旋线绘制:在loop函数里,依据螺旋线的参数计算起始点和终点的坐标,然后使用drawLine函数绘制线段,逐步形成螺旋线。
参数更新:每次绘制完线段之后,更新角度和半径的值,实现螺旋线的动态扩展或收缩。
边界检测:当半径超出屏幕范围或者小于最小值时,改变半径的增长方向,让螺旋线能够来回动态变化。

在这里插入图片描述

4、ESP32 CYD液晶2.8寸开发板全屏动态循环显示红绿线条

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
 
void setup() {
    tft.init();
    tft.setRotation(1);
    tft.fillScreen(TFT_BLACK);
}
 
void loop() {
    for (int x = 0; x < tft.width(); x += 10) {
        tft.drawLine(0, 0, x, tft.height(), TFT_RED);
        delay(100);
    }
    for (int y = 0; y < tft.height(); y += 10) {
        tft.drawLine(0, 0, tft.width(), y, TFT_GREEN);
        delay(100);
    }
    delay(2000);
    tft.fillScreen(TFT_BLACK);
}

要点解读
初始化屏幕:使用TFT_eSPI库初始化TFT屏幕,并通过setRotation()设置屏幕旋转方向。
动态绘制线条:通过drawLine()函数逐步绘制红色和绿色线条,实现动态显示效果。
延迟控制:使用delay()函数控制绘制速度,使动态效果更加明显。
清屏:在重新绘制前使用fillScreen()函数填充屏幕为黑色,确保显示效果清晰。

5、在TFT屏幕上绘制表盘(部分)

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);
}
 
void loop() {
    static unsigned long lastTime = 0;
    if (millis() - lastTime > 1000) {
        lastTime = millis();
        int hourValue = hour();
        DrawClockHand(35, hourValue, 30, TFT_BLUE); // 绘制时针
        // 类似地绘制分针和秒针
    }
}

要点解读
表盘绘制原理:通过计算时针、分针和秒针的终点坐标,使用drawLine()函数绘制表针。
角度计算:根据当前时间计算表针的角度,使用三角函数计算表针的终点坐标。
定时更新:使用millis()函数定时更新表针位置,实现时钟的动态显示。

6、1.28寸圆形彩色TFT显示屏绘制动态扩散的霓虹渐变光环(部分)

#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>
 
#define TFT_CS 4
#define TFT_DC 2
#define TFT_RST -1
 
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
 
void setup() {
    tft.begin();
    tft.setRotation(1);
}
 
void loop() {
    static int radius = 10;
    static int colorIndex = 0;
    tft.fillScreen(TFT_BLACK);
    tft.drawCircle(120, 120, radius, neonColors[colorIndex]);
    radius += 2;
    if (radius >= 120) {
        radius = 10;
        colorIndex = (colorIndex + 1) % 7;
    }
    delay(200);
}

要点解读
屏幕初始化:使用Adafruit_GC9A01A库初始化TFT屏幕,并设置屏幕旋转方向。
动态光环绘制:通过drawCircle()函数绘制不同半径和颜色的圆圈,实现光环的动态扩散效果。
颜色渐变:使用数组存储多种颜色,通过改变颜色索引实现光环的颜色渐变。
延迟控制:使用delay()函数控制动画速度,使光环扩散平滑。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值