64浏览
查看: 64|回复: 7

[项目] 【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

[复制链接]
【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图2

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图1

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:16:45

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图2

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:18:44

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图2

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:31:25

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  项目之五十二:GC9A01屏之实现全方向粒子流循环向外扩散

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
  4.   项目之五十二:GC9A01屏之实现全方向粒子流循环向外扩散
  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      // 定义 TFT 屏幕的片选引脚
  19. #define TFT_DC 2      // 定义 TFT 屏幕的数据/命令引脚
  20. #define TFT_RST -1    // 定义 TFT 屏幕的复位引脚(-1 表示未使用)
  21. // 初始化屏幕对象
  22. Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
  23. // 粒子流参数
  24. #define PARTICLE_COUNT 36  // **360 度 / 10 度 = 36 个粒子,确保均匀分布**
  25. #define SCREEN_WIDTH 240   // **屏幕宽度**
  26. #define SCREEN_HEIGHT 240  // **屏幕高度**
  27. #define FRAME_DELAY 100     // **每帧延迟(控制流动速度)**
  28. #define PARTICLE_RADIUS 3  // **粒子半径**
  29. #define TRAIL_LENGTH 50    // **粒子的尾迹长度**
  30. #define CENTER_X SCREEN_WIDTH / 2 // **粒子流的中心 X 坐标**
  31. #define CENTER_Y SCREEN_HEIGHT / 2 // **粒子流的中心 Y 坐标**
  32. // **定义粒子结构体**
  33. struct Particle {
  34.     float x, y;        // **当前粒子坐标**
  35.     float angle;       // **粒子方向(以角度表示,例如 0°、10°、20°...)**
  36.     float speed;       // **粒子的运动速度**
  37.     uint16_t color;    // **粒子的颜色(16位 RGB565 格式)**
  38. };
  39. // **粒子数组**
  40. Particle particles[PARTICLE_COUNT];
  41. // **初始化粒子(每个粒子间隔 10 度)**
  42. void initializeParticles() {
  43.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  44.         particles[i].x = CENTER_X; // **所有粒子从屏幕中心开始**
  45.         particles[i].y = CENTER_Y;
  46.         particles[i].angle = i * 10; // **每个粒子间隔 10 度,形成完整的360度扩散**
  47.         particles[i].speed = random(2, 5); // **随机速度,增强动态效果**
  48.         particles[i].color = tft.color565(random(150, 255), random(100, 255), random(100, 255)); // **随机亮色**
  49.     }
  50. }
  51. // **更新粒子的位置,使其沿角度方向扩散**
  52. void updateParticles() {
  53.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  54.         float rad = particles[i].angle * 3.14159 / 180.0; // **角度转换为弧度**
  55.         particles[i].x += particles[i].speed * cos(rad);  // **计算 X 轴移动**
  56.         particles[i].y += particles[i].speed * sin(rad);  // **计算 Y 轴移动**
  57.         // **如果粒子超出屏幕,则重新回到中心**
  58.         if (particles[i].x < 0 || particles[i].x > SCREEN_WIDTH || particles[i].y < 0 || particles[i].y > SCREEN_HEIGHT) {
  59.             particles[i].x = CENTER_X; // **将粒子回归到中心**
  60.             particles[i].y = CENTER_Y;
  61.         }
  62.     }
  63. }
  64. // **绘制粒子流(包含 16 个尾迹,使轨迹更加明显)**
  65. void drawParticles() {
  66.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  67.         // **为粒子绘制尾迹,使其更长**
  68.         for (int j = 0; j < TRAIL_LENGTH; j++) {
  69.             float alpha = 1.0 - (float)j / TRAIL_LENGTH; // **让尾迹颜色逐渐变淡**
  70.             
  71.             // **提取 RGB565 格式中的红、绿、蓝分量**
  72.             uint8_t r = ((particles[i].color >> 11) & 0x1F) * alpha;
  73.             uint8_t g = ((particles[i].color >> 5) & 0x3F) * alpha;
  74.             uint8_t b = (particles[i].color & 0x1F) * alpha;
  75.             // **尾迹颜色变亮,增强视觉效果**
  76.             uint16_t fadedColor = tft.color565(r * 8, g * 4, b * 8);
  77.             // **绘制粒子的尾迹,随着距离增加而变淡**
  78.             tft.fillCircle(
  79.                 (int)(particles[i].x - cos(particles[i].angle * 3.14159 / 180.0) * j),
  80.                 (int)(particles[i].y - sin(particles[i].angle * 3.14159 / 180.0) * j),
  81.                 PARTICLE_RADIUS - j / 4, fadedColor);
  82.         }
  83.     }
  84. }
  85. // **初始化 TFT 屏幕,并启动粒子系统**
  86. void setup() {
  87.     Serial.begin(115200); // **初始化串口,用于调试**
  88.     tft.begin();          // **初始化 TFT 屏幕**
  89.     tft.setRotation(0);   // **屏幕方向**
  90.     tft.fillScreen(GC9A01A_BLACK); // **设置背景为黑色**
  91.     initializeParticles(); // **初始化所有粒子**
  92. }
  93. // **主循环:更新并绘制粒子流**
  94. void loop() {
  95.     tft.fillScreen(GC9A01A_BLACK); // **清屏,防止残影**
  96.    
  97.     updateParticles(); // **更新粒子的位置**
  98.     drawParticles();   // **绘制粒子流**
  99.     delay(FRAME_DELAY); // **控制帧速率**
  100. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:33:57

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

代码解读

1、粒子初始化 (initializeParticles())

所有粒子从屏幕中央开始 (CENTER_X, CENTER_Y)。

角度 angle 每个粒子 间隔 10 度 (i * 10),确保均匀扩散。

颜色随机,使每个粒子在扩散时形成五彩斑斓的效果。

2、粒子更新 (updateParticles())

通过 cos() 和 sin() 计算粒子的 X 轴 和 Y 轴 位移,使其按照 预设角度扩散。

速度随机,使每个粒子的扩散速度不同,增强动感。

当粒子 超出屏幕时,它会 回到中心,从而形成无限循环的扩散运动。

3、绘制粒子 (drawParticles())

每个粒子有 16 个尾巴 (TRAIL_LENGTH = 16),使轨迹更加清晰。

通过 fillCircle() 让粒子尾迹逐渐 变淡,形成动态光流效果。

4、主循环 (loop())

清屏 (fillScreen()) 确保每帧刷新不会残留旧图像。

更新粒子状态 (updateParticles()),使粒子不断运动。

绘制粒子 (drawParticles()),确保动画生动。

5、最终效果
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:35:38

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

实验场景图  动态图

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图2

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 05:40:19

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

实验场景图  动态图

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图2

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 09:52:55

【花雕学编程】Arduino动手做(249)---GC9A01全方向粒子流

粒子系统
  • 模拟动态粒子效果,例如烟花、星空、或者粒子流。
  • 关键点:创建粒子对象,每帧更新其位置、速度和颜色,超出屏幕范围后重置粒子。

  1. struct Particle {
  2.     int x, y, dx, dy, color;
  3. };
  4. Particle particles[100];
  5. // 在 loop() 中更新粒子位置并绘制
复制代码


回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail