Arduino 学习-第3课:PWM 实现 LED 呼吸灯效果

在 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); // 保持与渐亮阶段相同的延时,让呼吸节奏均匀
    }
}

关键代码解析

  1. analogWrite () 函数 :这是实现 PWM 输出的核心函数,语法为analogWrite(引脚, 数值)。其中:

    • 引脚:必须是支持 PWM 的引脚(UNO 板为 3、5、6、9、10、11);
    • 数值:0-255 的整数,0 对应完全熄灭,255 对应亮度最大。
  2. 双 for 循环逻辑

    • 第一个for循环:变量i从 0 递增到 255,PWM 值逐步增大,LED 亮度从暗到亮平滑提升;
    • 第二个for循环:变量i从 255 递减到 0,PWM 值逐步减小,LED 亮度从亮到暗平滑降低。
  3. 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);
    }
}

总结

  1. LED 呼吸灯的核心是PWM 脉冲宽度调制 ,通过analogWrite()函数输出 0-255 的数值模拟不同电压,实现亮度渐变;
  2. 双 for 循环分别控制亮度 "渐亮" 和 "渐暗",delay()延时决定呼吸节奏的快慢;
  3. 务必使用 Arduino 标有~的 PWM 引脚,普通数字引脚无法实现亮度渐变效果。
相关推荐
xiaobobo33302 小时前
STM32中HAL库接口函数的共性以及架构思想
stm32·单片机·架构·数据处理器
恶魔泡泡糖2 小时前
51单片机点阵屏应用
单片机·嵌入式硬件·51单片机
南烟斋..2 小时前
ARM Cortex-A7(IMX6ULL)嵌入式裸机开发指南:从点灯到中断
arm开发·单片机·嵌入式硬件
bai5459362 小时前
stm32 CubeIDE DMA模式的串口收发
stm32·单片机·嵌入式硬件
嗯嗯=2 小时前
STM32单片机学习篇7
stm32·单片机·学习
jiang153237942433 小时前
MS51FB9AE 新唐 TSSOP-20
单片机·嵌入式硬件
开开心心就好3 小时前
打印机驱动搜索下载工具,自动识别手动搜
java·linux·开发语言·网络·stm32·物联网·电脑
麒qiqi4 小时前
IMX6ULL 裸机开发进阶:按键驱动(轮询→中断)+ 中断控制器 GIC 实战
单片机·嵌入式硬件
Y1rong4 小时前
STM32之SysTick
stm32·单片机·嵌入式硬件