意外变量行为arduino fastLED ws2812b

时间:2017-02-19 06:40:08

标签: c++ arduino

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

#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来控制灯光和外部电源为它们供电。

1 个答案:

答案 0 :(得分:1)

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

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

这一行:

hi

会生成一个一个元素数组,其值为static int heart[]={bottom*WRAP_NUM}; ,与bottom * WRAP_NUM的值无关。 我之所以这样说是因为这可能是你想要的,也可能不是。

这是你的问题:

bottom

for(int i=0; i < sizeof(heart); i++) 返回数组的字节的数量,即sizeof(heart),因为它是 Arduino上2的大小。因此,在循环体的指令

int

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作为RGB
  • 验证接线是否正确