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

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

本帖最后由 驴友花雕 于 2025-4-12 06:11 编辑




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

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




驴友花雕 发表于 2025-4-12 06:09:32

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




驴友花雕 发表于 2025-4-12 06:11:37

【花雕学编程】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 屏幕通信**
#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 ROTATION_SPEED 15.5

// 定义一个包含七种颜色的数组,用于表示彩虹的七种颜色
// 每种颜色使用tft.color565函数将RGB值转换为屏幕支持的16位颜色值
const 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, 127, 255),// 青色
    tft.color565(0, 0, 255),    // 蓝色
    tft.color565(139, 0, 255)   // 紫色
};

// 定义一个浮点型变量,用于记录当前彩虹背景的旋转角度
float angle = 0;

// setup函数在程序开始时只执行一次,用于初始化操作
void setup() {
    // 初始化串口通信,设置波特率为115200,方便调试信息的输出
    Serial.begin(115200);
    // 初始化屏幕,使屏幕进入可操作状态
    tft.begin();
    // 设置屏幕的旋转方向,这里设置为旋转2次(具体旋转效果取决于屏幕驱动)
    tft.setRotation(2);
    // 用黑色填充整个屏幕,清空屏幕内容
    tft.fillScreen(tft.color565(0, 0, 0));
}

// loop函数会不断循环执行,实现动态效果
void loop() {
    // 每次循环开始时,用黑色填充整个屏幕,清除上一帧的绘制内容
    tft.fillScreen(tft.color565(0, 0, 0));

    // 外层循环遍历从屏幕中心到边缘的每个半径
    for (int r = 0; r < SCREEN_WIDTH / 2; r++) {
      // 内层循环遍历以当前半径为圆周的每个角度(从0到360度)
      for (int theta = 0; theta < 360; theta++) {
            // 计算旋转后的角度,将当前角度加上总的旋转角度
            float rotatedTheta = theta + angle;
            // 如果旋转后的角度超过360度,减去360度,实现循环效果
            if (rotatedTheta >= 360) {
                rotatedTheta -= 360;
            }
            // 根据旋转后的角度计算当前点应该使用的彩虹颜色索引
            // 将360度平均分为7份,根据旋转后的角度确定落在哪个区间
            int colorIndex = (int)(rotatedTheta / (360.0 / 7)) % 7;
            // 从彩虹颜色数组中获取对应的颜色值
            uint16_t color = rainbowColors;

            // 根据当前半径和角度,使用三角函数计算出该点在屏幕上的横坐标
            int x = CENTER_X + r * cos(radians(theta));
            // 根据当前半径和角度,使用三角函数计算出该点在屏幕上的纵坐标
            int y = CENTER_Y + r * sin(radians(theta));

            // 在计算得到的坐标位置绘制一个像素点,颜色为前面获取的彩虹颜色
            tft.drawPixel(x, y, color);
      }
    }

    // 更新旋转角度,每次循环增加一个固定的旋转速度值
    angle += ROTATION_SPEED;
    // 如果旋转角度超过360度,减去360度,保证角度在0到360度之间循环
    if (angle >= 360) {
      angle -= 360;
    }

    // 延迟10毫秒,控制彩虹背景的旋转速度,避免旋转过快
    delay(50);
}

驴友花雕 发表于 2025-4-12 06:14:36

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

代码说明:
1. 库文件引入与屏幕初始化:
◦ 引入 SPI.h、Adafruit_GFX.h 和 Adafruit_GC9A01A.h 这几个库文件,用于和屏幕进行通信并绘制图形。
◦ 定义屏幕的片选引脚、数据 / 命令引脚和复位引脚,创建屏幕对象 tft。
2. 常量和变量定义:
◦ SCREEN_WIDTH 和 SCREEN_HEIGHT 分别代表屏幕的宽度和高度。
◦ CENTER_X 和 CENTER_Y 表示屏幕的中心点坐标。
◦ ROTATION_SPEED 是彩虹背景的旋转速度。
◦ rainbowColors 数组存储了七种彩虹颜色。
◦ angle 变量用于记录当前的旋转角度。
3. setup 函数:
◦ 初始化串口通信,波特率设为 115200。
◦ 初始化屏幕,设置旋转方向,清屏。
4. loop 函数:
◦ 每次循环先清屏。
◦ 运用嵌套循环遍历屏幕上的每个点,根据当前的旋转角度 angle 计算出旋转后的角度 rotatedTheta。
◦ 依据 rotatedTheta 确定当前点应使用的彩虹颜色索引 colorIndex。
◦ 计算出当前点的坐标 (x, y),并使用 tft.drawPixel 函数绘制该点。
◦ 更新旋转角度 angle,若超过 360 度则减去 360 度,以实现循环旋转。
◦ 延迟 10 毫秒,控制旋转速度。
你可以把这段代码上传到 Arduino 开发板上,就能看到七色彩虹背景球大小缩放的效果。

驴友花雕 发表于 2025-4-12 06:23:32

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

实验场景图动态图




驴友花雕 发表于 2025-4-12 06:26:39

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

实验场景图动态图


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