驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十二:简易旋转万花筒动画

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_ORANGE, GC9A01A_YELLOW, GC9A01A_GREEN, GC9A01A_CYAN, GC9A01A_BLUE, GC9A01A_MAGENTA, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);

// 动画参数
#define SCREEN_CENTER_X 120
#define SCREEN_CENTER_Y 120
#define RADIUS 100         // 圆形屏幕的半径
#define NUM_SHAPES 12      // 万花筒图形数量
#define ROTATION_SPEED 5   // 旋转速度(度/帧)
#define SHAPE_SIZE 40      // 单个图形的大小

void drawKaleidoscope(float rotationAngle) {
    // 清屏
    tft.fillScreen(GC9A01A_BLACK);

    // 绘制多个图形组成万花筒
    for (int i = 0; i < NUM_SHAPES; i++) {
      // 计算每个图形的旋转角度
      float angle = rotationAngle + i * (360 / NUM_SHAPES);
      float radian = angle * 3.14159 / 180;

      // 计算图形的中心点
      int x = SCREEN_CENTER_X + RADIUS * cos(radian);
      int y = SCREEN_CENTER_Y + RADIUS * sin(radian);

      // 获取颜色
      uint16_t color = colors[(i + (int)(rotationAngle / 20)) % numColors];

      // 绘制三角形
      int x1 = x;
      int y1 = y - SHAPE_SIZE / 2;
      int x2 = x + SHAPE_SIZE / 2;
      int y2 = y + SHAPE_SIZE / 2;
      int x3 = x - SHAPE_SIZE / 2;
      int y3 = y + SHAPE_SIZE / 2;

      tft.fillTriangle(x1, y1, x2, y2, x3, y3, color);
    }
}

void setup() {
    Serial.begin(115200);         // 初始化串口
    Serial.println("Rotating Kaleidoscope Animation");

    tft.begin();                  // 初始化屏幕
    tft.setRotation(0);         // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
}

void loop() {
    static float rotationAngle = 0;// 初始化旋转角度

    // 绘制旋转万花筒动画
    drawKaleidoscope(rotationAngle);

    // 更新旋转角度
    rotationAngle += ROTATION_SPEED;
    if (rotationAngle >= 360) {
      rotationAngle = 0; // 重置角度循环
    }

    delay(10); // 控制动画帧速率
}


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例

代码说明

1、独特的旋转万花筒效果:

绘制多个等距分布的彩色三角形,并通过旋转角度不断变化位置,形成动态万花筒特效。

2、动态颜色渐变:

图形颜色从 colors[] 中动态获取,并根据帧数切换颜色,实现渐变效果。

3、流畅动画:

动态更新旋转角度,带来平滑的旋转效果。

使用 delay(50) 控制帧速率,每秒显示约 20 帧,动画流畅自然。

4、圆形屏幕的极致利用:

图形位置以屏幕中心为基准,完美适配圆形屏幕的特性。

5、效果描述

屏幕显示一个以中心为基准的动态万花筒,彩色的三角形随着旋转角度逐步改变位置和颜色。

效果流畅炫酷,适合圆形屏幕展示,让观看者眼前一亮。

动画的色彩变化和旋转速度可通过调整参数进行定制。

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏32个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十三:带边框有日期的数字时钟

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 初始化时间变量(初始为 2025年3月27日,时间为12:00:00)
int year = 2025, month = 3, day = 27;
int hours = 12, minutes = 0, seconds = 0;

void drawCircularBorders() {
    // 绘制双环圆边框
    tft.drawCircle(120, 120, 119, GC9A01A_WHITE);   // 外环圆(白色)
    tft.drawCircle(120, 120, 110, GC9A01A_CYAN);    // 内环圆(青色)
}

void displayDateAndTime() {
    // 清除显示区域
    tft.fillRect(20, 60, 200, 160, GC9A01A_BLACK);

    // 显示日期
    tft.setTextSize(3);
    tft.setTextColor(GC9A01A_YELLOW, GC9A01A_BLACK); // 黄色文本,黑色背景
    tft.setCursor(35, 80);
    tft.printf("%04d/%02d/%02d", year, month, day);

    // 显示时间
    tft.setTextSize(4);
    tft.setTextColor(GC9A01A_GREEN, GC9A01A_BLACK); // 绿色文本,黑色背景
    tft.setCursor(2, 130);
    tft.printf(" %02d:%02d:%02d", hours, minutes, seconds);
}

