Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino功能将RGB从一种颜色淡入下一种颜色_Arduino_Rgb_Led_Lifx - Fatal编程技术网

Arduino功能将RGB从一种颜色淡入下一种颜色

Arduino功能将RGB从一种颜色淡入下一种颜色,arduino,rgb,led,lifx,Arduino,Rgb,Led,Lifx,对于我的Arduino项目,我有一个72个LED 我可以成功地更改任何LED的颜色(目前我仅将第一个设置为0以进行测试),因此我知道这里的布线不是问题,而是我的编码问题 我想做的是能够选择一种颜色,然后选择另一种颜色,并将第一种颜色淡入下一种颜色,以此类推(很像使用iPhone应用程序时LIFX灯泡的行为) 这就是我目前的情况: 我正在记录所有变量的输出,以指示发生了什么。我不能百分之百确定我错在哪里,或者是否有更简单的方法来做我想要的事情(我愿意接受建议) 该函数采用名为command的参数,

对于我的Arduino项目,我有一个72个LED

我可以成功地更改任何LED的颜色(目前我仅将第一个设置为0以进行测试),因此我知道这里的布线不是问题,而是我的编码问题

我想做的是能够选择一种颜色,然后选择另一种颜色,并将第一种颜色淡入下一种颜色,以此类推(很像使用iPhone应用程序时LIFX灯泡的行为)

这就是我目前的情况:

我正在记录所有变量的输出,以指示发生了什么。我不能百分之百确定我错在哪里,或者是否有更简单的方法来做我想要的事情(我愿意接受建议)

该函数采用名为
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()
。您还可以使用Arduino
delay()
函数替换它

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()
。您还可以使用Arduino
delay()
函数替换它

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;//之前为红色