【花雕学编程】Arduino TFT 之绘制单个点和多条线

在这里插入图片描述

《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html

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 显示屏可能会受到电磁干扰,导致显示出现噪点、闪烁或颜色异常等问题。此时,需要采取相应的抗干扰措施,如合理布线、使用屏蔽线、添加滤波电容等,以确保显示屏的稳定工作。

在这里插入图片描述
在Arduino项目中,使用TFT(Thin-Film Transistor)显示屏进行绘图操作是一种常见的需求,尤其是在需要直观展示数据或创建用户界面的场合。绘制单个点和多条线是TFT绘图的基础功能,它们为更复杂的图形和动画奠定了基础。

1、绘制单个点
主要特点
精确控制:可以对屏幕上的每一个像素进行单独操作,提供了极高的灵活性。
简单实现:通过指定坐标位置即可轻松地在屏幕上绘制一个点。
资源消耗小:相对于绘制复杂图形,绘制单个点所需的计算资源和内存较少。
应用场景
传感器数据可视化:例如,在显示温度随时间变化的趋势时,可以通过绘制一系列点来形成折线图。
游戏开发:在简单的2D游戏中,用于表示角色的位置或其他关键元素。
实验与教学:作为学习基础图形编程和理解坐标系统的一个简单示例。
需要注意的事项
性能优化:尽管绘制单个点的操作相对简单,但如果需要频繁更新大量点的位置,则可能会影响整体性能。应考虑采用批量处理或双缓冲技术减少闪烁。
坐标系理解:确保正确理解和设置TFT屏幕的坐标系,通常左上角为(0, 0),向右下方递增。

2、绘制多条线
主要特点
连接性:能够将多个点连接起来形成连续的线条,适用于绘制路径、边界或者任何连续的数据集。
多样化样式:支持设置线条的颜色、宽度等属性,增加视觉表达力。
动态更新能力:可以根据实时数据动态调整线条的位置和形状,非常适合用于动态图表或交互式界面。
应用场景
实时数据分析:如心电图(ECG)、股票走势图等,通过不断刷新线条来反映最新的数据变化。
导航系统:用于显示路线规划结果,帮助用户理解从当前位置到目的地的最佳路径。
艺术创作工具:允许用户自由绘制图案或文字,激发创意表达。
需要注意的事项
效率问题:绘制大量线条可能会导致性能下降,特别是当线条数量庞大且需要频繁重绘时。优化算法以减少不必要的重绘非常重要。
抗锯齿处理:为了提高线条的质量,特别是在高分辨率屏幕上,可能需要应用抗锯齿技术来平滑边缘。
颜色管理:合理选择颜色对比度,保证在不同光照条件下都能清晰可见;同时注意色彩搭配以提升用户体验。

在这里插入图片描述

1、绘制单个点

#include <TFT_eSPI.h>  // 引入TFT_eSPI库

TFT_eSPI tft 
= TFT_eSPI();  // 创建TFT对象

void setup() {
  tft
.begin();  // 初始化TFT屏幕
  tft
.setRotation(1);  // 设置屏幕方向
  tft
.fillScreen(TFT_BLACK);  // 填充屏幕为黑色
}

void loop() {
  // 绘制单个点
  tft
.drawPixel(64, 64, TFT_RED);  // 在屏幕中心绘制一个红色点
  delay(2000);  // 延迟2秒
}

要点解读:
• 点的绘制:使用drawPixel函数在指定位置绘制单个点。
• 颜色设置:通过TFT_RED等宏设置点的颜色。
• 屏幕初始化:通过fillScreen函数设置屏幕背景颜色。

2、绘制多条线

#include <TFT_eSPI.h>  // 引入TFT_eSPI库

TFT_eSPI tft 
= TFT_eSPI();  // 创建TFT对象

void setup() {
  tft
.begin();  // 初始化TFT屏幕
  tft
.setRotation(1);  // 设置屏幕方向
  tft
.fillScreen(TFT_BLACK);  // 填充屏幕为黑色
}

void loop() {
  // 绘制多条线
  for (int i = 0; i < 10; i++) {
    tft
.drawLine(0, i * 10, tft.width(), i * 10, TFT_GREEN);  // 绘制水平线
    tft
.drawLine(i * 10, 0, i * 10, tft.height(), TFT_BLUE);  // 绘制垂直线
    delay(100);  // 控制绘制速度
  }
}

要点解读:
• 线的绘制:使用drawLine函数绘制线条,指定起点和终点坐标。
• 动态效果:通过循环逐条绘制线条,实现动态效果。
• 颜色设置:通过TFT_GREEN和TFT_BLUE等宏设置线条颜色。

