Arduino功能将RGB从一种颜色淡入下一种颜色
对于我的Arduino项目,我有一个72个LED 我可以成功地更改任何LED的颜色(目前我仅将第一个设置为0以进行测试),因此我知道这里的布线不是问题,而是我的编码问题 我想做的是能够选择一种颜色,然后选择另一种颜色,并将第一种颜色淡入下一种颜色,以此类推(很像使用iPhone应用程序时LIFX灯泡的行为) 这就是我目前的情况: 我正在记录所有变量的输出,以指示发生了什么。我不能百分之百确定我错在哪里,或者是否有更简单的方法来做我想要的事情(我愿意接受建议) 该函数采用名为Arduino功能将RGB从一种颜色淡入下一种颜色,arduino,rgb,led,lifx,Arduino,Rgb,Led,Lifx,对于我的Arduino项目,我有一个72个LED 我可以成功地更改任何LED的颜色(目前我仅将第一个设置为0以进行测试),因此我知道这里的布线不是问题,而是我的编码问题 我想做的是能够选择一种颜色,然后选择另一种颜色,并将第一种颜色淡入下一种颜色,以此类推(很像使用iPhone应用程序时LIFX灯泡的行为) 这就是我目前的情况: 我正在记录所有变量的输出,以指示发生了什么。我不能百分之百确定我错在哪里,或者是否有更简单的方法来做我想要的事情(我愿意接受建议) 该函数采用名为command的参数,
command
的参数,该参数是由逗号分隔的字符串:
e、 g.255,0,0
(红色)或0255,0
(绿色)
下面是输出直接选择绿色:
Rstart 255, Gstart 0, Bstart 0
Rnew 253, Gnew 0, Bnew 0
Rend 0, Gend 255, Bend 0
Rnew 2, Gnew 253, Bnew 0
然后,输出然后选择蓝色:
Rstart 0, Gstart 255, Bstart 0
Rnew 2, Gnew 253, Bnew 0
Rend 0, Gend 23, Bend 255
Rnew 0, Gnew 25, Bnew 253
我认为你的代码还不错,你只需要延迟。因为你的
for
循环太快了,你不会注意到衰落
从a开始,这里是一个c++/pseudocode
示例,用于使led在rgb颜色之间褪色
可以对其进行修改以非常轻松地使用您的库。Serial.print()。请注意,在每个循环迭代结束时,waitMS()
。您还可以使用Arduinodelay()
函数替换它
void fade(uint16_t duration, Color startColor, Color endColor) {
int16_t redDiff = endColor.getR() - startColor.getR();
int16_t greenDiff = endColor.getG() - startColor.getG();
int16_t blueDiff = endColor.getB() - startColor.getB();
int16_t delay = 20;
int16_t steps = duration / delay;
int16_t redValue, greenValue, blueValue;
for (int16_t i = 0 ; i < steps - 1 ; ++i) {
redValue = (int16_t)startColor.getR() + (redDiff * i / steps);
greenValue = (int16_t)startColor.getG() + (greenDiff * i / steps);
blueValue = (int16_t)startColor.getB() + (blueDiff * i / steps);
Serial.print(redValue);
Serial.print("\t");
Serial.print(greenValue);
Serial.print("\t");
Serial.print(blueValue);
Serial.println("\t");
led.shine(redValue, greenValue, blueValue);
waitMs(delay);
}
led.shine(endColor);
}
void fade(uint16\t持续时间、颜色起始颜色、颜色结束颜色){
int16_t redDiff=endColor.getR()-startColor.getR();
int16_t greenDiff=endColor.getG()-startColor.getG();
int16_t blueDiff=endColor.getB()-startColor.getB();
int16_t延迟=20;
int16_t steps=持续时间/延迟;
int16_t红色值、绿色值、蓝色值;
对于(int16_t i=0;i<步骤-1;++i){
redValue=(int16_t)startColor.getR()+(redDiff*i/steps);
greenValue=(int16_t)startColor.getG()+(greenDiff*i/steps);
blueValue=(int16_t)startColor.getB()+(blueDiff*i/steps);
串行打印(redValue);
串行打印(“\t”);
连续打印(绿色值);
串行打印(“\t”);
连续打印(blueValue);
Serial.println(“\t”);
发光二极管发光(红值、绿值、蓝值);
waitMs(延迟);
}
发光二极管。发光(endColor);
}
希望这有帮助:)
编辑:
以下是指向颜色
和发光二极管
代码的链接:
我认为您的代码没有那么糟糕,您只需要延迟。因为你的for
循环太快了,你不会注意到衰落
从a开始,这里是一个c++/pseudocode
示例,用于使led在rgb颜色之间褪色
可以对其进行修改以非常轻松地使用您的库。Serial.print()。请注意,在每个循环迭代结束时,waitMS()
。您还可以使用Arduinodelay()
函数替换它
void fade(uint16_t duration, Color startColor, Color endColor) {
int16_t redDiff = endColor.getR() - startColor.getR();
int16_t greenDiff = endColor.getG() - startColor.getG();
int16_t blueDiff = endColor.getB() - startColor.getB();
int16_t delay = 20;
int16_t steps = duration / delay;
int16_t redValue, greenValue, blueValue;
for (int16_t i = 0 ; i < steps - 1 ; ++i) {
redValue = (int16_t)startColor.getR() + (redDiff * i / steps);
greenValue = (int16_t)startColor.getG() + (greenDiff * i / steps);
blueValue = (int16_t)startColor.getB() + (blueDiff * i / steps);
Serial.print(redValue);
Serial.print("\t");
Serial.print(greenValue);
Serial.print("\t");
Serial.print(blueValue);
Serial.println("\t");
led.shine(redValue, greenValue, blueValue);
waitMs(delay);
}
led.shine(endColor);
}
void fade(uint16\t持续时间、颜色起始颜色、颜色结束颜色){
int16_t redDiff=endColor.getR()-startColor.getR();
int16_t greenDiff=endColor.getG()-startColor.getG();
int16_t blueDiff=endColor.getB()-startColor.getB();
int16_t延迟=20;
int16_t steps=持续时间/延迟;
int16_t红色值、绿色值、蓝色值;
对于(int16_t i=0;i<步骤-1;++i){
redValue=(int16_t)startColor.getR()+(redDiff*i/steps);
greenValue=(int16_t)startColor.getG()+(greenDiff*i/steps);
blueValue=(int16_t)startColor.getB()+(blueDiff*i/steps);
串行打印(redValue);
串行打印(“\t”);
连续打印(绿色值);
串行打印(“\t”);
连续打印(blueValue);
Serial.println(“\t”);
发光二极管发光(红值、绿值、蓝值);
waitMs(延迟);
}
发光二极管。发光(endColor);
}
希望这有帮助:)
编辑:
以下是指向颜色
和发光二极管
代码的链接:
我已经研究同一个问题好几天了。我对arduino和编码相当陌生,所以我的代码可能有点简单,但就目前而言,这似乎是可行的
我在用FastLED图书馆
#include "FastLED.h"
#define NUM_LEDS 15
#define DATA_PIN 6
CRGB leds[NUM_LEDS];
int fade = 2; //minutes
byte cred; //current red
byte cgreen;
byte cblue;
byte targetred; //red after fade
byte targetgreen;
byte targetblue;
byte oldred; //red before fade
byte oldgreen;
byte oldblue;
byte deltared; //difference before and after fade
byte deltagreen;
byte deltablue;
unsigned long start;
unsigned long current;
unsigned long whole;
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
cred = 0; cblue = 0; cgreen = 0;
oldred = 0; oldblue = 0; oldgreen = 0;
update();
start = millis();
}
void loop() {
targetred = 20;
targetgreen = 220;
targetblue = 130;
deltared = targetred - oldred; deltagreen = targetgreen - oldgreen; deltablue = targetblue - oldblue;
whole = fade * 60000 + start; //fade time in milliseconds
if (cred <= targetred && millis() <= whole){
current = millis();
cred = current * deltared / whole;
cred = cred + oldred;}
if (cgreen <= targetgreen && millis() <= whole){
current = millis();
cgreen = current * deltagreen / whole;
cgreen = cgreen + oldgreen;}
if (cblue <= targetblue && millis() <= whole){
current = millis();
cblue = current * deltablue / whole;
cblue = cblue + oldblue;}
update();
}
void update(){
for (int i = 0; i <= NUM_LEDS; i++){
leds[i] = CRGB (cred, cgreen, cblue);
FastLED.show();
}};
#包括“FastLED.h”
#定义数量15
#定义数据_引脚6
CRGB发光二极管[NUM_发光二极管];
int-fade=2//会议记录
字节cred//当前红色
字节cgreen;
字节cblue;
以字节为目标//褪色后变红
字节targetgreen;
字节targetblue;
字节oldred//褪色前先红
绿色字节;
蓝色字节;
字节延迟//褪色前后的差异
字节deltagreen;
字节可删除;
无符号长启动;
无符号长电流;
无符号长整型;
无效设置(){
快速发光。添加发光二极管(发光二极管,数量发光二极管);
cred=0;cblue=0;cgreen=0;
oldred=0;oldblue=0;oldgreen=0;
更新();
开始=毫秒();
}
void循环(){
targeted=20;
targetgreen=220;
targetblue=130;
deltared=targeted-oldred;deltagreen=targetgreen-oldgreen;deltablue=targetblue-oldblue;
整体=衰减*60000+开始;//衰减时间(毫秒)
if(cred我已经研究同一个问题好几天了。我对arduino和编码相当陌生,所以我的代码可能有点简单,但就目前而言,这似乎是可行的
我在用FastLED图书馆
#include "FastLED.h"
#define NUM_LEDS 15
#define DATA_PIN 6
CRGB leds[NUM_LEDS];
int fade = 2; //minutes
byte cred; //current red
byte cgreen;
byte cblue;
byte targetred; //red after fade
byte targetgreen;
byte targetblue;
byte oldred; //red before fade
byte oldgreen;
byte oldblue;
byte deltared; //difference before and after fade
byte deltagreen;
byte deltablue;
unsigned long start;
unsigned long current;
unsigned long whole;
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
cred = 0; cblue = 0; cgreen = 0;
oldred = 0; oldblue = 0; oldgreen = 0;
update();
start = millis();
}
void loop() {
targetred = 20;
targetgreen = 220;
targetblue = 130;
deltared = targetred - oldred; deltagreen = targetgreen - oldgreen; deltablue = targetblue - oldblue;
whole = fade * 60000 + start; //fade time in milliseconds
if (cred <= targetred && millis() <= whole){
current = millis();
cred = current * deltared / whole;
cred = cred + oldred;}
if (cgreen <= targetgreen && millis() <= whole){
current = millis();
cgreen = current * deltagreen / whole;
cgreen = cgreen + oldgreen;}
if (cblue <= targetblue && millis() <= whole){
current = millis();
cblue = current * deltablue / whole;
cblue = cblue + oldblue;}
update();
}
void update(){
for (int i = 0; i <= NUM_LEDS; i++){
leds[i] = CRGB (cred, cgreen, cblue);
FastLED.show();
}};
#包括“FastLED.h”
#定义数量15
#定义数据_引脚6
CRGB发光二极管[NUM_发光二极管];
int fade=2;//分钟
字节cred;//当前红色
字节cgreen;
字节cblue;
字节targeted;//淡入淡出后为红色
字节targetgreen;
字节targetblue;
字节oldred;//之前为红色