FastLED + Arduino Leonardo. Проблемы с отображением ленты

phivalnik
Offline
Зарегистрирован: 30.12.2021

Всем привет! Короче говоря, есть 2 ленты на чипе WS2812B, наклеенные по периметру комнаты. Написал алгоритм, который заполняет одним цветом эти 2 ленты по каждой стороне стены, однако он работает как-то криво, и я не понимаю почему. Вот код

#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 210 
// How many leds in little and in big side of the room?
#define litSideNumLeds 96 // +1 because in array element less on 1
#define bigSideNumLeds 114

void setup(){
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<WS2812,DATA_PIN,RGB>(tvSideLeds,NUM_LEDS);
  FastLED.addLeds<WS2812,DATA_PIN1,RGB>(bedSideLeds,NUM_LEDS);
  FastLED.setBrightness(  BRIGHTNESS );
}
 
void loop(){
  for(int i = 0; i < (NUM_LEDS - 96); i++){
    tvSideLeds[i] = CRGB::Green; // fill one wall with led strip
    if(i<96){tvSideLeds[bigSideNumLeds + i] = CRGB::Green; }//fill another wall with led strip 
    static int ist = 0;
    for(int n = (NUM_LEDS-1); n >= 0; n--){ // copy one(tvSideLeds) led strip to antoher(bedSideStrip)
      bedSideLeds[n] = tvSideLeds[ist];
      ist++;
    }
    FastLED.show();
  }
}

, где tvSideLeds - массив первого отрезка ленты, bedSideLeds - массив второго отрезка ленты. А litSideNumLeds и bigSideNumLeds - это длины меньшей и большей стен в дидоах. Вообще я хотел просто зеркалить происходящее на одной ленте на другую ленту. Но в реальности так не получилось. Лента, на которую копирую, заполняется не цветом оригинала, а белым, с периодически увеличиваемой яркостью. Вот.

phivalnik
Offline
Зарегистрирован: 30.12.2021

UPD: Не совсем правильный код был. Вот правильный:

#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 210 
// How many leds in little and in big side of the room?
#define litSideNumLeds 96 // +1 because in array element less on 1
#define bigSideNumLeds 114

#define DATA_PIN 7
#define DATA_PIN1 5
#define BRIGHTNESS  70

CRGB tvSideLeds[NUM_LEDS];
CRGB bedSideLeds[NUM_LEDS];


void setup(){
  delay( 3000 ); // power-up safety delay
  FastLED.addLeds<WS2812,DATA_PIN,RGB>(tvSideLeds,NUM_LEDS);
  FastLED.addLeds<WS2812,DATA_PIN1,RGB>(bedSideLeds,NUM_LEDS);
  FastLED.setBrightness(  BRIGHTNESS );
}
 
void loop(){
  for(int i = 0; i < (NUM_LEDS - 96); i++){
    tvSideLeds[i] = CRGB::Green; // fill one wall with led strip
    if(i<96){tvSideLeds[bigSideNumLeds + i] = CRGB::Green; }//fill another wall with led strip 
    static int ist = 0;
    for(int n = (NUM_LEDS-1); n >= 0; n--){ // copy one(tvSideLeds) led strip to antoher(bedSideStrip)
      bedSideLeds[n] = tvSideLeds[ist];
      ist++;
    }
    FastLED.show();
  }
}
phivalnik
Offline
Зарегистрирован: 30.12.2021

Спасибо всем, я решил свою проблему. Но если кто-то может, объясните почему код выше не работает.

К слову, вот рабочий код:

 for(int i = 0; i < (NUM_LEDS - 96); i++){
    tvSideLeds[i] = CRGB::White;
    if(i<96){tvSideLeds[bigSideNumLeds + i] = CRGB::White;}
    for(int n = 0; n < NUM_LEDS; n++){
      bedSideLeds[n] = tvSideLeds[(NUM_LEDS - n)];
    }
    FastLED.show();
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

static int ist улетает в небо, унося за собой tvSideLeds[ist]

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

в #2 4 строка - до каких границ выполняется цикл ? Вы уверены что есть элементы массивов с номерами больше чем 96 и 114 ???

phivalnik
Offline
Зарегистрирован: 30.12.2021

В 4 строке массив одного отрезка ленты копируется в массив второго отрезка ленты, поэтому ограничивается максимальным количеством светодиодов на обоих отрезках. А второй вопрос не совсем понял. Массивы могут быть больше 114 элементов. А если в физическом плане, то да, ведь всего диодов 210.

phivalnik
Offline
Зарегистрирован: 30.12.2021

Понял. Но разве каждую итерацию первого for() ist не будет обнуляться? Или надо самостоятельно её обнулять(типа static int ist = 0; ist = 0;)?

b707
Offline
Зарегистрирован: 26.05.2017

phivalnik пишет:

Понял. Но разве каждую итерацию первого for() ist не будет обнуляться? Или надо самостоятельно её обнулять(типа static int ist = 0; ist = 0;)?


может возьмете учебник и прочитаете, как работает static?
Привыкайте искать информацию сами

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Если NUM_LEDS 210, то в цикле for(int n = 0; n < NUM_LEDS; n++) n будет меняться от 0 до 209. При этом bedSideLeds[209] существует ??? Куда по вашему запишутся данные, которые "не помещаются" в массив ???