void updateClock() {
    // 更新时间
    seconds++;
    if (seconds >= 60) {
      seconds = 0;
      minutes++;
    }
    if (minutes >= 60) {
      minutes = 0;
      hours++;
    }
    if (hours >= 24) {
      hours = 0;
      day++;
      // 简单处理月份和闰年(可进一步完善)
      if ((month == 2 && day > 28) || (month != 2 && day > 30)) {
            day = 1;
            month++;
      }
      if (month > 12) {
            month = 1;
            year++;
      }
    }
}

void setup() {
    Serial.begin(115200);         // 初始化串口通信
    Serial.println("Circular Border Clock");

    tft.begin();                  // 初始化屏幕
    tft.setRotation(2);             // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景

    drawCircularBorders();          // 绘制双环圆边框
}

void loop() {
    displayDateAndTime();         // 显示日期和时间
    updateClock();                  // 更新时间
    delay(1000);                  // 每秒更新一次
}

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例

代码说明

1、双环圆边框:

外环半径 119,颜色为白色(GC9A01A_WHITE)。

内环半径 110,颜色为青色(GC9A01A_CYAN)。

两环同心围绕屏幕中心点 (120, 120)。

2、日期时间显示:

显示样式为 Date: 2025/03/27 和 Time: 12:00:00。

文本与边框紧密结合,居中显示,整体布局美观。

3、自动时间更新:

每秒更新时间,分钟和日期随时间变化自动调整。

4、屏幕刷新优化:

仅刷新日期和时间区域,不重绘边框,减少屏幕闪烁。

5、效果描述

屏幕显示一个双环圆边框,中间的日期和时间动态更新。

外环和内环颜色鲜明,对比明显,整体设计简洁美观。

每秒刷新一次时间,随着时间推进日期也会自动变化。


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏33个特色案例


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十四:动态旋转阿基米德螺线

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 定义阿基米德螺线参数
#define CENTER_X 120       // 屏幕中心 X
#define CENTER_Y 120       // 屏幕中心 Y
#define MAX_RADIUS 120   // 最大半径
#define FACTOR 10          // 螺线增长因子
#define STEP 0.1         // 每次增加的角度步进(弧度)
#define ROTATION_SPEED 5   // 螺线旋转速度(度/帧)

// 绘制动态旋转阿基米德螺线
void drawRotatingSpiral(float rotationAngle) {
    float theta = 0;// 初始化角度为 0
    int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点

    while (theta < MAX_RADIUS / FACTOR) {
      // 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
      float r = FACTOR * theta;
      float adjustedTheta = theta + rotationAngle * 3.14159 / 180; // 添加旋转角度
      int x = CENTER_X + r * cos(adjustedTheta);
      int y = CENTER_Y + r * sin(adjustedTheta);

      // 连接当前点和前一个点
      tft.drawLine(prevX, prevY, x, y, GC9A01A_CYAN);

      // 更新前一个点和角度
      prevX = x;
      prevY = y;
      theta += STEP; // 增加角度
    }
}

void setup() {
    Serial.begin(115200);          // 初始化串口通信
    Serial.println("Dynamic Rotating Archimedean Spiral");

    tft.begin();                   // 初始化屏幕
    tft.setRotation(0);            // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
}

void loop() {
    static float rotationAngle = 0;// 初始化旋转角度

    // 清屏并绘制新的螺线
    tft.fillScreen(GC9A01A_BLACK);// 清屏
    drawRotatingSpiral(rotationAngle);

    // 更新旋转角度
    rotationAngle += ROTATION_SPEED;
    if (rotationAngle >= 360) {
      rotationAngle = 0; // 重置角度循环
    }

    delay(50); // 控制帧速率
}

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例

代码说明

1、动态旋转:

使用 rotationAngle 变量动态调整螺线的角度,让螺线逐帧旋转。

2、极坐标和笛卡尔转换:

通过极坐标公式 $r = a\theta$ 计算螺线,并添加旋转角度实现动态效果。

3、流畅动画:

每帧清除屏幕内容并重新绘制螺线,确保动画流畅自然。

4、可调整参数:

FACTOR 决定螺线的扩展速度,STEP 控制螺线的曲线密度,ROTATION_SPEED 设置旋转速度。

