| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include "LEDHandler.h"
- // 变量定义
- std::queue<BlinkTask> 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();
- }
|