LEDHandler.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "LEDHandler.h"
  2. // 变量定义
  3. std::queue<BlinkTask> blinkQueue; // 闪烁任务队列
  4. bool isBlinking = false; // 是否正在执行闪烁任务
  5. bool isConstantOn = false; // 是否常亮
  6. unsigned long blinkStartTime = 0; // 当前闪烁任务的开始时间
  7. int remainingBlinks = 0; // 剩余闪烁次数
  8. int currentBlinkCount = 0; // 当前任务的闪烁次数
  9. int pwmBrightness = 0; // 当前 PWM 亮度值
  10. // 初始化 LED
  11. void setupLED() {
  12. pinMode(LED_PIN, OUTPUT); // 设置 LED 引脚为输出模式
  13. digitalWrite(LED_PIN, LOW); // 初始状态为关闭
  14. }
  15. // 添加闪烁任务
  16. void addBlinkTask(int blinkCount) {
  17. BlinkTask task;
  18. task.blinkCount = blinkCount;
  19. blinkQueue.push(task); // 将任务加入队列
  20. //Serial.println("[信息] 添加闪烁任务,闪烁次数: " + String(blinkCount));
  21. }
  22. // 设置 LED 常亮或关闭
  23. void setConstantOn(bool constantOn) {
  24. isConstantOn = constantOn;
  25. if (isConstantOn) {
  26. analogWrite(LED_PIN, pwmBrightness); // 使用 PWM 控制亮度
  27. Serial.println("[信息] LED 常亮,亮度: " + String(pwmBrightness));
  28. } else {
  29. analogWrite(LED_PIN, 0); // 关闭 LED
  30. Serial.println("[信息] LED 关闭");
  31. }
  32. }
  33. // 设置 PWM 亮度
  34. void setBrightness(int brightness) {
  35. if (brightness < 0) brightness = 0;
  36. if (brightness > 255) brightness = 255;
  37. pwmBrightness = brightness;
  38. if (isConstantOn) {
  39. // 如果 LED 常亮,更新亮度
  40. analogWrite(LED_PIN, pwmBrightness);
  41. }
  42. Serial.println("[信息] 设置 PWM 亮度: " + String(pwmBrightness));
  43. }
  44. // 设置固定亮度(百分比)
  45. void setFixedBrightness(int percentage) {
  46. if (percentage < 0) percentage = 0;
  47. if (percentage > 100) percentage = 100;
  48. // 将百分比转换为 PWM 值(0-255)
  49. pwmBrightness = map(percentage, 0, 100, 0, 255);
  50. setBrightness(pwmBrightness); // 设置亮度
  51. Serial.println("[信息] 设置固定亮度: " + String(percentage) + "%");
  52. }
  53. // 处理闪烁任务
  54. void processBlinkTasks() {
  55. if (!isBlinking && !blinkQueue.empty() && !isConstantOn) {
  56. // 如果没有正在执行的任务且队列不为空,且 LED 不常亮,开始执行下一个任务
  57. BlinkTask currentTask = blinkQueue.front();
  58. blinkQueue.pop();
  59. remainingBlinks = currentTask.blinkCount * 2; // 每次闪烁包括亮和灭
  60. currentBlinkCount = currentTask.blinkCount; // 记录当前任务的闪烁次数
  61. blinkStartTime = millis(); // 记录任务开始时间
  62. isBlinking = true;
  63. //Serial.println("[信息] 开始执行闪烁任务,闪烁次数: " + String(currentTask.blinkCount));
  64. }
  65. }
  66. // 控制 LED 闪烁
  67. void blinkLED() {
  68. if (isConstantOn) {
  69. // 如果 LED 需要常亮,直接返回
  70. return;
  71. }
  72. unsigned long currentTime = millis();
  73. if (isBlinking) {
  74. // 计算每个闪烁周期的时间
  75. unsigned long blinkDuration = 1000 / currentBlinkCount; // 每个闪烁周期的总时间(亮 + 灭)
  76. unsigned long halfBlinkDuration = blinkDuration / 2; // 亮或灭的时间
  77. // 计算当前闪烁周期
  78. unsigned long elapsedTime = currentTime - blinkStartTime;
  79. int currentCycle = elapsedTime / blinkDuration;
  80. if (currentCycle < currentBlinkCount) {
  81. // 控制 LED 状态
  82. if (elapsedTime % blinkDuration < halfBlinkDuration) {
  83. analogWrite(LED_PIN, pwmBrightness); // 使用 PWM 控制亮度
  84. } else {
  85. analogWrite(LED_PIN, 0); // 关闭 LED
  86. }
  87. } else {
  88. // 当前任务完成
  89. analogWrite(LED_PIN, 0); // 确保 LED 关闭
  90. isBlinking = false;
  91. //Serial.println("[信息] 闪烁任务完成");
  92. }
  93. }
  94. // 处理下一个任务
  95. processBlinkTasks();
  96. }