// 定义时间记录数组(用于20个LED的闪烁计时) /
// Array für Zeitstempel von 20 LEDs definieren
unsigned long t[20];
// 定义闪烁模式变量 / Modusvariable definieren
int blinkMode = 1; // 默认模式1:所有灯随机闪烁
unsigned long lastSerialTime = 0;
void setup() {
Serial.begin(9600); // 初始化串口通信 / Serielle Kommunikation initialisieren
Serial.println("LED闪烁控制模式选择:"); // 提示信息
Serial.println("输入1: 所有灯随机闪烁");
Serial.println("输入2: 从左往右跑马灯");
Serial.println("输入3: 从右往左跑马灯");
// 初始化板载LED(引脚13) / Board-LED (Pin 13) initialisieren
pinMode(13, OUTPUT);
// 初始化所有LED引脚并记录初始时间 /
// Alle LED-Pins initialisieren und Startzeit speichern
for(int ledid = 0; ledid < 20; ledid++) {
pinMode(ledid, OUTPUT); // 设置引脚为输出模式 / Pin als Ausgang setzen
t[ledid] = millis(); // 记录当前时间戳 / Zeitstempel speichern
}
}
// LED闪烁控制函数 / LED-Blinkfunktion
// 参数:ledid - LED编号 (0-19)
// interval - 闪烁间隔(毫秒) / Blinkintervall (ms)
void ledblink(int ledid, int interval) {
if (millis() - t[ledid] >= interval) {
digitalWrite(ledid, !digitalRead(ledid)); // 切换LED状态
t[ledid] = millis(); // 更新最后切换时间
}
}
// 跑马灯效果函数 / Lauflicht-Funktion
// 参数:direction - 方向 (1=从左到右, -1=从右到左)
void runningLight(int direction) {
static unsigned long lastRunTime = 0;
static int currentLED = 0;
const int runInterval = 100; // 跑马灯速度
if (millis() - lastRunTime >= runInterval) {
// 关闭所有LED / Alle LEDs ausschalten
for(int i=0; i<20; i++) digitalWrite(i, LOW);
// 计算下一个要点亮的LED / Nächste LED berechnen
currentLED += direction;
if(currentLED < 0) currentLED = 19;
if(currentLED > 19) currentLED = 0;
// 点亮当前LED / Aktuelle LED einschalten
digitalWrite(currentLED, HIGH);
lastRunTime = millis();
}
}
void loop() {
// 检查串口输入 / Serielle Eingabe prüfen
if (Serial.available() > 0) {
char input = Serial.read();
if (input >= '1' && input <= '3') {
blinkMode = input - '0'; // 更新闪烁模式
// 模式切换时关闭所有LED / Bei Moduswechsel alle LEDs ausschalten
for(int i=0; i<20; i++) digitalWrite(i, LOW);
Serial.print("已切换到模式: ");
Serial.println(blinkMode);
}
}
// 根据模式执行不同效果 / Je nach Modus unterschiedliche Effekte ausführen
switch(blinkMode) {
case 1: // 模式1:所有灯随机闪烁
for(int ledid = 0; ledid < 20; ledid++) {
int blinkInterval = random(ledid, 2000 * (ledid+1));
ledblink(ledid, blinkInterval);
}
break;
case 2: // 模式2:从左往右跑马灯
runningLight(1);
break;
case 3: // 模式3:从右往左跑马灯
runningLight(-1);
break;
}
}