返回

TFT ILI9341 显示屏演示:Arduino 上的图形与弹球动画

引言

彩色 TFT 显示屏是为 Arduino 项目增添丰富视觉反馈的绝佳方式。在本教程中,我们将使用 Adafruit ILI9341 和 Adafruit GFX 库驱动一块 240x320 分辨率的 ILI9341 型 TFT 屏幕。你将学习如何连接显示屏、安装所需库,并编写代码来绘制静态 UI 元素以及实现弹球动画。这一切都可以在 Velxio 模拟器中直接运行,无需任何硬件!

电路讲解

我们先来检查电路。原理图很简单:Arduino Uno 通过 SPI(串行外设接口)与 ILI9341 显示屏通信。

Velxio 模拟器画布上 TFT 显示屏的电路图

以下是完整的接线列表:

Arduino Uno 引脚TFT ILI9341 引脚导线颜色
13 (SCK)SCK橙色
11 (MOSI)MOSI橙色
10 (CS)CS蓝色
9 (D/C)D/C绿色
8 (RST)RST红色
7 (LED)LED白色
5VVCC(未显示,默认)
GNDGND(未显示,默认)

无需外部元件——显示屏工作在 5V 逻辑电平(大多数 ILI9341 模块兼容 5V),SPI 引脚直接连接即可。

代码讲解

现在让我们深入代码。我们将使用 Adafruit ILI9341 库以及 Adafruit GFX 库来实现图形基元。这些库需要通过库管理器安装。

库管理器对话框,显示 TFT 显示屏所使用的库

打开库管理器(工具 > 管理库),搜索 “Adafruit ILI9341” 和 “Adafruit GFX Library”。安装两者。SPI 库会自动包含。

以下是完整代码:

// TFT ILI9341 显示屏演示 (240x320)
// 库:Adafruit ILI9341 + Adafruit GFX
// 连接:CS=10, DC/RS=9, RST=8, LED=7, MOSI=11(SPI), SCK=13(SPI)

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>

#define TFT_CS   10
#define TFT_DC    9
#define TFT_RST   8
#define TFT_LED   7

Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);

// 背景颜色:蓝色(在深色模拟器画布上可见)
#define BG_COLOR 0x001F

// 球的状态
int ballX = 120, ballY = 200;
int ballDX = 3, ballDY = 2;
const int BALL_R = 10;

// 运动场边界
const int FX = 5, FY = 110, FW = 230, FH = 200;

void drawStaticUI() {
  tft.fillScreen(BG_COLOR);

  // 标题
  tft.setTextSize(3);
  tft.setTextColor(tft.color565(255, 220, 0));
  tft.setCursor(20, 10);
  tft.print("VELXIO TFT");

  // 副标题
  tft.setTextSize(2);
  tft.setTextColor(tft.color565(180, 180, 255));
  tft.setCursor(30, 50);
  tft.print("ILI9341 Demo");

  // 调色板条
  tft.fillRect(10, 82, 70, 18, tft.color565(220, 50, 50));
  tft.fillRect(85, 82, 70, 18, tft.color565(50, 200, 50));
  tft.fillRect(160, 82, 70, 18, tft.color565(50, 100, 240));

  // 运动场边框
  tft.drawRect(FX, FY, FW, FH, tft.color565(80, 80, 130));
}

void setup() {
  pinMode(TFT_LED, OUTPUT);
  digitalWrite(TFT_LED, HIGH);

  tft.begin();
  drawStaticUI();
}

void loop() {
  // 擦除旧球
  tft.fillCircle(ballX, ballY, BALL_R, BG_COLOR);

  // 更新位置
  ballX += ballDX;
  ballY += ballDY;

  // 在边界反弹
  if (ballX < FX + BALL_R + 1 || ballX > FX + FW - BALL_R - 1) ballDX = -ballDX;
  if (ballY < FY + BALL_R + 1 || ballY > FY + FH - BALL_R - 1) ballDY = -ballDY;

  // 绘制球
  tft.fillCircle(ballX, ballY, BALL_R, tft.color565(255, 140, 0));

  delay(30);
}

代码要点

学生需掌握的关键概念

  1. SPI 通信:显示屏使用 SPI,这是一种同步串行协议。Arduino 是主机,显示屏是从机。数据传输仅需三根线(SCK、MOSI、CS);D/C 和 RST 是额外的控制线。
  2. 图形基元:Adafruit GFX 库提供了诸如 fillScreen()fillRect()drawRect()fillCircle()setCursor()print()setTextSize() 等函数。这些函数使得绘制形状和文本变得简单。
  3. 双缓冲(概念):我们在绘制新球之前擦除旧球。这可以防止拖影。在更高级的项目中,你可能会使用帧缓冲区。
  4. 碰撞检测:弹球逻辑检查球的中心是否距离边界小于 BALL_R 像素。如果是,则反转方向。
  5. 色深:ILI9341 支持 262K 颜色(18 位),但库为了速度使用 16 位(65K 颜色)。color565() 将 RGB 打包成 5-6-5 位格式。

常见问题与调试技巧

建议的扩展功能

在基本演示运行成功后,可以尝试以下增强:

亲自尝试!

准备好看看效果了吗?在 Velxio 中打开实时示例,然后点击 运行 按钮。

Velxio 编辑器工具栏,包含编译和运行控件

你还可以探索画布工具栏,进行缩放、平移和检查仿真。

Velxio 画布工具栏,位于仿真视口上方

如果你想从头开始构建,请使用组件选择器添加一个 Arduino Uno 和一个 ILI9341 显示屏。

Velxio 组件选择器对话框,按类别浏览零件

点击下面的链接打开示例并开始实验:

在 Velxio 上打开 TFT ILI9341 显示屏演示

祝你编程愉快!


分享到:
David Montero

作者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

相关文章


上一篇
LCD 20x4 显示屏与 Arduino:在 Velxio 中实现 Hello World
下一篇
在 Velxio 上用 Arduino 构建西蒙说记忆游戏