3、绘制单个点和多条线的组合动画

#include <TFT_eSPI.h>  // 引入TFT_eSPI库

TFT_eSPI tft 
= TFT_eSPI();  // 创建TFT对象

void setup() {
  tft
.begin();  // 初始化TFT屏幕
  tft
.setRotation(1);  // 设置屏幕方向
  tft
.fillScreen(TFT_BLACK);  // 填充屏幕为黑色
}

void loop() {
  // 绘制单个点
  tft
.drawPixel(64, 64, TFT_RED);  // 在屏幕中心绘制一个红色点
  delay(500);  // 延迟500毫秒

  // 绘制多条线
  for (int i = 0; i < 10; i++) {
    tft
.drawLine(0, i * 10, tft.width(), i * 10, TFT_GREEN);  // 绘制水平线
    tft
.drawLine(i * 10, 0, i * 10, tft.height(), TFT_BLUE);  // 绘制垂直线
    delay(100);  // 控制绘制速度
  }

  delay(2000);  // 延迟2秒
  tft
.fillScreen(TFT_BLACK);  // 清屏
}

要点解读:
• 组合动画:先绘制单个点,然后绘制多条线,形成组合动画效果。
• 清屏操作:使用fillScreen函数清屏,为下一次动画做准备。
• 动态效果:通过控制延迟实现动画的动态效果。

在这里插入图片描述
4、基础图形绘制——绘制坐标系与标定点

#include <MCUFRIEND_kbv.h>
#define CS A3, DC A2, WR A1, RD A0, RST A4
MCUFRIEND_kbv tft(CS, DC, WR, RD, RST);
 
void setup() {
  tft.reset();
  uint16_t ID = tft.readID();
  tft.begin(ID);
  tft.fillScreen(BLACK);
  
  // 绘制坐标系
  tft.drawFastHLine(0, 120, 240, WHITE);  // 水平中线
  tft.drawFastVLine(120, 0, 240, WHITE);  // 垂直中线
  
  // 绘制标定点(红色)
  tft.drawPixel(120, 120, RED);
  tft.drawCircle(120, 120, 3, RED);  // 增强视觉效果
}
 
void loop() {}

要点解读

硬件适配:通过readID()自动识别屏幕驱动芯片(如ILI9341),兼容性更强。
坐标系绘制:使用drawFastHLine和drawFastVLine快速绘制横纵轴,减少计算开销。
标定点增强:结合drawPixel与drawCircle突出关键点,提升可读性。

5、动态交互——触摸屏绘制折线图

#include <TouchScreen.h>
#include <MCUFRIEND_kbv.h>
#define YP A1, XM A2, YM 7, XP 6  // 触摸屏引脚定义
TouchScreen ts = TouchScreen(YP, XM, YM, XP, 300);
MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);
 
void setup() {
  tft.begin();
  tft.fillScreen(BLACK);
  tft.drawFastHLine(0, 120, 240, WHITE);  // 基线
}
 
void loop() {
  TSPoint p = ts.getPoint();
  if (p.z > ts.pressureThreshhold) {  // 检测触摸
    int x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
    int y = map(p.y, TS_MINY, TS_MAXY, 0, 240);
    
    // 绘制新点并连接前一点
    static int lastX = -1, lastY = -1;
    if (lastX != -1) {
      tft.drawLine(lastX, lastY, x, y, GREEN);
    }
    lastX = x; lastY = y;
  }
}

要点解读

触摸屏集成:通过TouchScreen库解析电阻式触摸屏数据,支持实时交互。
动态绘图:利用drawLine实现连续点连接,模拟折线图效果。
坐标映射:map()函数将触摸屏原始坐标转换为屏幕像素坐标,适配不同分辨率。

6、艺术化效果——随机线条动画

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);
 
void setup() {
  tft.begin();
  tft.fillScreen(BLACK);
  randomSeed(analogRead(0));  // 初始化随机数种子
}
 
void loop() {
  // 随机生成线条参数
  int x1 = random(240), y1 = random(240);
  int x2 = random(240), y2 = random(240);
  uint16_t color = random(0xFFFF);  // 随机颜色
  
  // 绘制线条并渐变消失
  for (int i = 0; i < 50; i++) {
    tft.drawLine(x1, y1, x2, y2, color);
    delay(20);
    tft.drawLine(x1, y1, x2, y2, BLACK);  // 覆盖旧线实现“消失”效果
  }
}

要点解读
随机化设计:通过random()生成动态线条参数,提升视觉丰富度。
渐变消失:覆盖旧线实现“擦除”效果,避免屏幕内容堆积。
性能优化:单帧内减少重绘区域,降低Arduino Uno等低性能板的卡顿风险。

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值