【Arduino学习】03.RGB呼吸灯

本实验教程介绍如何通过Arduino UNO和PWM技术控制共阳RGBLED显示不同颜色。通过调整红色、绿色和蓝色通道的亮度(0到255),可以混合出1600多万种颜色。实验中详细说明了硬件连接、软件代码和颜色变化的实现过程。

本课程中,将使用 PWM 来控制 RGB LED灯并使其显示不同的颜色。变色灯是由红(R)、绿(G)、蓝(B)三基色 LED 组成的。双色 LED 是我们十分熟悉的。一般由红光 LED 及绿光 LED 组成。它可以单独发出红光或绿光。若红光及绿光同时亮点时,红绿两种光混合成橙黄色。RGB 分为共阴和共阳两种,长引脚是公共端,其他引脚如下:

硬件连接:

Keywish Arduino UNO R3 主板
面包板
USB 数据线
1个共阳 RGB LED
3个电阻 (220Ω)
若干跳线

实验原理:
RGB 代表红色,绿色和蓝色通道,是行业颜色标准。RGB 通过改变三个通道并叠加它们来显示各种新颜色,根据统计,它可以创建 16777216 种不同的颜色。如果你说显示的颜色与自然颜色不完全匹配,那么它几乎无法用肉眼区分 。红色,绿色和蓝色的三个颜色通道中的每一个具有 255 级亮度。 当三原色全部为 0时,“LED灯”最暗,即关闭。当三原色全部为 255 时,“LED灯”是最亮的。当叠加三原色发出的光时,颜色将混合。但是,亮度等于所有亮度的总和,混合得越多,LED就越亮。 该过程称为添加剂混合。在这个实验中,我们也将使用 PWM,如果你已经学过目前的课程,你肯定已经有了基本的了解。在这里,我们在 RGB LED的三个引脚之间输入 0到 255 之间的值,使其显示不同的颜色。

接线:

Arduino UnoRGB
IO口111 阴极R
IO口103 阴极G
IO口94 阴极B
5V2 共阳极

软件代码:

#define RGB_RED    11
#define RGB_GREEN  10
#define RGB_BLUE   9

void setup()
{
    pinMode(RGB_RED,OUTPUT);
    pinMode(RGB_GREEN,OUTPUT);
    pinMode(RGB_BLUE,OUTPUT);
}

void setColor(int red,int green,int blue)
{
    analogWrite(RGB_RED,red);
    analogWrite(RGB_GREEN,green);
    analogWrite(RGB_BLUE,blue);
}

void loop()
{
    int i;
    for(i=0;i<256;i++)
    {
        setColor(i,0,0);
        delay(4);
    }
    delay(500);           //turn the RGB LED red smoth

    for(i=0;i<256;i++)
    {
        setColor(0,i,0);
        delay(4);
    }
    delay(500);           //turn the RGB LED green smoth
  
    for(i=0;i<256;i++)
    {
        setColor(0,0,i);
        delay(4);
    }
    delay(100);           //turn the RGB LED blue smoth
}

实验连接图:
在这里插入图片描述

### 实现呼吸效果的RGB代码 为了实现基于Arduino RP2040的呼吸效果RGB,可以采用PWM信号来调节RGB LED的颜色和亮度。以下是详细的说明以及示例代码。 #### PWM与呼吸原理 呼吸的效果是通过逐渐改变LED的亮度来模拟人类呼吸的过程。这种变化通常遵循正弦波或其他平滑曲线的形式[^1]。对于RGB来说,可以通过分别调整红、绿、蓝三种颜色通道的占空比,从而实现多种颜色的变化并保持平滑过渡。 #### 示例代码 以下是一个完整的Arduino代码示例,展示如何使用RP2040板子创建带有呼吸效果的RGB: ```cpp // 定义RGB引脚 #define RED_PIN 16 #define GREEN_PIN 17 #define BLUE_PIN 18 void setup() { // 设置RGB引脚为输出模式 pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); // 可选:初始化串口调试(如果需要) Serial.begin(115200); } void loop() { breatheEffect(RED_PIN); // 对红色通道应用呼吸效果 delay(500); // 短暂延迟以便观察效果 breatheEffect(GREEN_PIN); // 对绿色通道应用呼吸效果 delay(500); breatheEffect(BLUE_PIN); // 对蓝色通道应用呼吸效果 delay(500); } // 呼吸效果函数 void breatheEffect(int pin) { int brightness; // 当前亮度值 for (brightness = 0; brightness <= 255; brightness++) { analogWrite(pin, brightness); // 提高亮度 delay(10); // 控制速度 } for (brightness = 255; brightness >= 0; brightness--) { analogWrite(pin, brightness); // 减少亮度 delay(10); // 控制速度 } } ``` 此代码定义了一个`breatheEffect()`函数,该函数接受一个指定的引脚作为参数,并逐步增加和减少其亮度以模仿呼吸过程[^2]。这里假设使用的RGB LED模块支持常见的PWM控制方式。 #### 关于映射功能的应用 在实际项目中,有时还需要结合外部传感器输入的数据动态调整光效果。例如,可以用电位器或者光敏电阻等设备采集环境中的某种变量,再经过适当的比例转换后作用于LED亮度上。这涉及到之前提到过的映射操作——即将原始读数范围重新分配至目标区间内[^1]。 #### 注意事项 - **硬件连接**: 确认所选用的GPIO端口号匹配开发板的实际物理布局。 - **电流限制**: 如果直接驱动大功率LED,则需考虑加入限流电阻以防损坏元件。 - **性能优化**: 调整`delay()`的时间长度可以获得不同的视觉体验;但过短可能会造成闪烁现象而影响观感质量。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值