Skip to content

Arduino - 渐变 LED

Arduino - 使用PWM实现LED呼吸灯效果

Section titled “Arduino - 使用PWM实现LED呼吸灯效果”

除了简单地开关LED之外,Arduino还可以控制其亮度。本例演示了如何使用 analogWrite() 函数和一种称为脉冲宽度调制 (PWM) 的技术来创建平滑的渐变效果。这是创建更具动态和表现力输出的基本技能。

微控制器的数字引脚是二进制的;它们只能完全处于开启或完全处于关闭状态。那么我们如何创建中间亮度级别呢?答案就是PWM。想象一下以极快的速度反复开关一个电灯开关。如果您让它开启一半时间,关闭另一半时间,那么灯光看起来就会是50%的亮度。这就是PWM的精髓。

analogWrite(pin, value) 函数为您完成了这项工作。value 可以是 0(始终关闭)到 255(始终开启)之间的任何整数。值为 127 将对应于50%的占空比 (duty cycle)(一半时间开启),使LED看起来是半亮度。

重要提示: 并非所有Arduino上的数字引脚都支持PWM。在大多数开发板(如Uno)上,支持PWM的引脚会标有波浪线符号 (~),例如 ~3、~5、~6、~9、~10 和 ~11。

  • 1 × 面包板 (Breadboard)
  • 1 × Arduino Uno R3
  • 1 × LED (任意颜色)
  • 1 × 220Ω或330Ω电阻
  • 2 × 杜邦线 (Jumper Wires)

电路与基本的“Blink”草图几乎相同,但LED必须连接到PWM引脚。

  1. 将LED的长引脚(阳极,正极)连接到电阻的一端。
  2. 将电阻的另一端连接到Arduino上支持PWM的引脚,例如引脚~9。
  3. 将LED的短引脚(阴极,负极)连接到Arduino的 GND 引脚。

电阻是限制流过LED电流并防止其烧坏的关键。

在Arduino IDE中打开一个新的草图 (sketch) 并输入以下代码。此版本使用两个 for 循环,这使得渐亮和渐暗的逻辑非常清晰。

/**
* @file led_fade_clean.ino
* @brief 使用PWM和清晰的for循环演示LED的渐亮和渐暗效果。
*/
// --- 常量 ---
// 使用支持PWM的引脚(板上标有~)
const int LED_PIN = 9;
// 一个小延迟,用于控制渐变速度
const int FADE_DELAY = 10; // 单位:毫秒
void setup() {
// 将LED引脚声明为输出。即使使用analogWrite()也需要这样做。
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// --- 渐亮 ---
// 从0循环到255(最小亮度到最大亮度)
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness);
delay(FADE_DELAY);
}
// --- 渐暗 ---
// 从255循环到0(最大亮度到最小亮度)
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness);
delay(FADE_DELAY);
}
}
  • const int LED_PIN = 9;: 我们将LED引脚定义为一个常量,以使代码清晰且易于修改。
  • pinMode(LED_PIN, OUTPUT);: 即使我们使用analogWrite(),仍然需要在setup()函数中将引脚配置为OUTPUT。
  • 渐亮for循环: 这个循环将brightness变量从0开始,每次迭代增加1(brightness++)。它将LED的亮度设置为这个新值,然后短暂暂停。它会一直持续到brightness达到255。
  • 渐暗for循环: 这个循环执行相反的操作,从255开始,每次迭代减小亮度(brightness--),直到达到0。
  • delay(FADE_DELAY);: 这个小延迟使得渐变效果对人眼可见。尝试改变它的值!更小的延迟会使渐变更快,而更大的延迟会使其变慢。
  • LED亮着但不渐变: 您可能将LED连接到了非PWM引脚。请确保您使用的是带有 ~ 符号的引脚,并且该引脚号与代码中的 LED_PIN 常量匹配。
  • LED根本不亮: 检查LED的极性。长引脚必须连接到Arduino引脚(通过电阻),短引脚连接到GND。另外,请确保电阻和导线牢固地插在面包板上。
  • LED非常暗: 您可能使用了阻值过高的电阻(例如10kΩ)。对于大多数标准LED和5V Arduino,220Ω到330Ω之间的电阻是理想的。

既然您已经掌握了渐变效果,尝试一个更高级的项目:

迷你项目:RGB氛围灯。 获取一个RGB LED(它就像一个封装了红、绿、蓝三种LED的组件)。将其三个颜色引脚分别连接到Arduino上不同的PWM引脚。编写一个草图,通过独立改变红色、绿色和蓝色组件的亮度来实现在不同颜色之间渐变。这是实现数百万种颜色和效果的基础!