// 引入Arduino核心库,用于支持基本的输入输出、时间等相关操作
#include <Arduino.h>
// 定义连接LED灯的引脚数组,这里假设分别连接到数字引脚2、3、4、5、6,可根据实际连接情况修改
const byte pins[] = {2, 3, 4, 5, 6};
// 定义LED结构体,用于存储每个LED的相关属性
struct LED {
byte pin;
unsigned int interval; // 存储LED闪烁周期,单位:毫秒
unsigned long previousMillis; // 记录上次更新LED状态的时间
};
// 创建LED结构体数组,用于管理多个LED灯
LED leds[5];
byte ledsLength = 5;
// 初始化函数,在Arduino启动时执行一次
void setup() {
for (int i = 0; i < ledsLength; i++) {
// 设置LED引脚为输出模式
pinMode(leds[i].pin, OUTPUT);
// 为每个LED生成随机的闪烁周期,范围在100到2000毫秒之间
leds[i].interval = random(100, 2000);
// 初始化上次更新时间为当前时间(millis()返回从开机到现在的毫秒数)
leds[i].previousMillis = millis();
}
}
// 主循环函数,不断循环执行以实现LED灯的闪烁逻辑
void loop() {
multitaskLED();
}
// 用于实现多个LED灯闪烁逻辑的函数
void multitaskLED() {
unsigned long currentMillis = millis();
for (byte i = 0; i < ledsLength; i++) {
// 判断距离上次更新LED状态的时间是否达到当前LED的闪烁周期
if ((currentMillis - leds[i].previousMillis) >= leds[i].interval) {
leds[i].previousMillis = currentMillis;
// 计算当前处于闪烁周期内的时间位置(0到interval范围)
unsigned long elapsedTime = (currentMillis - leds[i].previousMillis) % leds[i].interval;
// 通过映射函数将时间范围映射到0 - 255的PWM输出范围,用于控制LED亮度
int brightness = map(elapsedTime, 0, leds[i].interval, 0, 255);
// 判断是否处于渐亮阶段(周期的前半段)
if (elapsedTime < leds[i].interval / 2) {
analogWrite(leds[i].pin, brightness);
} else {
// 处于渐灭阶段(周期的后半段),通过255 - brightness实现渐灭效果
analogWrite(leds[i].pin, 255 - brightness);
}
}
}
}