LED 呼吸灯(Breathing LED) 是一种模拟呼吸效果的灯光,它的亮度随着时间缓慢地 渐亮渐暗,形成类似呼吸的效果。相比传统的 流水灯(亮灭状态切换),呼吸灯的变化更加平滑和自然,常用于电子产品的状态指示(如 MacBook 休眠指示灯)

1.呼吸灯基本原理

呼吸灯的核心原理是 PWM(脉宽调制,Pulse Width Modulation):

通过改变占空比(duty cycle)控制 LED 的亮度

占空比:高电平占一个周期信号的比例

占空比增大 → LED 亮度增加(渐亮)

占空比减小 → LED 亮度减少(渐暗)

ESP32中有16个PWM通道,分别对应编号0-15

 2.单个呼吸灯代码展示

#include <Arduino.h>

#define d1 18

void init_port(){
  ledcSetup(0,1000,10);
  ledcAttachPin(d1,0);
}
void breathing_led(){
  for(int i=0;i<1024;i++){
    ledcWrite(0,i);
    delay(1);
  }
  for(int i=0;i<1024;i++){
    ledcWrite(0,1023-i);
    delay(1);
  }
}
void setup(){
  init_port();
}
void loop(){
  breathing_led();
}

3.代码解析 

init_port():初始化PWM通道

ledcSetup(0,1000,10):

        0:设置PWM通道0(0-15均可)

        1000:频率1000Hz(1s有1000个周期的PWM信号)

        10:分辨率10bit(亮度级别0-1023,每个周期的PWM信号分成1023等分,由此设置占空比)

ledcAttachPin(d1,0):

        将引脚d1(即GPIO18)绑定到PWM0通道

breathing_led():呼吸灯效果

第一个for循环:led逐渐变亮

        ledcWrite(0,i):控制PWM占空比,从而控制led亮度

        delay(1):控制渐变速度

第二个for循环:led逐渐变暗

        占空比由大到小即可

3.延伸思考

本例子是实现单个的呼吸灯效果,结合上讲的LED流水灯,思考一下:怎样实现四个“流水呼吸灯”,即四个灯按顺序“呼吸”?

4.延伸思考代码展示

#include <Arduino.h>

int pin[4]={14,16,17,18};

void init_port(){
  for(int i=0;i<4;i=i+1){
    ledcSetup(i,1000,10);
    ledcAttachPin(pin[i],i);
  }
}
void breathing_led(){
  int i,j;
  for(j=0;j<4;j=j+1){
    for(i=0;i<1024;i=i+1){
    ledcWrite(j,i);
    delay(1);
    }
    for(i=0;i<1024;i=i+1){
      ledcWrite(j,1023-i);
      delay(1);
    }
  } 
}
void setup() {
  init_port();
}

void loop() {
  breathing_led();
}

使用两层for循环,外层for循环用于遍历四个led,实现流水灯,内层循环实现呼吸灯

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