1

我有一个使用带有 600 个 ws2812b 灯条的 fastLED 的 arduino。我正在运行以下代码:

#include "FastLED.h"
#define DATA_PIN    5       // change to your data pin
#define COLOR_ORDER GRB      // if colors are mismatched; change this
#define NUM_LEDS    600       // change to the number of LEDs in your strip
#define BRIGHTNESS 32
#define WRAP_NUM 55
#define LED_TYPE    WS2812B

CRGB leds[NUM_LEDS];
int startIndex=0;
int bottom=1;

void setup()
{
  delay(3000);

  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
}

void loop()
{
    shapeTwirl();
}

void shapeTwirl()
{
    FastLED.clear();

    static int heart[]={bottom*WRAP_NUM};
    for(int i=0;i<sizeof(heart);i++)
    {
        leds[(heart[i]+startIndex)]=CRGB::Red;
    }
    FastLED.show();
    delay(70);

    startIndex=(startIndex+1)%WRAP_NUM;
}

我的灯围成一个圆圈,这使得一个红点环绕着圆圈。然而,大约 100 光之外的一个蓝点也会旋转。我的代码中没有任何东西可以发出蓝光。我已经追踪到使用

int bottom=1;

如果我用代码中的数字替换底部,我会摆脱蓝点并且它可以正常工作。如果我#define bottom 1;,问题也解决了。我将底部定义在现在的位置还是在 shapeTwirl 中并不重要。这使我相信将变量用于底部有问题,但我尝试使用 int、static int、unsigned int 无济于事。

为什么会打开错误的灯?

我正在使用 arduino uno 来控制灯光和外部电源为它们供电。

4

1 回答 1

1

注意:您应该检查Arduino IDE是否配置为打印所有警告


您的代码调用未定义的行为

这一行:

static int heart[]={bottom*WRAP_NUM};

生成一个由 的值初始化的元素组成的数组,与 的值bottom * WRAP_NUM无关bottom我之所以这么说,是因为这可能是也可能不是您想要的。

这是你的问题:

for(int i=0; i < sizeof(heart); i++)

sizeof(heart)返回数组的字节2数,这是因为这是Arduinoint上的大小。因此,在循环体的指令中

leds[(heart[i]+startIndex)]=CRGB::Red;

heart[i]在第二次循环迭代 ( ) 中访问无效的内存位置i == 1,这意味着其他一些随机位置可能会被您的颜色覆盖。

如果您想知道数组中存储了多少int,则需要将其替换为sizeof(heart) / sizeof(int)

for(int i=0; i < (sizeof(heart) / sizeof(int)); i++)

至于你看到蓝光的原因,我会检查以下几点:

  • 验证这#define COLOR_ORDER GRB确实是您想要的:我怀疑这CRGB::Red需要RGBas COLOR_ORDER
  • 验证接线是否正确
于 2017-02-19T08:45:03.263 回答