2017-02-19 4 views
1

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

Примечание: вы должны проверить, что 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.
  • Проверьте правильность проводки