【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
项目之一百一十五:ESP32+GC9A01之模拟一个带有上升轨迹的烟花动画
实验开源代码
- /*
- 【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百四十九:1.28寸圆形彩色TFT显示屏 高清IPS 模块 240*240 SPI接口GC9A01驱动
- 项目之一百一十五:ESP32+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 <TFT_eSPI.h>
- #include <math.h>
-
- #define SCREEN_WIDTH 240
- #define SCREEN_HEIGHT 240
- #define NUM_FIREWORKS 5 // **烟花数量**
- #define NUM_PARTICLES 100 // **每个烟花的粒子**
- #define TRAIL_LENGTH 100 // **上升轨迹长度**
- #define TRAIL_SPEED 10 // **上升速度**
- #define EXPLOSION_SPEED 3 // ****速度**
- #define FADE_RATE 5 // **颜色渐变速率**
- #define INTERVAL 300 // **烟花间隔时间**
-
- TFT_eSPI tft = TFT_eSPI();
-
- struct Particle {
- float x, y;
- float vx, vy;
- uint16_t color;
- int lifetime;
- };
-
- struct Firework {
- float x, y;
- float vy;
- bool exploded;
- float trailY[TRAIL_LENGTH]; // **存储上升轨迹**
- Particle particles[NUM_PARTICLES];
- };
-
- Firework fireworks[NUM_FIREWORKS];
- uint32_t lastLaunchTime = 0;
-
- void setup() {
- Serial.begin(115200);
- tft.init();
- tft.setRotation(2);
- tft.fillScreen(TFT_BLACK);
-
- for (int i = 0; i < NUM_FIREWORKS; i++) {
- fireworks[i].x = random(50, SCREEN_WIDTH - 50);
- fireworks[i].y = SCREEN_HEIGHT;
- fireworks[i].vy = -TRAIL_SPEED;
- fireworks[i].exploded = false;
-
- for (int j = 0; j < TRAIL_LENGTH; j++) {
- fireworks[i].trailY[j] = SCREEN_HEIGHT;
- }
- }
- }
-
- void launchFireworks() {
- for (int i = 0; i < NUM_FIREWORKS; i++) {
- Firework &fw = fireworks[i];
-
- if (!fw.exploded) {
- // **绘制轨迹**
- for (int j = 0; j < TRAIL_LENGTH; j++) {
- int alpha = (255 - j * 12); // **让轨迹逐渐变暗**
- uint16_t color = tft.color565(alpha, alpha, alpha);
- tft.drawPixel(fw.x, fw.trailY[j], color);
- }
-
- // **更新轨迹位置**
- for (int j = TRAIL_LENGTH - 1; j > 0; j--) {
- fw.trailY[j] = fw.trailY[j - 1];
- }
- fw.trailY[0] = fw.y; // **当前烟花位置**
-
- // **移动烟花**
- fw.y += fw.vy;
-
- if (fw.y < random(60, 100)) { // **到达**高度**
- fw.exploded = true;
- for (int j = 0; j < NUM_PARTICLES; j++) {
- float angle = random(0, 360) * M_PI / 180;
- fw.particles[j].vx = cos(angle) * EXPLOSION_SPEED;
- fw.particles[j].vy = sin(angle) * EXPLOSION_SPEED;
- fw.particles[j].x = fw.x;
- fw.particles[j].y = fw.y;
- fw.particles[j].color = tft.color565(random(150, 255), random(50, 255), random(50, 255));
- fw.particles[j].lifetime = 255;
- }
- }
- } else {
- for (int j = 0; j < NUM_PARTICLES; j++) {
- Particle &p = fw.particles[j];
-
- if (p.lifetime > 0) {
- tft.fillCircle(p.x, p.y, 2, p.color);
- p.x += p.vx;
- p.y += p.vy;
- p.color = tft.color565(p.lifetime, p.lifetime / 2, 255 - p.lifetime);
- p.lifetime -= FADE_RATE;
- }
- }
- }
- }
-
- // **每隔 300 毫秒触发新烟花**
- if (millis() - lastLaunchTime > INTERVAL) {
- lastLaunchTime = millis();
- int index = random(0, NUM_FIREWORKS);
- fireworks[index].y = SCREEN_HEIGHT;
- fireworks[index].exploded = false;
-
- for (int j = 0; j < TRAIL_LENGTH; j++) {
- fireworks[index].trailY[j] = SCREEN_HEIGHT;
- }
- }
- }
-
- void loop() {
- tft.fillScreen(TFT_BLACK);
- launchFireworks();
- delay(50);
- }
复制代码
|