591浏览
楼主: 驴友花雕

[项目] 【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十二:简易旋转万花筒动画
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 定义颜色数组
  24. uint16_t colors[] = {GC9A01A_RED, GC9A01A_ORANGE, GC9A01A_YELLOW, GC9A01A_GREEN, GC9A01A_CYAN, GC9A01A_BLUE, GC9A01A_MAGENTA, GC9A01A_WHITE};
  25. int numColors = sizeof(colors) / sizeof(colors[0]);
  26. // 动画参数
  27. #define SCREEN_CENTER_X 120
  28. #define SCREEN_CENTER_Y 120
  29. #define RADIUS 100         // 圆形屏幕的半径
  30. #define NUM_SHAPES 12      // 万花筒图形数量
  31. #define ROTATION_SPEED 5   // 旋转速度(度/帧)
  32. #define SHAPE_SIZE 40      // 单个图形的大小
  33. void drawKaleidoscope(float rotationAngle) {
  34.     // 清屏
  35.     tft.fillScreen(GC9A01A_BLACK);
  36.     // 绘制多个图形组成万花筒
  37.     for (int i = 0; i < NUM_SHAPES; i++) {
  38.         // 计算每个图形的旋转角度
  39.         float angle = rotationAngle + i * (360 / NUM_SHAPES);
  40.         float radian = angle * 3.14159 / 180;
  41.         // 计算图形的中心点
  42.         int x = SCREEN_CENTER_X + RADIUS * cos(radian);
  43.         int y = SCREEN_CENTER_Y + RADIUS * sin(radian);
  44.         // 获取颜色
  45.         uint16_t color = colors[(i + (int)(rotationAngle / 20)) % numColors];
  46.         // 绘制三角形
  47.         int x1 = x;
  48.         int y1 = y - SHAPE_SIZE / 2;
  49.         int x2 = x + SHAPE_SIZE / 2;
  50.         int y2 = y + SHAPE_SIZE / 2;
  51.         int x3 = x - SHAPE_SIZE / 2;
  52.         int y3 = y + SHAPE_SIZE / 2;
  53.         tft.fillTriangle(x1, y1, x2, y2, x3, y3, color);
  54.     }
  55. }
  56. void setup() {
  57.     Serial.begin(115200);         // 初始化串口
  58.     Serial.println("Rotating Kaleidoscope Animation");
  59.     tft.begin();                  // 初始化屏幕
  60.     tft.setRotation(0);           // 设置屏幕方向
  61.     tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
  62. }
  63. void loop() {
  64.     static float rotationAngle = 0;  // 初始化旋转角度
  65.     // 绘制旋转万花筒动画
  66.     drawKaleidoscope(rotationAngle);
  67.     // 更新旋转角度
  68.     rotationAngle += ROTATION_SPEED;
  69.     if (rotationAngle >= 360) {
  70.         rotationAngle = 0; // 重置角度循环
  71.     }
  72.     delay(10); // 控制动画帧速率
  73. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

代码说明

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

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

2、动态颜色渐变:

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

3、流畅动画:

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

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

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

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

5、效果描述

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十三:带边框有日期的数字时钟
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 初始化时间变量(初始为 2025年3月27日,时间为12:00:00)
  24. int year = 2025, month = 3, day = 27;
  25. int hours = 12, minutes = 0, seconds = 0;
  26. void drawCircularBorders() {
  27.     // 绘制双环圆边框
  28.     tft.drawCircle(120, 120, 119, GC9A01A_WHITE);   // 外环圆(白色)
  29.     tft.drawCircle(120, 120, 110, GC9A01A_CYAN);    // 内环圆(青色)
  30. }
  31. void displayDateAndTime() {
  32.     // 清除显示区域
  33.     tft.fillRect(20, 60, 200, 160, GC9A01A_BLACK);
  34.     // 显示日期
  35.     tft.setTextSize(3);
  36.     tft.setTextColor(GC9A01A_YELLOW, GC9A01A_BLACK); // 黄色文本,黑色背景
  37.     tft.setCursor(35, 80);
  38.     tft.printf("%04d/%02d/%02d", year, month, day);
  39.     // 显示时间
  40.     tft.setTextSize(4);
  41.     tft.setTextColor(GC9A01A_GREEN, GC9A01A_BLACK); // 绿色文本,黑色背景
  42.     tft.setCursor(2, 130);
  43.     tft.printf(" %02d:%02d:%02d", hours, minutes, seconds);
  44. }
  45. void updateClock() {
  46.     // 更新时间
  47.     seconds++;
  48.     if (seconds >= 60) {
  49.         seconds = 0;
  50.         minutes++;
  51.     }
  52.     if (minutes >= 60) {
  53.         minutes = 0;
  54.         hours++;
  55.     }
  56.     if (hours >= 24) {
  57.         hours = 0;
  58.         day++;
  59.         // 简单处理月份和闰年(可进一步完善)
  60.         if ((month == 2 && day > 28) || (month != 2 && day > 30)) {
  61.             day = 1;
  62.             month++;
  63.         }
  64.         if (month > 12) {
  65.             month = 1;
  66.             year++;
  67.         }
  68.     }
  69. }
  70. void setup() {
  71.     Serial.begin(115200);           // 初始化串口通信
  72.     Serial.println("Circular Border Clock");
  73.     tft.begin();                    // 初始化屏幕
  74.     tft.setRotation(2);             // 设置屏幕方向
  75.     tft.fillScreen(GC9A01A_BLACK);  // 设置黑色背景
  76.     drawCircularBorders();          // 绘制双环圆边框
  77. }
  78. void loop() {
  79.     displayDateAndTime();           // 显示日期和时间
  80.     updateClock();                  // 更新时间
  81.     delay(1000);                    // 每秒更新一次
  82. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

【花雕学编程】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、效果描述

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

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

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十四:动态旋转阿基米德螺线
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 定义阿基米德螺线参数
  24. #define CENTER_X 120       // 屏幕中心 X
  25. #define CENTER_Y 120       // 屏幕中心 Y
  26. #define MAX_RADIUS 120     // 最大半径
  27. #define FACTOR 10          // 螺线增长因子
  28. #define STEP 0.1           // 每次增加的角度步进(弧度)
  29. #define ROTATION_SPEED 5   // 螺线旋转速度(度/帧)
  30. // 绘制动态旋转阿基米德螺线
  31. void drawRotatingSpiral(float rotationAngle) {
  32.     float theta = 0;  // 初始化角度为 0
  33.     int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点
  34.     while (theta < MAX_RADIUS / FACTOR) {
  35.         // 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
  36.         float r = FACTOR * theta;
  37.         float adjustedTheta = theta + rotationAngle * 3.14159 / 180; // 添加旋转角度
  38.         int x = CENTER_X + r * cos(adjustedTheta);
  39.         int y = CENTER_Y + r * sin(adjustedTheta);
  40.         // 连接当前点和前一个点
  41.         tft.drawLine(prevX, prevY, x, y, GC9A01A_CYAN);
  42.         // 更新前一个点和角度
  43.         prevX = x;
  44.         prevY = y;
  45.         theta += STEP; // 增加角度
  46.     }
  47. }
  48. void setup() {
  49.     Serial.begin(115200);          // 初始化串口通信
  50.     Serial.println("Dynamic Rotating Archimedean Spiral");
  51.     tft.begin();                   // 初始化屏幕
  52.     tft.setRotation(0);            // 设置屏幕方向
  53.     tft.fillScreen(GC9A01A_BLACK); // 清屏设置为黑色背景
  54. }
  55. void loop() {
  56.     static float rotationAngle = 0;  // 初始化旋转角度
  57.     // 清屏并绘制新的螺线
  58.     tft.fillScreen(GC9A01A_BLACK);  // 清屏
  59.     drawRotatingSpiral(rotationAngle);
  60.     // 更新旋转角度
  61.     rotationAngle += ROTATION_SPEED;
  62.     if (rotationAngle >= 360) {
  63.         rotationAngle = 0; // 重置角度循环
  64.     }
  65.     delay(50); // 控制帧速率
  66. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

代码说明

1、动态旋转:

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

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

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

3、流畅动画:

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

4、可调整参数:

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

5、效果描述

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十五:多彩动态旋转10条向心线
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 定义参数
  24. #define CENTER_X 120        // 屏幕中心 X
  25. #define CENTER_Y 120        // 屏幕中心 Y
  26. #define SCALE 100           // 心形曲线缩放因子
  27. #define STEP 0.1            // 参数步进(越小曲线越平滑)
  28. #define ROTATION_SPEED 3    // 每帧旋转的角度(度)
  29. #define NUM_HEARTS 10       // 心形曲线数量
  30. // 定义颜色数组
  31. uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
  32. int numColors = sizeof(colors) / sizeof(colors[0]);
  33. // 绘制一条心形曲线
  34. void drawHeartCurve(float rotationAngle, float phase, uint16_t color) {
  35.     float t = 0; // 参数 t 表示角度
  36.     int prevX = CENTER_X, prevY = CENTER_Y; // 初始点
  37.     while (t < 2 * 3.14159) {
  38.         // 心形曲线的参数方程
  39.         float x_heart = SCALE * (16 * sin(t) * sin(t) * sin(t));
  40.         float y_heart = -SCALE * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t));
  41.         // 应用旋转角度和相位偏移
  42.         float adjustedX = x_heart * cos(rotationAngle * 3.14159 / 180 + phase) - y_heart * sin(rotationAngle * 3.14159 / 180 + phase);
  43.         float adjustedY = x_heart * sin(rotationAngle * 3.14159 / 180 + phase) + y_heart * cos(rotationAngle * 3.14159 / 180 + phase);
  44.         int x = CENTER_X + adjustedX;
  45.         int y = CENTER_Y + adjustedY;
  46.         // 连接当前点和前一个点
  47.         tft.drawLine(prevX, prevY, x, y, color);
  48.         // 更新前一个点和参数 t
  49.         prevX = x;
  50.         prevY = y;
  51.         t += STEP; // 参数步进
  52.     }
  53. }
  54. void setup() {
  55.     Serial.begin(115200);           // 初始化串口通信
  56.     Serial.println("Dynamic Rotating Heart Curves");
  57.     tft.begin();                    // 初始化屏幕
  58.     tft.setRotation(0);             // 设置屏幕方向
  59.     tft.fillScreen(GC9A01A_BLACK);  // 设置黑色背景
  60. }
  61. void loop() {
  62.     static float rotationAngle = 0; // 初始化旋转角度
  63.     // 清屏
  64.     tft.fillScreen(GC9A01A_BLACK);
  65.     // 绘制多条心形曲线
  66.     for (int i = 0; i < NUM_HEARTS; i++) {
  67.         // 随机颜色
  68.         uint16_t color = colors[random(0, numColors)];
  69.         // 相位偏移,使心形曲线位置不同
  70.         float phase = i * (2 * 3.14159 / NUM_HEARTS);
  71.         // 绘制心形曲线
  72.         drawHeartCurve(rotationAngle, phase, color);
  73.     }
  74.     // 更新旋转角度
  75.     rotationAngle += ROTATION_SPEED;
  76.     if (rotationAngle >= 360) {
  77.         rotationAngle = 0; // 重置角度循环
  78.     }
  79.     delay(100); // 控制帧速率
  80. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

代码说明

1、数量提升至10条:

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

2、增强对称性:

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

3、随机颜色变化:

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

4、动态旋转:

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

5、效果描述

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十六:多彩动态横竖方格线
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 定义屏幕参数
  24. #define SCREEN_WIDTH 240      // 屏幕宽度
  25. #define SCREEN_HEIGHT 240     // 屏幕高度
  26. #define LINE_SPACING 10       // 横竖线的间隔
  27. // 定义颜色数组
  28. uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
  29. int numColors = sizeof(colors) / sizeof(colors[0]);
  30. void setup() {
  31.     Serial.begin(115200);           // 初始化串口通信
  32.     Serial.println("Dynamic Lines Animation");
  33.     tft.begin();                    // 初始化屏幕
  34.     tft.setRotation(0);             // 设置屏幕方向
  35.     tft.fillScreen(GC9A01A_BLACK);  // 设置黑色背景
  36. }
  37. void loop() {
  38.     static int colorIndex = 0;      // 当前颜色索引
  39.     // 清屏
  40.     tft.fillScreen(GC9A01A_BLACK);
  41.     // 绘制横线
  42.     for (int y = 0; y <= SCREEN_HEIGHT; y += LINE_SPACING) {
  43.         uint16_t color = colors[(colorIndex + y / LINE_SPACING) % numColors];
  44.         tft.drawLine(0, y, SCREEN_WIDTH, y, color);
  45.     }
  46.     // 绘制竖线
  47.     for (int x = 0; x <= SCREEN_WIDTH; x += LINE_SPACING) {
  48.         uint16_t color = colors[(colorIndex + x / LINE_SPACING) % numColors];
  49.         tft.drawLine(x, 0, x, SCREEN_HEIGHT, color);
  50.     }
  51.     // 更新颜色索引
  52.     colorIndex++;
  53.     if (colorIndex >= numColors) {
  54.         colorIndex = 0; // 循环颜色
  55.     }
  56.     delay(100); // 控制帧速率
  57. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

代码说明

1、满屏横竖线:

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

2、多彩动态效果:

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

3、优化的循环绘制:

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

4、流畅动画:

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

5、效果描述

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

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

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图  动态图

【花雕学编程】Arduino动手做(249)--GC9A01屏39个特色案例图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目实验之三十七:双螺线动态旋转与随机变色
  5. */
  6. //       GC9A01---------- ESP32
  7. //       RST ------------ NC(复位引脚,此处未连接)
  8. //       CS ------------- D4(片选引脚,连接到ESP32的D4引脚)
  9. //       DC ------------- D2(数据/命令选择引脚,连接到ESP32的D2引脚)
  10. //       SDA ------------ D23 (green)(主数据输出引脚,连接到ESP32的D23引脚,绿色线)
  11. //       SCL ------------ D18 (yellow)(时钟信号引脚,连接到ESP32的D18引脚,黄色线)
  12. //       GND ------------ GND(接地引脚,连接到ESP32的接地端)
  13. //       VCC -------------3V3(电源引脚,连接到ESP32的3.3V电源)
  14. #include "SPI.h"
  15. #include "Adafruit_GFX.h"
  16. #include "Adafruit_GC9A01A.h"
  17. // 定义屏幕引脚
  18. #define TFT_CS 4        // 片选引脚
  19. #define TFT_DC 2        // 数据/命令引脚
  20. #define TFT_RST -1      // 重置引脚(未使用时设置为 -1)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 定义阿基米德螺线参数
  24. #define CENTER_X 120       // 屏幕中心 X
  25. #define CENTER_Y 120       // 屏幕中心 Y
  26. #define MAX_RADIUS 120     // 最大半径
  27. #define FACTOR 10          // 螺线增长因子
  28. #define STEP 0.1           // 每次增加的角度步进(弧度)
  29. #define ROTATION_SPEED 3   // 每帧旋转的角度(度)
  30. // 定义颜色数组
  31. uint16_t colors[] = {GC9A01A_RED, GC9A01A_GREEN, GC9A01A_BLUE, GC9A01A_YELLOW, GC9A01A_MAGENTA, GC9A01A_CYAN, GC9A01A_WHITE};
  32. int numColors = sizeof(colors) / sizeof(colors[0]);
  33. void drawSpiral(float rotationAngle, int direction, uint16_t color) {
  34.     float theta = 0;  // 初始化角度为 0
  35.     int prevX = CENTER_X, prevY = CENTER_Y; // 螺线起点
  36.     while (theta < MAX_RADIUS / FACTOR) {
  37.         // 计算极坐标 r 和旋转后的笛卡尔坐标 (x, y)
  38.         float r = FACTOR * theta;
  39.         float adjustedTheta = theta + direction * rotationAngle * 3.14159 / 180; // 顺或逆旋转
  40.         int x = CENTER_X + r * cos(adjustedTheta);
  41.         int y = CENTER_Y + r * sin(adjustedTheta);
  42.         // 连接当前点和前一个点
  43.         tft.drawLine(prevX, prevY, x, y, color);
  44.         // 更新前一个点和角度
  45.         prevX = x;
  46.         prevY = y;
  47.         theta += STEP; // 增加角度
  48.     }
  49. }
  50. void setup() {
  51.     Serial.begin(115200);          // 初始化串口通信
  52.     Serial.println("Dual Rotating Spirals with Random Colors");
  53.     tft.begin();                   // 初始化屏幕
  54.     tft.setRotation(0);            // 设置屏幕方向
  55.     tft.fillScreen(GC9A01A_BLACK); // 设置黑色背景
  56. }
  57. void loop() {
  58.     static float rotationAngle = 0;  // 初始化旋转角度
  59.     // 清屏
  60.     tft.fillScreen(GC9A01A_BLACK);
  61.     // 随机颜色
  62.     uint16_t color1 = colors[random(0, numColors)];
  63.     uint16_t color2 = colors[random(0, numColors)];
  64.     // 绘制顺时针螺线
  65.     drawSpiral(rotationAngle, 1, color1);
  66.     // 绘制逆时针螺线
  67.     drawSpiral(rotationAngle, -1, color2);
  68.     // 更新旋转角度
  69.     rotationAngle += ROTATION_SPEED;
  70.     if (rotationAngle >= 360) {
  71.         rotationAngle = 0; // 重置角度循环
  72.     }
  73.     delay(100); // 控制帧速率
  74. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail