#include "LEDHandler.h" // 变量定义 std::queue blinkQueue; // 闪烁任务队列 bool isBlinking = false; // 是否正在执行闪烁任务 bool isConstantOn = false; // 是否常亮 unsigned long blinkStartTime = 0; // 当前闪烁任务的开始时间 int remainingBlinks = 0; // 剩余闪烁次数 int currentBlinkCount = 0; // 当前任务的闪烁次数 int pwmBrightness = 0; // 当前 PWM 亮度值 // 初始化 LED void setupLED() { pinMode(LED_PIN, OUTPUT); // 设置 LED 引脚为输出模式 digitalWrite(LED_PIN, LOW); // 初始状态为关闭 } // 添加闪烁任务 void addBlinkTask(int blinkCount) { BlinkTask task; task.blinkCount = blinkCount; blinkQueue.push(task); // 将任务加入队列 //Serial.println("[信息] 添加闪烁任务,闪烁次数: " + String(blinkCount)); } // 设置 LED 常亮或关闭 void setConstantOn(bool constantOn) { isConstantOn = constantOn; if (isConstantOn) { analogWrite(LED_PIN, pwmBrightness); // 使用 PWM 控制亮度 Serial.println("[信息] LED 常亮,亮度: " + String(pwmBrightness)); } else { analogWrite(LED_PIN, 0); // 关闭 LED Serial.println("[信息] LED 关闭"); } } // 设置 PWM 亮度 void setBrightness(int brightness) { if (brightness < 0) brightness = 0; if (brightness > 255) brightness = 255; pwmBrightness = brightness; if (isConstantOn) { // 如果 LED 常亮,更新亮度 analogWrite(LED_PIN, pwmBrightness); } Serial.println("[信息] 设置 PWM 亮度: " + String(pwmBrightness)); } // 设置固定亮度(百分比) void setFixedBrightness(int percentage) { if (percentage < 0) percentage = 0; if (percentage > 100) percentage = 100; // 将百分比转换为 PWM 值(0-255) pwmBrightness = map(percentage, 0, 100, 0, 255); setBrightness(pwmBrightness); // 设置亮度 Serial.println("[信息] 设置固定亮度: " + String(percentage) + "%"); } // 处理闪烁任务 void processBlinkTasks() { if (!isBlinking && !blinkQueue.empty() && !isConstantOn) { // 如果没有正在执行的任务且队列不为空,且 LED 不常亮,开始执行下一个任务 BlinkTask currentTask = blinkQueue.front(); blinkQueue.pop(); remainingBlinks = currentTask.blinkCount * 2; // 每次闪烁包括亮和灭 currentBlinkCount = currentTask.blinkCount; // 记录当前任务的闪烁次数 blinkStartTime = millis(); // 记录任务开始时间 isBlinking = true; //Serial.println("[信息] 开始执行闪烁任务,闪烁次数: " + String(currentTask.blinkCount)); } } // 控制 LED 闪烁 void blinkLED() { if (isConstantOn) { // 如果 LED 需要常亮,直接返回 return; } unsigned long currentTime = millis(); if (isBlinking) { // 计算每个闪烁周期的时间 unsigned long blinkDuration = 1000 / currentBlinkCount; // 每个闪烁周期的总时间(亮 + 灭) unsigned long halfBlinkDuration = blinkDuration / 2; // 亮或灭的时间 // 计算当前闪烁周期 unsigned long elapsedTime = currentTime - blinkStartTime; int currentCycle = elapsedTime / blinkDuration; if (currentCycle < currentBlinkCount) { // 控制 LED 状态 if (elapsedTime % blinkDuration < halfBlinkDuration) { analogWrite(LED_PIN, pwmBrightness); // 使用 PWM 控制亮度 } else { analogWrite(LED_PIN, 0); // 关闭 LED } } else { // 当前任务完成 analogWrite(LED_PIN, 0); // 确保 LED 关闭 isBlinking = false; //Serial.println("[信息] 闪烁任务完成"); } } // 处理下一个任务 processBlinkTasks(); }