#include <TFT_eSPI.h>
// 定義 TFT_eSPI 函式庫使用的 TFT 連接接腳
#define TFT_CS 5
#define TFT_RST 2
#define TFT_DC 15
// 初始化 TFT 物件
TFT_eSPI tft = TFT_eSPI();
// 中心座標
#define CENTER_X 160
#define CENTER_Y 120
// 大紅點半徑
#define BIG_DOT_RADIUS 7
// 小紅點半徑
#define SMALL_DOT_RADIUS 3
unsigned long pTime_g = 0;
int generate = 1500;
void setup() {
// 初始化 TFT 顯示
tft.begin();
tft.setRotation(1); // 設定顯示旋轉方向
// 設定背景為黑色
tft.fillScreen(TFT_BLACK);
// 畫一個紅色的填滿圓在畫面中心
tft.fillCircle(CENTER_X, CENTER_Y, BIG_DOT_RADIUS, TFT_RED);
}
unsigned long lastMoveTime = 0;
bool dotsGenerated = false;
int generatedX[5];
int generatedY[5];
float generatedAngles[5]; // 儲存每個小紅點的生成角度
int speed;
int count = 5; // 預設生成 5 個小紅點
void loop() {
if (millis() - pTime_g > generate) {
clearRemainingDots(); // 清除所有未達到邊界的小紅點
generateSmallDots(count);
pTime_g = millis();
lastMoveTime = millis(); // 記錄生成時間
dotsGenerated = true; // 標記小紅點已生成
}
// 檢查是否需要移動小紅點
if (dotsGenerated) {
moveSmallDots();
}
}
void clearRemainingDots() {
for (int i = 0; i < count; i++) {
// 清除畫面上的小紅點
tft.fillCircle(generatedX[i], generatedY[i], SMALL_DOT_RADIUS, TFT_BLACK);
}
}
void generateSmallDots(int count) {
int distance = random(10, 31);
speed = random(1, 6); // 隨機選擇移動速度
float angleIncrement = 2 * PI / count;
float currentAngle = 0;
for (int i = 0; i < count; i++) {
int smallDotX = CENTER_X + cos(currentAngle) * distance;
int smallDotY = CENTER_Y + sin(currentAngle) * distance;
generatedX[i] = smallDotX;
generatedY[i] = smallDotY;
generatedAngles[i] = currentAngle; // 儲存生成角度
tft.fillCircle(smallDotX, smallDotY, SMALL_DOT_RADIUS, TFT_RED);
currentAngle += angleIncrement;
}
}
unsigned long lastUpdateTime = 0;
const int updateInterval = 30;
void moveSmallDots() {
if (millis() - lastUpdateTime < updateInterval) return;
lastUpdateTime = millis();
bool allMoved = true;
for (int i = 0; i < count; i++) {
int smallDotX = generatedX[i];
int smallDotY = generatedY[i];
float angle = generatedAngles[i];
// 根據角度更新位置
smallDotX += cos(angle) * speed;
smallDotY += sin(angle) * speed;
if (smallDotX - SMALL_DOT_RADIUS <= 0 || smallDotX + SMALL_DOT_RADIUS >= tft.width() ||
smallDotY - SMALL_DOT_RADIUS <= 0 || smallDotY + SMALL_DOT_RADIUS >= tft.height()) {
tft.fillCircle(generatedX[i], generatedY[i], SMALL_DOT_RADIUS + 2, TFT_BLACK);
} else {
tft.fillCircle(generatedX[i], generatedY[i], SMALL_DOT_RADIUS, TFT_BLACK);
tft.fillCircle(smallDotX, smallDotY, SMALL_DOT_RADIUS, TFT_RED);
generatedX[i] = smallDotX;
generatedY[i] = smallDotY;
allMoved = false;
}
}
dotsGenerated = !allMoved;
}