5、效果描述

屏幕中央显示一个青色的阿基米德螺线,逐步扩展并缓慢旋转。

螺线的动态旋转让视觉效果更具吸引力,适合展示数学几何动态特性。

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏34个特色案例


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十五:多彩动态旋转10条向心线

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十五:多彩动态旋转10条向心线
*/

//       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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 定义参数
#define CENTER_X 120      // 屏幕中心 X
#define CENTER_Y 120      // 屏幕中心 Y
#define SCALE 100         // 心形曲线缩放因子
#define STEP 0.1            // 参数步进(越小曲线越平滑)
#define ROTATION_SPEED 3    // 每帧旋转的角度(度)
#define NUM_HEARTS 10       // 心形曲线数量

// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);

// 绘制一条心形曲线
void drawHeartCurve(float rotationAngle, float phase, uint16_t color) {
    float t = 0; // 参数 t 表示角度
    int prevX = CENTER_X, prevY = CENTER_Y; // 初始点

    while (t < 2 * 3.14159) {
      // 心形曲线的参数方程
      float x_heart = SCALE * (16 * sin(t) * sin(t) * sin(t));
      float y_heart = -SCALE * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));

      // 应用旋转角度和相位偏移
      float adjustedX = x_heart * cos(rotationAngle * 3.14159 / 180 + phase) - y_heart * sin(rotationAngle * 3.14159 / 180 + phase);
      float adjustedY = x_heart * sin(rotationAngle * 3.14159 / 180 + phase) + y_heart * cos(rotationAngle * 3.14159 / 180 + phase);

      int x = CENTER_X + adjustedX;
      int y = CENTER_Y + adjustedY;

      // 连接当前点和前一个点
      tft.drawLine(prevX, prevY, x, y, color);

      // 更新前一个点和参数 t
      prevX = x;
      prevY = y;
      t += STEP; // 参数步进
    }
}

void setup() {
    Serial.begin(115200);         // 初始化串口通信
    Serial.println("Dynamic Rotating Heart Curves");

    tft.begin();                  // 初始化屏幕
    tft.setRotation(0);             // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景
}

void loop() {
    static float rotationAngle = 0; // 初始化旋转角度

    // 清屏
    tft.fillScreen(GC9A01A_BLACK);

    // 绘制多条心形曲线
    for (int i = 0; i < NUM_HEARTS; i++) {
      // 随机颜色
      uint16_t color = colors;

      // 相位偏移,使心形曲线位置不同
      float phase = i * (2 * 3.14159 / NUM_HEARTS);

      // 绘制心形曲线
      drawHeartCurve(rotationAngle, phase, color);
    }

    // 更新旋转角度
    rotationAngle += ROTATION_SPEED;
    if (rotationAngle >= 360) {
      rotationAngle = 0; // 重置角度循环
    }

    delay(100); // 控制帧速率
}

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例

代码说明

1、数量提升至10条:

将 NUM_HEARTS 增加至 10,生成更多的心形曲线,画面更加丰富。

2、增强对称性:

每条心形曲线通过 phase 参数进行相位偏移,确保均匀分布在屏幕周围。

3、随机颜色变化:

每帧螺线会分配随机颜色,让动画充满变化和视觉冲击力。

4、动态旋转:

旋转角度 rotationAngle 每帧更新,让心形曲线动态旋转,画面更生动。

5、效果描述

屏幕中央显示 10 条心形曲线,每条曲线动态旋转并随机变换颜色。

曲线均匀分布,形成复杂的几何图案,层次感和对称性进一步增强。

动态心形曲线呈现炫目效果,适合圆形屏幕展示。

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏35个特色案例

实验场景图动态图


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十六:多彩动态横竖方格线

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 定义屏幕参数
#define SCREEN_WIDTH 240      // 屏幕宽度
#define SCREEN_HEIGHT 240   // 屏幕高度
#define LINE_SPACING 10       // 横竖线的间隔

// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);

void setup() {
    Serial.begin(115200);         // 初始化串口通信
    Serial.println("Dynamic Lines Animation");

    tft.begin();                  // 初始化屏幕
    tft.setRotation(0);             // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK);// 设置黑色背景
}

