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

[项目] 【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

[复制链接]
【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图2

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图1

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:02:26

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图2

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:10:15

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图2

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:13:06

【花雕学编程】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 72  // 360 度 / 5 度 = 72 个粒子,确保均匀分布
  25. #define SCREEN_WIDTH 240   // 屏幕宽度
  26. #define SCREEN_HEIGHT 240  // 屏幕高度
  27. #define FRAME_DELAY 30     // 每帧延迟(控制流动速度)
  28. #define PARTICLE_RADIUS 1  // 粒子半径
  29. #define TRAIL_LENGTH 66    // 粒子尾迹长度
  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°~360°)
  36.     float speed;       // 粒子的运动速度
  37.     uint16_t color;    // 粒子的颜色(仅红、蓝、绿)
  38. };
  39. // **粒子数组**
  40. Particle particles[PARTICLE_COUNT];
  41. // **随机选择红、蓝、绿颜色**
  42. uint16_t getRandomRGBColor() {
  43.     int choice = random(0, 3);
  44.     if (choice == 0) return tft.color565(255, 0, 0);  // 红色
  45.     if (choice == 1) return tft.color565(0, 255, 0);  // 绿色
  46.     return tft.color565(0, 0, 255);                   // 蓝色
  47. }
  48. // **初始化粒子(间隔 10 度 + 红蓝绿三色)**
  49. void initializeParticles() {
  50.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  51.         particles[i].x = CENTER_X;          // 所有粒子从屏幕中心开始
  52.         particles[i].y = CENTER_Y;
  53.         particles[i].angle = i * 10;        // 每个粒子间隔 10 度,形成完整的 360 度扩散
  54.         particles[i].speed = random(2, 5);  // 随机速度,增强动态效果
  55.         particles[i].color = getRandomRGBColor();  // 随机选择红、蓝或绿
  56.     }
  57. }
  58. // **更新粒子的位置,使其沿角度方向扩散**
  59. void updateParticles() {
  60.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  61.         float rad = particles[i].angle * 3.14159 / 180.0; // 角度转换为弧度
  62.         particles[i].x += particles[i].speed * cos(rad);  // 计算 X 轴移动
  63.         particles[i].y += particles[i].speed * sin(rad);  // 计算 Y 轴移动
  64.         // **如果粒子超出屏幕,则重新回到中心**
  65.         if (particles[i].x < 0 || particles[i].x > SCREEN_WIDTH || particles[i].y < 0 || particles[i].y > SCREEN_HEIGHT) {
  66.             particles[i].x = CENTER_X;  // 重新放置在中心
  67.             particles[i].y = CENTER_Y;
  68.             particles[i].color = getRandomRGBColor();  // 颜色随机选择红、蓝或绿
  69.         }
  70.     }
  71. }
  72. // **绘制粒子流(更长的尾迹,使轨迹更明显)**
  73. void drawParticles() {
  74.     for (int i = 0; i < PARTICLE_COUNT; i++) {
  75.         // **为粒子绘制尾迹,使其更长**
  76.         for (int j = 0; j < TRAIL_LENGTH; j++) {
  77.             float alpha = 1.0 - (float)j / TRAIL_LENGTH; // 尾迹逐渐淡化
  78.             
  79.             // **提取 RGB565 格式中的红、绿、蓝分量**
  80.             uint8_t r = ((particles[i].color >> 11) & 0x1F) * alpha;
  81.             uint8_t g = ((particles[i].color >> 5) & 0x3F) * alpha;
  82.             uint8_t b = (particles[i].color & 0x1F) * alpha;
  83.             // **尾迹颜色增强,使其更亮**
  84.             uint16_t fadedColor = tft.color565(r * 8, g * 8, b * 8);
  85.             // **绘制更长的尾迹**
  86.             tft.fillCircle(
  87.                 (int)(particles[i].x - cos(particles[i].angle * 3.14159 / 180.0) * j),
  88.                 (int)(particles[i].y - sin(particles[i].angle * 3.14159 / 180.0) * j),
  89.                 PARTICLE_RADIUS - j / 6, fadedColor);
  90.         }
  91.     }
  92. }
  93. // **初始化 TFT 屏幕,并启动粒子系统**
  94. void setup() {
  95.     Serial.begin(115200);  // 初始化串口,用于调试
  96.     tft.begin();           // 初始化 TFT 屏幕
  97.     tft.setRotation(0);    // 屏幕方向
  98.     tft.fillScreen(GC9A01A_BLACK);  // 设置背景为黑色
  99.     initializeParticles(); // 初始化所有粒子
  100. }
  101. // **主循环:更新并绘制粒子流**
  102. void loop() {
  103.     tft.fillScreen(GC9A01A_BLACK);  // 清屏,防止残影
  104.     updateParticles();  // 更新粒子的位置
  105.     drawParticles();    // 绘制粒子流
  106.     delay(FRAME_DELAY); // 控制帧速率
  107. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:15:01

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

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

代码解读

1. 粒子初始化 (initializeParticles())
• 所有粒子从屏幕中央开始 (CENTER_X, CENTER_Y)。
• 角度 angle 每个粒子 间隔 5 度 (i * 5),确保均匀扩散。
• 颜色仅限 红、蓝、绿,确保视觉清晰。

2. 粒子更新 (updateParticles())
• 通过 cos() 和 sin() 计算粒子的 X 轴 和 Y 轴 位移,使其按照 预设角度扩散。
• 速度随机,使每个粒子的扩散速度不同,增强动感。
• 当粒子 超出屏幕时,它会 回到中心,从而形成无限循环的扩散运动。

3. 绘制粒子 (drawParticles())
• 每个粒子有 66 个尾巴 (TRAIL_LENGTH = 66),使轨迹更加清晰。
• 颜色随尾迹淡出,增强视觉过渡效果。

4. 主循环 (loop())
• 清屏 (fillScreen()) 确保每帧刷新不会残留旧图像。
• 更新粒子状态 (updateParticles()),确保流动效果。
• 绘制粒子 (drawParticles()),使动画炫酷生动。

5. 最终效果
• 更长的粒子尾迹,拖动更明显
• 仅限红蓝绿三色,视觉清晰
• 流畅循环,无干扰,持续扩散





回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:19:30

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

实验场景图  动态图

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图2

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 06:22:32

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图2

【花雕学编程】Arduino动手做(249)---GC9A01三色粒子射线图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-4-10 10:00:26

【花雕学编程】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