驴友花雕 发表于 2025-4-12 07:11:31

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




驴友花雕 发表于 2025-4-12 07:15:09

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




驴友花雕 发表于 2025-4-12 07:17:38

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




驴友花雕 发表于 2025-4-12 07:20:07

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

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之七十一:GC9A01园屏之360度旋转的彩虹球

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之七十一:GC9A01园屏之360度旋转的彩虹球
*/

#include "SPI.h"                      // 包含 SPI 库,用于 TFT 屏幕通信
#include "Adafruit_GFX.h"             // 包含 Adafruit GFX 图形库,用于绘制图形
#include "Adafruit_GC9A01A.h"         // 包含 GC9A01A 屏幕驱动库

#define TFT_CS 4                      // 定义 TFT 屏幕片选引脚
#define TFT_DC 2                      // 定义 TFT 屏幕数据/命令选择引脚
#define TFT_RST -1                  // 屏幕复位引脚(-1 表示未使用)

Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST); // 创建 TFT 屏幕对象

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 240
#define CENTER_X SCREEN_WIDTH / 2
#define CENTER_Y SCREEN_HEIGHT / 2
#define RADIUS 120                  // 彩虹背景半径
#define ROTATION_SPEED 100.05          // 旋转速度
#define RAINBOW_SEGMENT_ANGLE 51.43   // 彩虹每段的角度

float rotationAngle = 0;

// 定义彩虹颜色
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)// 紫色
};

// 绘制彩虹的函数
void drawRainbow() {
    for (int i = 0; i < 7; i++) {
      // 计算每段彩虹的起始和结束角度(转换为弧度)
      float angleStart = (i * RAINBOW_SEGMENT_ANGLE + rotationAngle) * M_PI / 180;
      float angleEnd = ((i + 1) * RAINBOW_SEGMENT_ANGLE + rotationAngle) * M_PI / 180;

      // 绘制三角形来组成彩虹
      tft.fillTriangle(CENTER_X, CENTER_Y,
                         CENTER_X + RADIUS * cos(angleStart), CENTER_Y + RADIUS * sin(angleStart),
                         CENTER_X + RADIUS * cos(angleEnd), CENTER_Y + RADIUS * sin(angleEnd),
                         rainbowColors);
    }
}

void setup() {
    // 初始化串口通信,波特率为 115200,用于调试信息输出
    Serial.begin(115200);
    // 初始化 TFT 屏幕
    tft.begin();
    // 设置屏幕旋转方向
    tft.setRotation(1);
    // 用黑色填充屏幕
    tft.fillScreen(tft.color565(0, 0, 0));
}

void loop() {
    // 每次循环开始时,用黑色填充屏幕,清除上一帧的内容
    tft.fillScreen(tft.color565(0, 0, 0));

    // 调用绘制彩虹的函数
    drawRainbow();

    // 更新旋转角度
    rotationAngle += ROTATION_SPEED;
    // 确保旋转角度在 0 - 360 度范围内
    if (rotationAngle >= 360) {
      rotationAngle -= 360;
    }

    // 延迟 500 毫秒,控制旋转速度
    delay(500);
}

驴友花雕 发表于 2025-4-12 07:25:46

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

代码解读
1. 头文件包含
• #include "SPI.h":引入 SPI 库,该库用于实现与 TFT 屏幕的串行通信。
• #include "Adafruit_GFX.h":引入 Adafruit GFX 图形库,提供了一系列基本的图形绘制函数,如绘制点、线、矩形、圆形等。
• #include "Adafruit_GC9A01A.h":引入 GC9A01A 屏幕驱动库,用于控制特定型号的 TFT 屏幕。
2. 引脚定义和屏幕对象创建
• #define TFT_CS 4、#define TFT_DC 2、#define TFT_RST -1:定义了 TFT 屏幕的片选引脚、数据 / 命令选择引脚和复位引脚。
• Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);:创建了一个 Adafruit_GC9A01A 类的对象 tft,用于操作 TFT 屏幕。
3. 常量和变量定义
• SCREEN_WIDTH 和 SCREEN_HEIGHT:定义了屏幕的宽度和高度。
• CENTER_X 和 CENTER_Y:计算出屏幕的中心点坐标。
• RADIUS:定义了彩虹背景的半径。
• ROTATION_SPEED:定义了彩虹的旋转速度。
• RAINBOW_SEGMENT_ANGLE:定义了彩虹每段的角度。
• rotationAngle:记录当前彩虹的旋转角度。
• rainbowColors:定义了一个包含七种颜色的数组,用于表示彩虹的七种颜色。
4. drawRainbow 函数
该函数用于绘制彩虹,通过循环绘制七个三角形来组成彩虹。每个三角形的顶点分别为屏幕中心点、半径为 RADIUS 且角度为 angleStart 的点和角度为 angleEnd 的点。
5. setup 函数
在程序开始时执行一次,主要完成串口通信初始化、TFT 屏幕初始化、设置屏幕旋转方向和用黑色填充屏幕的操作。
6. loop 函数
程序会不断循环执行该函数,实现彩虹的旋转效果。具体步骤如下:
• 用黑色填充屏幕,清除上一帧的内容。
• 调用 drawRainbow 函数绘制彩虹。
• 更新旋转角度,并确保旋转角度在 0 - 360 度范围内。
• 延迟 500 毫秒,控制旋转速度。
通过这种方式,代码实现了一个在 TFT 屏幕上旋转的彩虹效果。

驴友花雕 发表于 2025-4-12 07:27:07

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

实验场景图动态图




驴友花雕 发表于 2025-4-12 07:29:33

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


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