【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之七十二:GC9A01园屏之围绕中心旋转的动态缩放彩虹球
实验开源代码
- /*
- 【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
- 项目之七十二:GC9A01园屏之围绕中心旋转的动态缩放彩虹球
- */
-
- // GC9A01---------- ESP32
- // RST ------------ NC(复位引脚,此处未连接)
- // CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
- // DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
- // SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
- // SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
- // GND ------------ GND(接地引脚,连接到ESP32的接地端)
- // VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
-
- #include "SPI.h" // **包含 SPI 库,用于 TFT 屏幕通信**
- // SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的通信总线,
- // 这里包含该库是为了实现与 TFT 屏幕进行数据传输等通信操作。
- #include "Adafruit_GFX.h" // **包含 Adafruit GFX 图形库,用于绘制图形**
- // Adafruit_GFX 库提供了一系列基础的图形绘制函数,如绘制点、线、圆、三角形等,
- // 方便在屏幕上进行图形显示的操作。
- #include "Adafruit_GC9A01A.h" // **包含 GC9A01A 屏幕驱动库**
- // 该库是专门针对 GC9A01A 型号的 TFT 屏幕的驱动库,
- // 包含了初始化屏幕、设置屏幕参数以及控制屏幕显示等相关函数。
-
- #define TFT_CS 4 // **定义 TFT 屏幕片选引脚**
- // 片选引脚(Chip Select,CS)用于在多个设备连接到同一总线上时,
- // 选择要进行通信的特定设备,这里设置为引脚 4。
- #define TFT_DC 2 // **定义 TFT 屏幕数据/命令选择引脚**
- // 数据/命令选择引脚(Data/Command,DC)用于区分传输的数据是命令还是实际显示的数据,
- // 这里设置为引脚 2。
- #define TFT_RST -1 // **屏幕复位引脚(-1 表示未使用)**
- // 复位引脚(Reset,RST)用于对屏幕进行复位操作,使其恢复到初始状态,
- // 这里设置为 -1 表示不使用该引脚进行复位。
-
- Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST); // **创建 TFT 屏幕对象**
- // 使用前面定义的引脚参数创建一个 Adafruit_GC9A01A 类型的对象 tft,
- // 通过这个对象可以调用相关函数来操作 GC9A01A 屏幕。
-
- #define SCREEN_WIDTH 240
- // 定义屏幕的宽度为 240 像素。
- #define SCREEN_HEIGHT 240
- // 定义屏幕的高度为 240 像素。
- #define CENTER_X SCREEN_WIDTH / 2
- // 计算屏幕的水平中心位置,即宽度的一半。
- #define CENTER_Y SCREEN_HEIGHT / 2
- // 计算屏幕的垂直中心位置,即高度的一半。
- #define BASE_RADIUS 40 // **基础半径**
- // 定义图形绘制中使用的基础半径值,后续会根据缩放因子进行调整。
- #define ROTATION_SPEED 10.05 // **旋转速度**
- // 定义图形旋转的速度,每次循环中旋转角度的增加量。
- #define SCALE_SPEED 10.02 // **缩放速度**
- // 定义图形缩放的速度,每次循环中缩放因子的变化量。
-
- float rotationAngle = 0;
- // 初始化旋转角度为 0,用于控制图形的旋转。
- float scaleFactor = 1.0;
- // 初始化缩放因子为 1.0,表示图形初始大小为原始大小。
- bool growing = true; // **控制放大或缩小状态**
- // 定义一个布尔变量 growing,用于控制图形是处于放大还是缩小的状态,
- // 初始状态为 true,表示处于放大状态。
-
- uint16_t rainbowColors[] = {
- tft.color565(255, 0, 0), // 红色
- tft.color565(255, 165, 0), // 橙色
- tft.color565(255, 255, 0), // 黄色
- tft.color565(0, 255, 0), // 绿色
- tft.color565(0, 0, 255), // 蓝色
- tft.color565(75, 0, 130), // 靛蓝
- tft.color565(148, 0, 211) // 紫色
- };
- // 定义一个数组 rainbowColors,存储了彩虹颜色的 16 位 RGB 格式值,
- // 使用 tft.color565 函数将 24 位 RGB 颜色值转换为 16 位 RGB 格式,用于图形填充颜色。
-
- void setup() {
- Serial.begin(115200);
- // 初始化串口通信,波特率设置为 115200,用于调试时输出信息。
- tft.begin();
- // 初始化 GC9A01A 屏幕,设置屏幕的基本参数和状态。
- tft.setRotation(1);
- // 设置屏幕的旋转角度,这里设置为 1,表示顺时针旋转 90 度。
- }
-
- void loop() {
- tft.fillScreen(tft.color565(0, 0, 0));
- // 用黑色(RGB 值为 0, 0, 0)填充整个屏幕,清除之前的显示内容。
-
- float currentRadius = BASE_RADIUS * scaleFactor; // **根据缩放系数调整半径**
- // 根据当前的缩放因子计算出当前图形绘制的半径。
-
- for (int i = 0; i < 7; i++) {
- // 循环 7 次,用于绘制 7 个不同颜色的三角形,形成类似彩虹的效果。
- float angleStart = (i * 51.43 + rotationAngle) * M_PI / 180;
- // 计算每个三角形起始边的角度,通过当前循环索引 i、旋转角度 rotationAngle 以及弧度转换公式计算得到。
- float angleEnd = ((i + 1) * 51.43 + rotationAngle) * M_PI / 180;
- // 计算每个三角形结束边的角度。
-
- tft.fillTriangle(CENTER_X, CENTER_Y,
- CENTER_X + currentRadius * cos(angleStart), CENTER_Y + currentRadius * sin(angleStart),
- CENTER_X + currentRadius * cos(angleEnd), CENTER_Y + currentRadius * sin(angleEnd),
- rainbowColors[i]);
- // 在屏幕中心绘制一个填充三角形,根据当前计算的半径、角度以及对应的颜色值,
- // 使用 fillTriangle 函数绘制三角形。
- }
-
- rotationAngle += ROTATION_SPEED; // **旋转更新**
- // 增加旋转角度,使下一次绘制的三角形位置发生旋转变化。
-
- if (growing) { // **动态缩放**
- scaleFactor += SCALE_SPEED;
- // 如果处于放大状态,增加缩放因子,使图形变大。
- if (scaleFactor >= 1.3) growing = false; // **达到最大值后开始缩小**
- // 当缩放因子达到或超过 1.3 时,将 growing 设置为 false,进入缩小状态。
- } else {
- scaleFactor -= SCALE_SPEED;
- // 如果处于缩小状态,减小缩放因子,使图形变小。
- if (scaleFactor <= 0.7) growing = true; // **达到最小值后开始放大**
- // 当缩放因子达到或低于 0.7 时,将 growing 设置为 true,进入放大状态。
- }
-
- delay(500);
- // 延迟 500 毫秒,控制图形变化的速度,使效果更明显。
- }
复制代码
|