驴友花雕 发表于 2025-4-12 08:26:04

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球




驴友花雕 发表于 2025-4-12 08:34:37

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球




驴友花雕 发表于 2025-4-12 08:36:45

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球




驴友花雕 发表于 2025-4-12 08:40:10

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球

【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);
      // 在屏幕中心绘制一个填充三角形,根据当前计算的半径、角度以及对应的颜色值,
      // 使用 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 毫秒,控制图形变化的速度,使效果更明显。
}

驴友花雕 发表于 2025-4-12 08:41:36

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球

这段代码是用于驱动 GC9A01A TFT 屏幕,呈现动态的彩色图形效果,下面是简要解读:
1、库与引脚定义
• 引入SPI、Adafruit_GFX和Adafruit_GC9A01A库,为屏幕通信和图形绘制提供支持。
• 定义了 TFT 屏幕的片选、数据 / 命令选择和复位引脚,创建了屏幕对象。
2、常量与变量设置
• 设定屏幕的宽高、中心位置、基础半径、旋转和缩放速度等常量。
• 定义旋转角度、缩放因子和控制缩放状态的布尔变量。
• 存储了彩虹的 7 种颜色值。
3、初始化部分(setup函数)
• 初始化串口通信,用于调试信息输出。
• 初始化屏幕并设置旋转角度。
4、循环部分(loop函数)
• 每次循环先将屏幕填充为黑色,清除之前的显示。
• 依据缩放因子调整图形半径。
• 循环绘制 7 个彩色三角形,形成类似彩虹的图案。
• 不断更新旋转角度,实现图形旋转。
• 动态调整缩放因子,使图形在放大和缩小状态间切换。
• 每次循环结束后延迟 500 毫秒,控制图形变化的速度。


驴友花雕 发表于 2025-4-12 08:47:08

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球

实验场景图动态图




驴友花雕 发表于 2025-4-12 08:49:31

【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球

实验场景图动态图


页: [1]
查看完整版本: 【花雕学编程】Arduino动手做(249)--GC9A01旋转缩放彩虹球