void loop() {
    static int colorIndex = 0;      // 当前颜色索引

    // 清屏
    tft.fillScreen(GC9A01A_BLACK);

    // 绘制横线
    for (int y = 0; y <= SCREEN_HEIGHT; y += LINE_SPACING) {
      uint16_t color = colors[(colorIndex + y / LINE_SPACING) % numColors];
      tft.drawLine(0, y, SCREEN_WIDTH, y, color);
    }

    // 绘制竖线
    for (int x = 0; x <= SCREEN_WIDTH; x += LINE_SPACING) {
      uint16_t color = colors[(colorIndex + x / LINE_SPACING) % numColors];
      tft.drawLine(x, 0, x, SCREEN_HEIGHT, color);
    }

    // 更新颜色索引
    colorIndex++;
    if (colorIndex >= numColors) {
      colorIndex = 0; // 循环颜色
    }

    delay(100); // 控制帧速率
}


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例

代码说明

1、满屏横竖线:

横线和竖线分别通过 drawLine() 方法绘制,每隔 10 像素生成一条。

2、多彩动态效果:

使用颜色数组 colors[] 实现多彩效果,每帧动态切换颜色,视觉冲击力强。

3、优化的循环绘制:

通过计算颜色索引 (colorIndex + 偏移),让每条线的颜色随位置变化。

4、流畅动画:

每帧清屏并重绘线条,搭配 delay(100) 控制帧速率,保证动画平滑。

5、效果描述

屏幕上每隔 10 像素绘制一条横线和竖线,覆盖整个屏幕。

每条线条的颜色随帧数动态变化,形成五彩斑斓的效果。

整体视觉流畅、色彩鲜艳,适合作为动态几何艺术展示。

驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例

实验场景图动态图




驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏36个特色案例

实验场景图动态图


驴友花雕 发表于 7 天前

【花雕学编程】Arduino动手做(249)--GC9A01屏37个特色案例

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目实验之三十七:双螺线动态旋转与随机变色

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口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"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

// 定义屏幕引脚
#define TFT_CS 4      // 片选引脚
#define TFT_DC 2      // 数据/命令引脚
#define TFT_RST -1      // 重置引脚(未使用时设置为 -1)

// 初始化屏幕对象
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);

// 定义阿基米德螺线参数
#define CENTER_X 120       // 屏幕中心 X
#define CENTER_Y 120       // 屏幕中心 Y
#define MAX_RADIUS 120   // 最大半径
#define FACTOR 10          // 螺线增长因子
#define STEP 0.1         // 每次增加的角度步进(弧度)
#define ROTATION_SPEED 3   // 每帧旋转的角度(度)

// 定义颜色数组
uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
int numColors = sizeof(colors) / sizeof(colors);

void drawSpiral(float rotationAngle, int direction, uint16_t color) {
    float theta = 0;// 初始化角度为 0
    int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点

    while (theta < MAX_RADIUS / FACTOR) {
      // 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
      float r = FACTOR * theta;
      float adjustedTheta = theta + direction * rotationAngle * 3.14159 / 180; // 顺或逆旋转
      int x = CENTER_X + r * cos(adjustedTheta);
      int y = CENTER_Y + r * sin(adjustedTheta);

      // 连接当前点和前一个点
      tft.drawLine(prevX, prevY, x, y, color);

      // 更新前一个点和角度
      prevX = x;
      prevY = y;
      theta += STEP; // 增加角度
    }
}

void setup() {
    Serial.begin(115200);          // 初始化串口通信
    Serial.println("Dual Rotating Spirals with Random Colors");

    tft.begin();                   // 初始化屏幕
    tft.setRotation(0);            // 设置屏幕方向
    tft.fillScreen(GC9A01A_BLACK); // 设置黑色背景
}

void loop() {
    static float rotationAngle = 0;// 初始化旋转角度

    // 清屏
    tft.fillScreen(GC9A01A_BLACK);

    // 随机颜色
    uint16_t color1 = colors;
    uint16_t color2 = colors;

    // 绘制顺时针螺线
    drawSpiral(rotationAngle, 1, color1);

    // 绘制逆时针螺线
    drawSpiral(rotationAngle, -1, color2);

    // 更新旋转角度
    rotationAngle += ROTATION_SPEED;
    if (rotationAngle >= 360) {
      rotationAngle = 0; // 重置角度循环
    }

    delay(100); // 控制帧速率
}


页: 1 2 3 4 5 6 7 [8] 9
查看完整版本: 【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例