gpt4 book ai didi

c++ - 意外的变量行为arduino fastLED ws2812b

转载 作者:行者123 更新时间:2023-11-30 05:17:03 26 4
gpt4 key购买 nike

我有一个使用带 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;

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

为什么开错灯了?

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

最佳答案

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


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

这一行:

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

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

这是你的问题:

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

sizeof(heart) 返回数组的 bytes 数,即 2 因为这是 的大小Arduino 上的 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 作为 COLOR_ORDER.
  • 验证接线是否正确

关于c++ - 意外的变量行为arduino fastLED ws2812b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com