-1

我正在使用 Arduino 和 FastLED 库控制一条 LED,并且我设置了一些功能,可以让我更改 LED 等的颜色。

我有一个函数,其中传入了红色、绿色和蓝色的值,并将整个条带设置为该颜色:

void changeColour(int valR, int valG, int valB) {
  for (int i = 0; i < NUM_LEDS; i++) {
        led[i] = CRGB(valR, valG, valB);
      }
      FastLED.setBrightness(255);
      FastLED.show(); 
}

然后,我设置了一个包含预设颜色及其对应 RGB 值的二维数组:

int colours [20][3] = {
  {255, 105, 180}, //HotPink
  {255, 20, 147}, //DeepPink
  {139, 0, 0}, //DarkRed
  {255, 0, 0}, //Red
  {255, 69, 0}, //OrangeRed
  {255, 255, 0}, //Yellow
  {128, 0, 0}, //Maroon
  {50, 205, 50}, //LimeGreen
  {0, 255, 0}, //Lime
  {34, 139, 32}, //ForestGreen
  {0, 128, 0}, //Green
  {0, 100, 0}, //DarkGreen
  {102, 205, 170}, //MediumAquaMarine
  {0, 255, 255}, //Aqua
  {0, 139, 139}, //DarkCyan
  {0, 191, 255}, //DeepSkyBlue
  {0, 0, 255}, //Blue
  {128, 0, 128} //Purple
};

我想做的是调用changeColour();函数并从数组中传入随机颜色的 RGB 值,所以我编写了该函数:

int randomColour(); {
  int x = rand() % 18;
  int valR = colours[x][0];
  int valG = colours[x][1];
  int valB = colours[x][2];
  return (valR, valG, valB);
}

我将如何获得它以便我可以调用该changeColour()函数,而不是changeColour(valR, valG, valB)调用该randomColour()函数,该函数又返回valR, valGandvalB值,从而将它们传递给changeColour()函数?

4

3 回答 3

0

你的第一个问题是randomColour返回一个int,只是一个不是 3。

(valR, valG, valB)这使用逗号运算符,它按顺序计算所有操作数(在这种情况下,这是一个 nop),整个表达式计算为最后一个操作数,即valbB您要返回的内容。

最简单和最合适的是为 RGB 颜色创建一个结构:

struct Rgb
{
    int r;
    int g;
    int b;
};

void changeColour(Rgb color) {
  for (int i = 0; i < NUM_LEDS; i++) {
        led[i] = CRGB(color.r, color.g, color.b);
      }
      FastLED.setBrightness(255);
      FastLED.show(); 
}

Rgb colours [20] = { /* ... */ };

Rgb randomColour() {
    int x = rand() % 18;
    return colours[x];
}

你想要的功能就这么简单:

void changeToRandomColor()
{
    changeColour(randomColour());
}

我还必须指出 Arduino lib 有它自己的随机函数:https ://www.arduino.cc/reference/en/language/functions/random-numbers/random/我建议你考虑一下。

于 2019-09-01T20:55:18.283 回答
0

C ++ 11 及更高版本具有您可以使用的元组,但您也有其他选项可以做到这一点..

1:您可以返回一个包含 rgb 值的结构并从 randomColor() 中返回它。

2:更改 randomColor() 以接受输出参数.. 参考。

void randomColor(int &r, int &g, int &b) {
    int x = rand() % 18;
    r = colours[x][0];
    g = colours[x][1];
    b = colours[x][2];
}

void changeColor() {
   int r, g, b;
   randomColor(r, g, b);
   std::cout << r << " " << g << "  " << b << std::endl;
}

3:颜色的最大值是 255。所以你可以简单地使用一个 4 字节的整数来填充这三个值,然后使用位操作将它们解包。像这样的东西。

unsigned int randomColor() {
    unsigned int r = 11;
    unsigned int g = 22;
    unsigned int b = 33;
    return r << 16 | g << 8 | b;
}

void change_color() {
    unsigned int rgb = randomColor();
    unsigned int b = rgb & 0xFF;
    unsigned int g = (rgb >> 8) & 0xFF;
    unsigned int r = (rgb >> 16) & 0xFF;
}

返回一个结构是最简单和最干净的解决方案。

于 2019-09-01T21:01:21.320 回答
0

您不能从 C++ 中的函数返回多个值(那么容易)。您的randomColour函数实际上只返回一个值,valB,因为它是表达式中的最后一个值(valR, valG, valB)

一个简单的方法来做你所要求的将randomColour返回一个指向colours数组的指针,然后重载或更改changeColour为接受int数组。因此,不要在该函数内部使用valR, valG, ,而是使用,等。valBcolorReference[0]colorReference[1]

于 2019-09-01T20:15:55.763 回答