#include <FastLED.h> // 引入FastLED库,用于控制WS2812B LED灯带
// 定义每个行星的LED数量
const int mercuryLEDs = 21; // 水星灯带的LED数量
const int venusLEDs = 21; // 金星灯带的LED数量
const int earthLEDs = 21; // 地球灯带的LED数量
const int marsLEDs = 21; // 火星灯带的LED数量
const int jupiterLEDs = 31; // 木星灯带的LED数量
const int saturnLEDs = 26; // 土星灯带的LED数量
const int uranusLEDs = 21; // 天王星灯带的LED数量
const int neptuneLEDs = 19; // 海王星灯带的LED数量
// 定义每个行星的公转速度,数值越大表示公转越快
float planetSpeeds[] = {4.17, 1.61, 1, 0.53, 0.08, 0.03, 0.01, 0.006}; // 公转速度数组
// 定义每个行星的颜色
CRGB planetColors[] = {CRGB::Gray, CRGB::Yellow, CRGB::Blue, CRGB::Red, CRGB::Orange, CRGB::LightYellow, CRGB::LightGreen, CRGB::LightBlue};
// 定义每个行星的LED数组
CRGB ledsMercury[mercuryLEDs];
CRGB ledsVenus[venusLEDs];
CRGB ledsEarth[earthLEDs];
CRGB ledsMars[marsLEDs];
CRGB ledsJupiter[jupiterLEDs];
CRGB ledsSaturn[saturnLEDs];
CRGB ledsUranus[uranusLEDs];
CRGB ledsNeptune[neptuneLEDs];
// 用于跟踪每个行星的LED位置
int positions[] = {0, 0, 0, 0, 0, 0, 0, 0};
// 定义每个行星的LED数量数组
int numLEDs[] = {mercuryLEDs, venusLEDs, earthLEDs, marsLEDs, jupiterLEDs, saturnLEDs, uranusLEDs, neptuneLEDs};
void setup() {
Serial.begin(9600); // 开始串行通信,用于调试信息输出
// 初始化每个灯带,2-9号引脚对应8个行星
FastLED.addLeds<NEOPIXEL, 2>(ledsMercury, mercuryLEDs); // 2号引脚连接水星灯带
FastLED.addLeds<NEOPIXEL, 3>(ledsVenus, venusLEDs); // 3号引脚连接金星灯带
FastLED.addLeds<NEOPIXEL, 4>(ledsEarth, earthLEDs); // 4号引脚连接地球灯带
FastLED.addLeds<NEOPIXEL, 5>(ledsMars, marsLEDs); // 5号引脚连接火星灯带
FastLED.addLeds<NEOPIXEL, 6>(ledsJupiter, jupiterLEDs); // 6号引脚连接木星灯带
FastLED.addLeds<NEOPIXEL, 7>(ledsSaturn, saturnLEDs); // 7号引脚连接土星灯带
FastLED.addLeds<NEOPIXEL, 8>(ledsUranus, uranusLEDs); // 8号引脚连接天王星灯带
FastLED.addLeds<NEOPIXEL, 9>(ledsNeptune, neptuneLEDs); // 9号引脚连接海王星灯带
}
void loop() {
for (int strip = 0; strip < 8; strip++) { // 遍历8个行星
// 将当前灯带设置为黑色(不亮)
CRGB* currentLeds = getLedsForPlanet(strip); // 获取当前行星的LED数组
fill_solid(currentLeds, numLEDs[strip], CRGB::Black); // 将当前LED数组填充为黑色
// 更新对应行星颜色的LED位置
int step = static_cast<int>(planetSpeeds[strip] * 10); // 计算步进值
if (step == 0) step = 1; // 确保步进值至少为1
positions[strip] = (positions[strip] + step) % numLEDs[strip]; // 更新位置
// 设置当前位置的LED为对应行星的颜色
currentLeds[positions[strip]] = planetColors[strip]; // 将当前位置的LED设置为行星颜色
Serial.print("Strip "); Serial.print(strip); Serial.print(" position: "); Serial.println(positions[strip]); // 打印调试信息
}
FastLED.show(); // 显示当前状态的LEDs
delay(50); // 控制整体更新速度
}
// 根据行星编号返回对应的LED数组
CRGB* getLedsForPlanet(int planet) {
switch (planet) {
case 0: return ledsMercury;
case 1: return ledsVenus;
case 2: return ledsEarth;
case 3: return ledsMars;
case 4: return ledsJupiter;
case 5: return ledsSaturn;
case 6: return ledsUranus;
case 7: return ledsNeptune;
default: return nullptr;
}
}