我有一个使用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来控制灯光和外部电源为它们供电。
答案 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
。