ws2812呼吸灯,fastled函数循环实现7种颜色的呼吸灯,比如全部灯从红色过渡到蓝色,蓝色过渡到绿色,循环七种颜色
时间: 2023-06-13 10:06:18 浏览: 394
好的,下面是实现这个功能的代码:
```C++
#include <FastLED.h>
#define LED_PIN 2
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i < 7; i++) {
breathe(leds, CHSV(i * 39, 255, 255), CHSV((i + 1) * 39, 255, 255));
}
}
void breathe(CRGB leds[], CHSV from, CHSV to) {
for (int j = 0; j < 256; j++) {
CHSV color = interpolateColor(from, to, j);
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
FastLED.show();
delay(10);
}
}
CHSV interpolateColor(CHSV from, CHSV to, int step) {
byte hue = map(step, 0, 255, from.hue, to.hue);
byte saturation = map(step, 0, 255, from.sat, to.sat);
byte value = map(step, 0, 255, from.val, to.val);
return CHSV(hue, saturation, value);
}
```
在上面的代码中,我们使用了 `FastLED` 库来控制 WS2812 LED 灯带。我们定义了灯带的引脚和 LED 灯的数量,然后在 `setup()` 函数中初始化灯带。在 `loop()` 函数中,我们循环七种颜色,每种颜色都使用 `breathe()` 函数实现呼吸灯效果。
`breathe()` 函数接收两个颜色 `from` 和 `to`,然后使用 `interpolateColor()` 函数在这两个颜色之间进行插值,得到每个步骤的颜色值。然后我们将这个颜色值设置到所有的 LED 灯上,并使用 `FastLED.show()` 函数更新灯带。最后,我们延迟一段时间,以便看到呼吸灯效果。
`interpolateColor()` 函数接收三个参数:起始颜色 `from`、目标颜色 `to` 和当前步骤的值 `step`。它使用 `map()` 函数将 `step` 值从 0 到 255 映射到起始颜色和目标颜色的范围内,然后返回一个插值后的颜色值。
在这个例子中,我们使用了 `CHSV` 类型来表示颜色,它包含 hue、saturation 和 value 三个分量。我们通过改变 hue 分量的值来实现颜色的渐变。
阅读全文