Bootstrap

【花雕学编程】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)液晶显示屏,以下是其主要特点、应用场景及注意事项的详细介绍:

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

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

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

在这里插入图片描述
1、显示基本文字和图形

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup() {
  tft.begin();
  tft.setRotation(1); // 设置屏幕方向
  tft.fillScreen(0xFFFF); // 清屏为白色

  // 显示文本
  tft.setTextColor(0x001F); // 蓝色文字
  tft.setTextSize(2); // 文字大小
  tft.setCursor(50, 50);
  tft.print("Hello, TFT!");

  // 绘制矩形
  tft.fillRect(20, 100, 100, 50, 0xF800); // 红色矩形
}
void loop() {}

要点解读:

基本功能演示:展示如何使用Adafruit GFX库绘制图形和显示文字。

硬件连接:需要根据TFT屏型号调整连接的引脚。

用途:适用于电子项目中的初始测试。

2、实时显示传感器数据

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(0x0000); // 黑色背景
  tft.setTextColor(0xFFFF); // 白色文字
  tft.setTextSize(2);
}

void loop() {
  int sensorValue = analogRead(A0); // 读取模拟传感器数据
  float voltage = sensorValue * (5.0 / 1023.0);

  tft.fillRect(0, 0, 320, 30, 0x0000); // 清除上一行显示
  tft.setCursor(10, 10);
  tft.print("Voltage: ");
  tft.print(voltage);
  tft.print(" V");

  delay(500);
}

要点解读:

实时动态显示:利用TFT屏幕显示从传感器采集到的数据。

数据更新优化:在屏幕刷新时清除上一帧以避免重叠。

用途:适用于数据监控系统,如环境监测。

3、触摸交互界面

#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

#define YP A1
#define XM A2
#define YM 7
#define XP 6

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

void setup() {
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(0xFFFF); // 清屏白色
}

void loop() {
  TSPoint p = ts.getPoint();
  if (p.z > 100) { // 检测到触摸
    tft.fillCircle(p.x / 4, p.y / 4, 5, 0xF800); // 红点显示触摸位置
  }
}

要点解读:

触摸屏功能:结合触摸屏模块实现交互功能。

触控精度校正:需要根据实际硬件调整比例。

用途:适用于交互式显示界面设计。

在这里插入图片描述
4、基础TFT显示
此代码实现了一个基础的TFT显示屏应用,显示文字和基本图形。

#include <Adafruit_GFX.h>    // 图形库
#include <Adafruit_ST7735.h> // TFT显示屏驱动库

// 定义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() {
  tft.initR(INITR_BLACKTAB); // 初始化TFT显示屏
  tft.fillScreen(ST7735_BLACK); // 填充屏幕为黑色
  tft.setRotation(1); // 设置屏幕旋转方向

  // 显示文字
  tft.setTextSize(2); // 设置字体大小
  tft.setTextColor(ST7735_WHITE); // 设置文字颜色
  tft.setCursor(10, 10); // 设置光标位置
  tft.println("Hello, TFT!");

  // 显示简单图形
  tft.fillRect(50, 50, 80, 40, ST7735_RED); // 绘制红色矩形
  tft.drawCircle(150, 75, 20, ST7735_BLUE); // 绘制蓝色圆形
}

void loop() {
  // 基础显示无需循环
}

​要点解读
​库的使用:
使用Adafruit_GFX库处理图形绘制。
使用Adafruit_ST7735库驱动ST7735型号的TFT显示屏。
​屏幕初始化:
tft.initR(INITR_BLACKTAB)初始化显示屏。
tft.fillScreen(ST7735_BLACK)将屏幕填充为黑色。
​文字显示:
使用tft.setTextSize设置字体大小。
使用tft.setTextColor设置文字颜色。
使用tft.setCursor设置光标位置。
​图形绘制:
fillRect绘制填充矩形。
drawCircle绘制空心圆形。
​扩展性:
可更换显示屏型号(如ST7789、ILI9341),只需调整库和引脚定义。

5、动态数据更新
此代码实现了一个动态更新的TFT显示屏应用,显示传感器数据(如模拟温度值)。

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

#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() {
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);

  // 显示标题
  tft.setTextSize(2);
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(10, 10);
  tft.println("Temperature Monitor");
}

void loop() {
  int sensorValue = analogRead(A0); // 读取模拟传感器值
  float voltage = sensorValue * (5.0 / 1023.0); // 转换为电压
  float temperature = (voltage - 0.5) * 100; // 假设传感器输出为10mV/°C

  // 清除旧数据区域
  tft.fillRect(10, 50, 120, 40, ST7735_BLACK);

  // 显示温度值
  tft.setTextSize(2);
  tft.setTextColor(ST7735_RED);
  tft.setCursor(10, 50);
  tft.print("Temp: ");
  tft.print(temperature);
  tft.println(" C");

  delay(500); // 每500ms更新一次
}

​要点解读
​传感器数据读取:
使用analogRead读取模拟传感器值。
将模拟值转换为电压,并进一步计算温度。
​动态更新:
使用fillRect清除旧数据区域,避免数据重叠。
每隔500ms更新一次显示内容。
​颜色和字体:
使用红色字体显示温度值,突出显示重要信息。
​扩展性:
可更换传感器类型(如DHT11/DHT22温湿度传感器)。
可添加更多数据(如湿度、光照强度)并显示在同一屏幕上。

6、TFT与触摸屏交互
此代码实现了一个支持触摸屏交互的TFT显示屏应用,用户可以通过触摸屏选择菜单项。

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

// TFT显示屏引脚
#define TFT_CS   10
#define TFT_RST  9
#define TFT_DC   8

// 触摸屏引脚
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

void setup() {
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);

  // 显示菜单
  tft.setTextSize(2);
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(10, 50);
  tft.println("1. Start");
  tft.setCursor(10, 100);
  tft.println("2. Settings");
  tft.setCursor(10, 150);
  tft.println("3. Exit");
}

void loop() {
  // 读取触摸屏坐标
  TSPoint p = ts.getPoint();
  pinMode(XM, OUTPUT); // 恢复XM引脚为输出模式

  // 检查是否触摸屏幕
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    int x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
    int y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());

    // 判断触摸区域
    if (y > 40 && y < 90 && x > 10 && x < 100) {
      tft.setCursor(10, 200);
      tft.println("Start selected!");
    } else if (y > 90 && y < 140 && x > 10 && x < 150) {
      tft.setCursor(10, 200);
      tft.println("Settings selected!");
    } else if (y > 140 && y < 190 && x > 10 && x < 100) {
      tft.setCursor(10, 200);
      tft.println("Exit selected!");
    }
  }

  delay(200); // 防抖延迟
}

​要点解读
​触摸屏库的使用:
使用Adafruit_TouchScreen库读取触摸屏坐标。
TSPoint结构体包含触摸点的x、y和压力值z。
​触摸区域判断:
根据触摸点的坐标判断用户选择了哪个菜单项。
使用map函数将触摸屏坐标映射到TFT屏幕的分辨率。
​动态反馈:
在屏幕上显示用户选择的菜单项。
​扩展性:
可添加更多菜单项和功能。
可结合其他传感器(如陀螺仪)实现更复杂的交互。

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

在这里插入图片描述

;