Как обратиться к arbitray leds (WS2812B) в уже определенном массиве светодиодов?

Я хочу обратиться к первым и последним трем пикселям 9-пиксельной полосы и применить к ним градиент с помощью FastLED. Я могу успешно обратиться к ним, но отображаемые цвета неверны. Есть ли что-то, что я упускаю из виду или неправильно понимаю в том, как работает FastLED?

#include <FastLED.h>

// вся полоса
#define NUM_LEDS 9

#define LED_PIN 6

CRGB leds[NUM_LEDS];

// Определить индексы первого и последних 3 индексов 9-пиксельной полосы
int customLeds[6] = {0,1,2,6,7,8};

// My Palette
DEFINE_GRADIENT_PALETTE (heatmap) {
  0, 255, 0, 0,      // Red
  128, 0, 255, 0,    // Green
  255, 0, 0, 255     // Blue
};

CRGBPalette16 myPalette1 = heatmap;

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(20);
}

void loop() {
  
  for (int i = 0; i < (sizeof(customLeds)); i++) {
   //  Каждый светодиод i получает правильный цвет, учитывая его место в массиве - 0, 42.5, 85, 127.5, 170, 212.5, 255
    leds[customLeds[i]] = ColorFromPalette(myPalette1, (i * (255 / sizeof(customLeds))), 255, LINEARBLEND); 
  }
  
  FastLED.show();

}

, 👍-1

Обсуждение

Sizeof дает не количество элементов, а объем памяти, используемой массивом .., @Majenko

что это значит? ... отображаемые цвета неверны, @jsotola

Цвета пикселей должны следовать за палитрой, но в то время как они являются цветами из палитры, они правы ... они находятся по всему градиенту и не складываются линейно., @Dale Botha

Я понял свою проблему...это:(i * (255 / sizeof(customLeds)) - не работает, потому что два массива имеют разную длину! Я нахожусь в поисках решения., @Dale Botha

Пожалуйста, замените sizeof(customLeds) на sizeof(customLeds)/sizeof(customLeds[0]), чтобы фактически получить количество элементов в массиве вместо количества байтов., @chrisl

Да, чуть более элегантное решение. Я просто жестко закодировал общую сумму для удобства использования. Позже в проекте я планирую использовать это. Но, учитывая мое решение ниже, этот метод становится спорным, поскольку я использую логический массив общей длины. Отсюда мое использование жестко закодированного итога и переменной инкремента. Спасибо @chrisl, @Dale Botha


2 ответа


-1

WS2812B требует, чтобы все 9 светодиодов отправляли данные одновременно, вы не можете пропустить ни одного !

int customLeds[6] = {0,1,2,6,7,8};

При этом будут передаваться только данные первых 6 светодиодов.

,

customLeds используется только для установки цветов в светодиодах". FastLED.show() по-прежнему будет отправлять данные для всех 9 светодиодов, которые определены с помощью массива leds и NUM_LEDS`., @chrisl


1

Итак, вот ответ, который я придумал:

#include <FastLED.h>

// the whole strip
#define NUM_LEDS 9

#define LED_PIN 6

CRGB leds[NUM_LEDS];

// Define the indexes of the first and last 3 indexes of a 9 pixel strip
bool customLeds[9] = {1, 1, 1, 0, 0, 0, 1, 1, 1};
int customLeds_num = 6;


// My Palette
DEFINE_GRADIENT_PALETTE (heatmap) {
  0, 255, 0, 0,      // Red
  128, 0, 255, 0,    // Green
  255, 0, 0, 255     // Blue
};

CRGBPalette16 myPalette1 = heatmap;


void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(5);

}

void loop() {

  FastLED.clear();

  //  Keep track of how many leds have been lit
  int customLedIndex1 = 0;
  

  for (int i = 0; i < NUM_LEDS; i++) {
    // Each i led get the correct color given their place in the array  - 0, 42.5, 85, 127.5, 170, 212.5, 255

    //lights a specific pixel only if it's in the customLeds truth table
    if (customLeds[i]) {
      // works out where on the gradient a specific pixel is
      leds[i] = ColorFromPalette(myPalette1, (customLedIndex1 * (255 / 5)), 255, LINEARBLEND);

      //increments the index for the next pixels value on the gradient
      customLedIndex1++;

    }

  }

  FastLED.show();
  
  customLedIndex1 = 0;

}

Решение включало использование логического массива, который указывал, какие светодиоды должны быть включены (true / 1), а какие выключены (false / 0), а затем создавал отдельный индекс (customLedIndex), который подсчитывал, сколько светодиодов было зажжено, чтобы они могли получить правильный цвет, соответствующий их "месту" в системе. палитра

,