在 Arduino 入门实验中,LED 呼吸灯是继 "按键控制 LED 亮灭" 后又一经典案例。它核心利用PWM(脉冲宽度调制) 技术模拟模拟输出,让 LED 灯的亮度从暗到亮、再从亮到暗平滑变化,呈现出如呼吸般的渐变效果。本文将详细拆解呼吸灯的实现原理、代码逻辑,并分享实用的优化技巧。
一、实验核心原理与硬件准备
1. PWM 技术基础
- 什么是 PWM:脉冲宽度调制(Pulse Width Modulation),简单来说就是通过快速切换引脚的高低电平,利用 "占空比"(高电平持续时间占总周期的比例)来模拟不同的电压值。
- Arduino 的 PWM 实现 :Arduino UNO 的数字引脚(标有
~符号,如 3、5、6、9、10、11)支持 PWM 输出,analogWrite()函数可输出 0-255 之间的数值,对应占空比 0%(完全熄灭)到 100%(最亮),从而控制 LED 亮度。 - 呼吸灯逻辑 :通过循环改变
analogWrite()的参数,从 0 递增到 255(亮度渐亮),再从 255 递减到 0(亮度渐暗),配合短延时实现平滑过渡。
开发版中:digital区域的的,带有~的就是PWM(脉冲宽度调制)引脚

2. 硬件清单
- Arduino UNO(或兼容板)
- LED 灯 ×1
- 220Ω 限流电阻 ×1
- 杜邦线若干
- 面包板 ×1
3. 电路连接
| Arduino 引脚 | 元件 | 连接说明 |
|---|---|---|
| 9(~PWM 引脚) | LED 正极 | LED 正极接 9 脚,负极串 220Ω 电阻接 GND |
| GND | 公共地 | 电阻另一端接 GND |
注意:务必使用标有
~的 PWM 引脚,普通数字引脚无法实现亮度渐变,只能控制亮灭。

二、完整代码与逐行解析
arduino
cpp
/*
* Breath
* 通过模拟输出PWM控制LED灯,改变其亮度,达到呼吸效果
*/
// 定义PWM引脚:9号引脚是Arduino UNO的PWM引脚(标有~)
int led = 9;
void setup() {
// 设置LED引脚为输出模式:PWM输出也需要先配置为OUTPUT
pinMode(led, OUTPUT);
}
void loop() {
// 第一阶段:亮度渐亮(从0到255)
for (int i = 0; i <= 255; i++) {
analogWrite(led, i); // 输出PWM值,i越大,LED越亮
delay(1); // 延时1毫秒,控制渐变速度(数值越小,渐变越快)
}
// 第二阶段:亮度渐暗(从255到0)
for (int i = 255; i >= 0; i--) {
analogWrite(led, i); // 输出PWM值,i越小,LED越暗
delay(1); // 保持与渐亮阶段相同的延时,让呼吸节奏均匀
}
}
关键代码解析
-
analogWrite () 函数 :这是实现 PWM 输出的核心函数,语法为
analogWrite(引脚, 数值)。其中:- 引脚:必须是支持 PWM 的引脚(UNO 板为 3、5、6、9、10、11);
- 数值:0-255 的整数,0 对应完全熄灭,255 对应亮度最大。
-
双 for 循环逻辑:
- 第一个
for循环:变量i从 0 递增到 255,PWM 值逐步增大,LED 亮度从暗到亮平滑提升; - 第二个
for循环:变量i从 255 递减到 0,PWM 值逐步减小,LED 亮度从亮到暗平滑降低。
- 第一个
-
delay () 延时的作用 :
delay(1)控制每次亮度变化的间隔时间,数值越小,呼吸节奏越快;数值越大(如 5、10),渐变越缓慢。1 毫秒的延时能让呼吸效果更细腻,肉眼几乎看不到明显的亮度跳变。
三、实验效果与常见问题
1. 预期效果
Arduino 通电后,LED 灯持续循环:从完全熄灭→缓慢变亮→达到最亮→缓慢变暗→回到熄灭,整个过程无明显卡顿,呈现自然的 "呼吸" 效果。
2. 常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| LED 只有亮 / 灭,无渐变 | 选错引脚(非 PWM 引脚) | 更换为标有~的引脚(如 9、10),并修改代码中led变量值 |
| 呼吸节奏过快 / 过慢 | delay () 数值不合适 | 增大delay()值(如 5、10)减慢节奏,减小则加快 |
| LED 亮度最高时过暗 | 限流电阻阻值过大 | 更换 220Ω 电阻(建议范围:180Ω-330Ω) |
| 渐变有明显跳变 | for 循环步长 / 延时不合理 | 保持步长为 1,调整 delay 值至 1-5ms 之间 |
四、进阶优化与拓展
1. 可调呼吸节奏
通过定义变量控制延时,让代码更易调整,比如实现 "慢亮快暗" 的个性化效果:
arduino
cpp
int led = 9;
int brightDelay = 3; // 渐亮延时(毫秒)
int dimDelay = 1; // 渐暗延时(毫秒)
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
// 慢亮
for (int i = 0; i <= 255; i++) {
analogWrite(led, i);
delay(brightDelay);
}
// 快暗
for (int i = 255; i >= 0; i--) {
analogWrite(led, i);
delay(dimDelay);
}
}
2. 多 LED 同步呼吸
只需增加引脚定义和analogWrite()调用,即可实现多个 LED 同步呼吸:
arduino
cpp
int led1 = 9;
int led2 = 10;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(led1, i);
analogWrite(led2, i);
delay(1);
}
for (int i = 255; i >= 0; i--) {
analogWrite(led1, i);
analogWrite(led2, i);
delay(1);
}
}
总结
- LED 呼吸灯的核心是PWM 脉冲宽度调制 ,通过
analogWrite()函数输出 0-255 的数值模拟不同电压,实现亮度渐变; - 双 for 循环分别控制亮度 "渐亮" 和 "渐暗",
delay()延时决定呼吸节奏的快慢; - 务必使用 Arduino 标有
~的 PWM 引脚,普通数字引脚无法实现亮度渐变效果。