неожиданное поведение переменных arduino fastLED ws2812b

У меня есть arduino, использующий fastLED с полосой из 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 для управления светом и внешним источником питания.


person user2636043    schedule 19.02.2017    source источник


Ответы (1)


Примечание. убедитесь, что Arduino IDE настроена на печать всех предупреждений.


Ваш код вызывает неопределенное поведение.

Эта строка:

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

приводит к массиву из одного элемента, инициализированного значением bottom * WRAP_NUM, независимо от значения bottom. Я замечаю это, потому что это могло быть, а могло и не быть тем, что вы хотели.

Вот твоя проблема:

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

sizeof(heart) возвращает количество байтов вашего массива, которое равно 2, потому что это размер int на Arduino. Как следствие, в инструкции тела цикла

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.
  • Убедитесь, что проводка правильная.
person Patrick Trentin    schedule 19.02.2017